注册
登录
论坛
搜索
插件
默认风格
默认风格_6hOY
D Dark
greenwall
jeans
fashion
私人消息 (0)
公共消息 (0)
论坛任务 (0)
系统消息 (0)
好友消息 (0)
帖子消息 (0)
【3.A.S.T】网络安全爱好者
»
技术交流
» [讨论]句柄啊,3层表啊,ExpLookupHandleTableEntry啊...[已解决]
返回列表
发帖
wlfjck
发短消息
加为好友
wlfjck
当前离线
UID
1228
帖子
209
精华
0
积分
550
威望
886
金钱
697
阅读权限
70
在线时间
1 小时
注册时间
2008-7-16
最后登录
2009-2-13
3.A.S.T少校
帖子
209
积分
550
威望
886
金钱
697
在线时间
1 小时
1
楼
跳转到
»
正序看帖
打印
字体大小:
t
T
发表于 2008-7-24 17:24
|
只看该作者
[讨论]句柄啊,3层表啊,ExpLookupHandleTableEntry啊...[已解决]
句柄
,
解决
,
讨论
[讨论]句柄啊,3层表啊,ExpLookupHandleTableEntry啊...[已解决]
文章作者:sudami
信息来源:邪恶八进制信息安全团队(
www.eviloctal.com
)
句柄这东西到了底层还真烦琐。HANDLE本来就是个void类型的4字节,保存指向object的指针.于是就有了
HANDLE_TABLE、HANDLE_TABLE_ENTRY、OBJECT_HEADER、 EXHANDLE
_EXHANDLE.gif
(5 KB)
2008-1-8 21:27
琢磨着这个EXHANDLE,它里面的Index保存着3层表索引。通过它,也就是EXHANDLE。Value 的后30位. 可以找到进程ID指向的object
关于这个3层表,“JIURL玩玩Win2k进程线程篇 HANDLE_TABLE”一文中也有比较详细的介绍,可惜是W2K滴, HANDLE_TABLE在XP中发生了变化,不过其中的第一个参数保存的内容仍然是指向HANDLE_TABLE_ENTRY,不过是要经过索引偏移后才能得到.
开始还准备用Windbg探索下这个3层表,发现困难重重 ---
准备搞下QQ进程中的HANDLE_TABLE,一张图接着一张图后,到 TableCode这里卡住了。不晓得具体怎么偏移才能继续到下一层的表了。。。
Snap2.gif
(2 KB)
2008-1-8 21:27
Snap3.gif
(9 KB)
2008-1-8 21:27
Snap4.gif
(6 KB)
2008-1-8 21:27
Snap5.gif
(6 KB)
2008-1-8 21:27
就是这点破东西害的偶看WRK看了2天多。还是木有完全理解。哎,等以后脑子清醒了再看吧。标记之:
d.gif
(7 KB)
2008-1-8 21:27
这个破函数偶现在是看不明白了。糊涂的很,关键还是对这个3层表没有理解正确。里面一会儿求余、一会儿整除的,搞糊涂了。要是哪位牛牛能给偶解释下就好了。
复制内容到剪贴板
代码:
PHANDLE_TABLE_ENTRY
ExpLookupHandleTableEntry (
IN PHANDLE_TABLE HandleTable,
IN EXHANDLE tHandle
)
{
// 一大堆局部变量
ULONG_PTR i,j,k;
ULONG_PTR CapturedTable;
ULONG TableLevel;
PHANDLE_TABLE_ENTRY Entry = NULL;
EXHANDLE Handle;
PUCHAR TableLevel1;
PUCHAR TableLevel2;
PUCHAR TableLevel3;
ULONG_PTR MaxHandle;
PAGED_CODE();
Handle = tHandle;
Handle.TagBits = 0;
MaxHandle = *(volatile ULONG *) &HandleTable->NextHandleNeedingPool;
// 判断当前句柄是否有效
if (Handle.Value >= MaxHandle) {
return NULL;
}
//
// 得到当前的索引等级 -- 即 CapturedTable 的最后2位
// 而 (CapturedTable - TableLevel) 便是这个3层表的起始地址。
// 通过Handle.Value中的后30位保存的索引号,找到进程ID对应的HANDLE_TABLE_ENTRY
//
CapturedTable = *(volatile ULONG_PTR *) &HandleTable->TableCode;
TableLevel = (ULONG)(CapturedTable & 3);
CapturedTable -= TableLevel;
// 有3种情况: 0、1、2
switch (TableLevel) {
case 0:
TableLevel1 = (PUCHAR) CapturedTable;
// 就一层表。这层表中保存的就是一堆HANDLE_TABLE_ENTRY
// 索引号*2 得到在其中的偏移量
Entry = (PHANDLE_TABLE_ENTRY) &TableLevel1[Handle.Value * 2];
break;
case 1:
TableLevel2 = (PUCHAR) CapturedTable;
// 有2层表:上层 和 下层 [中层为空]
// 和2KB求余后,i保存的是在下层表中的索引
i = Handle.Value % (2 * 1024);
// 上层开始处偏移j后指向的是下层的开始处
Handle.Value -= i;
j = Handle.Value / ((2 * 1024) / 8);
TableLevel1 = (PUCHAR) *(PHANDLE_TABLE_ENTRY *) &TableLevel2[j];
Entry = (PHANDLE_TABLE_ENTRY) &TableLevel1[i * 2];
break;
case 2:
TableLevel3 = (PUCHAR) CapturedTable;
i = Handle.Value % (2 * 1024);
Handle.Value -= i;
k = Handle.Value / ((2 * 1024) / 8);
j = k % (4 * 1024);
k -= j;
k = k / (1024 / 2);
TableLevel2 = (PUCHAR) *(PHANDLE_TABLE_ENTRY *) &TableLevel3[k];
TableLevel1 = (PUCHAR) *(PHANDLE_TABLE_ENTRY *) &TableLevel2[j];
Entry = (PHANDLE_TABLE_ENTRY) &TableLevel1[i * 2];
break;
default :
_assume (0);
}
return Entry;
}WINDOWS内核疯狂爱好者
帖子242 精华
6
积分5536 阅读权限150 性别男 在线时间1113 小时 注册时间2007-1-10 最后登录2008-7-23
查看个人网站
查看详细资料
TOP
赚更多的钱
sudami
大米米
运维管理组
收藏
分享
返回列表
【 新 手 入 门 】
初入江湖
有问必答
软件交流
程序设计
黑客播报
操作系统
Windows专区
Unix 专区
【 技 术 交 流 】
原创专区
QQ技巧
反黑知识
网站建设
教程发布
技术交流
免杀技术
0day发布
专题归类
私服技术
【 论 坛 水 区 】
被黑站点
激情灌水
极品贴图
开心乐园
影音专区
广告专区
【 论 坛 管 理 】
新人报到
论坛管理
勋章申请
[收藏此主题]
[关注此主题的新回复]
[通过 QQ、MSN 分享给朋友]
全国地图
@@@ 加入本站会员 一个月月赚1200+的秘密@@@