查看文章 |
到此已经彻底明白了。哈哈,感谢kanxue和Debugman里面的2位大牛的热心帮助: --------------------------------------------------------------------------------------- 一天前的疑惑: 句柄这东西到了底层还真烦琐。HANDLE本来就是个void类型的4字节,保存指向object的指针.于是就有了 HANDLE_TABLE、HANDLE_TABLE_ENTRY、OBJECT_HEADER、 EXHANDLE
琢磨着这个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这里卡住了。不晓得具体怎么偏移才能继续搜索到下一层的表了。。。
![]() 就是这点破东西害的偶看WRK看了2天多。还是木有完全理解 这个破函数偶现在是看不明白了。糊涂的很,关键还是对这个3层表没有理解正确。里面一会儿求余、一会儿整除的,搞糊涂了。要是哪位牛牛能给偶解释下就好了。
PUCHAR TableLevel1; ULONG_PTR MaxHandle; PAGED_CODE(); Handle = tHandle; // 判断当前句柄是否有效 // // 有3种情况: 0、1、2 TableLevel1 = (PUCHAR) CapturedTable; // 就一层表。这层表中保存的就是一堆HANDLE_TABLE_ENTRY break; // 有2层表:上层 和 下层 [中层为空] // 上层开始处偏移j后指向的是下层的开始处 TableLevel1 = (PUCHAR) *(PHANDLE_TABLE_ENTRY *) &TableLevel2[j]; break; 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);
break; default : return Entry; 附件
|



。哎,等以后脑子清醒了再看吧。标记之: