首页
社区
课程
招聘
[求助]SSDT恢复的一点疑问
发表于: 2010-10-15 10:37 5599

[求助]SSDT恢复的一点疑问

2010-10-15 10:37
5599
SSDT恢复是从内核文件中读取KiServiceTable获取干净的SSDT,我们做SSDT HOOK时是修改的从文件中导出的KeServiceDescriptorTable,那我可不可以这么理解:系统正常运行使用的是
KeServiceDescriptorTable,KiServiceTable是不能修改的?
知道的筒子请指点一下,谢谢了!

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
KiServiceTable其实是KeServiceDescriptorTable的关键部分。。。
2010-10-16 18:30
0
雪    币: 179
活跃值: (26)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
KeServiceDescriptorTable 这个结构中包含了4个KiServiceTable。
通常用到的是第一个。楼主可以看看下面的定义

typedef struct _SERVICE_DESCRIPTOR_TABLE
{
    SYSTEM_SERVICE_TABLE ntoskrnel;    //ntoskrnl.exe的服务函数
    SYSTEM_SERVICE_TABLE win32k;    //win32k.sys的服务函数,(gdi.dll/user.dll的内核支持)
    SYSTEM_SERVICE_TABLE NotUsed1;
    SYSTEM_SERVICE_TABLE NotUsed2;
}SYSTEM_DESCRIPTOR_TABLE,*PSYSTEM_DESCRIPTOR_TABLE;

上面的是系统服务描述符表,里面包含了四个系统服务表,是不是有点绕口,我觉得是比较绕口。
下面是系统服务表
typedef struct _SYSTEM_SERVICE_TABLE
{
    PVOID ServiceTableBase;    //这个指向系统服务函数地址表
    PULONG ServiceCounterTableBase;
    ULONG NumberOfService;     //服务函数的个数,NumberOfService*4 就是整个地址表的大小
    ULONG ParamTableBase;
}SYSTEM_SERVICE_TABLE,*PSYSTEM_SERVICE_TABLE;

另外关于楼主说的修复SSDT表我是这样理解的,不知道对不对。

我们Hook SSDT的时候修改的是内存中的SSDT表,而这个表是从Kernel32.dll中加载的,也就是说内存中的
所有东西在Kernel32.dll这个文件中是有备份的,注意是硬盘上的"文件",而不是已经加载到内存的那个Kernel32.dll。恢复的时候只需要分析硬盘上的这个Kernel32.dll就可以获取到原始的函数地址,这样就可以恢复了。
2010-10-18 11:03
0
雪    币: 135
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢楼上的两位,明白了!
2010-10-18 20:06
0
游客
登录 | 注册 方可回帖
返回
//