不同级别的句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html 和

时间:2022-01-28 04:59:11

解决win7下内核调试的问题

win7下debug默认无法进行内核调试(!process等命令无法使用),除非是双机调试。或改用livekd进行调试。

测验考试中提出的要领,开启windbg的内和调试成果:

不同级别的句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html 和

重启之后开启Local Kernel Debugging:

不同级别的句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html 和

不同级别的句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html 和

开启告成:

不同级别的句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html 和

加载标记表之后,就可以使用!process命令了:

不同级别的句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html 和

解决windbg源码调试的问题:

添加源文件路径:

不同级别的句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html 和

开启源码级另外调试:

不同级别的句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html 和

给TestHandle.exe的main函数下断点:

运行后自转动出源码调试:

不同级别的句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html 和

研究句柄 

再开一个windbg用内核调试。!process 0 0 命令找到TestHandle.exe的信息:

检察这个进程的所有句柄信息(同时也显示出了OBJECT的信息,来给我们供给验证):

不同级别的句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html 和

下面,借助对TestHandle.exe的调试我们知道38号句柄是hEvent:

检察0x38号句柄的信息(这个信息被我当做“功效”来验证我的“推理”过程):

推理法式

检察TestHandle的EProcess布局:

不同级别的句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html 和

得到TableCode,这个值指向一级、二级或三级句柄表(具体是几级句柄表由末尾数决定):

不同级别的句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html 和

按照低两位判断句柄表的层级。TableCode低位是1,说明是一个二级句柄表(可以参考这个文章的分析:https://www.cnblogs.com/lsh123/p/7296423.html):

 

不同级别的句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html 和

这里显示了两个一级句柄表

差别级另外句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html

和图:

不同级别的句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html 和

那么句柄值乘以4再加上fffff8a0`19ca8000就是指向对应的handle_table_entry://为什么这里要乘以4?句柄是0x38,索引就是0x38/4,又由于每个handle_table_entry的巨细是16字节。那么为什么索引是0x38/4?后面会回答

找到对应的handle_table_entry:

不同级别的句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html 和

此中fffffa80`11399951 就是Object指针,偏移0x30-1就可以定位到OBJECT:

因为是在64位系统下,所以偏移是0x30-1,偏移产生了变革(32位系统下就是0x17):

不同级别的句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html 和

这样就通过句柄取到了内查东西,整个流程思路参考了:

并参考了图片:

不同级别的句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html 和

 handle的类型

在WinNT.h中界说的handle是这样的:

typedef void* handle;

不同级别的句柄表可以参考文章:https://www.2cto.com/kf/201609/543902.html 和

而DECLARE_HANDLE(HWND);就是:

  struct HWND__ { int unused;};

  typedef struct HWND__ *HWND;

所以DECLARE_HANDLE的感化就是将name界说为一个指向布局体的指针。

handle是一个无类型指针,而HWND是一个指向布局体的指针。

Handle是一个void存储着一个整形数据类型作为“伪索引”。

参考:https://www.cnblogs.com/zpcdbky/p/4656449.html