首页
社区
课程
招聘
[求助]作一干净的SSDT表替换原表的问题
发表于: 2008-8-31 19:29 6155

[求助]作一干净的SSDT表替换原表的问题

2008-8-31 19:29
6155
XP系统上
调用WINDOWS API后
最终由SYSENTER指令从ring3进入ring0
然后根据被请求服务的系统调用号在SSDT表上找到
相应的服务例程

小弟不理解的就是系统怎么找到这个张SSDT表的?
我能不能作一张干净完整的SSDT表,没有被修改过的。

然后让系统用我的新表

也就是把原SSDT表替换了

最头疼的是怎么才能让系统用我的新表
在我的表上寻找相应的服务例程

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
2
从文件ntoskrnl.exe读出原始表,然后在内存中恢复
2008-8-31 19:49
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
3
貌似是和System Service Interrupt有关。
你HOOK 0x2e看看能不能转接到你自己建立的SSDT表中。

偶也没弄过,不是很清楚,说错了就当是胡扯
2008-8-31 19:58
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
同意大米。

虽然我也不懂。

不过去弄中断这个思路应该是可行的。
2008-8-31 20:22
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
5
我知道你懂的~~



是不是KiSystemService啊?
2008-8-31 20:34
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
hook sysenter然后自己处理?
2008-8-31 23:13
0
雪    币: 48
活跃值: (491)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
<<Rootkits: Subverting the Windows Kernel >>中只说到这
“较新版本的Windows系统不再用INT 2E或通过IDT来请求系统调用表中的服务。而是使用快速调用方法(fast call method)。在这种方法中,NTDLL向EAX寄存器中加载被请求服务的系统调用号,向EDX寄存器中加载当前堆栈指针ESP。然后发出Intel指令SYSENTER。

SYSENTER指令将控制权传递给模型相关寄存器(Model-Specific Register,MSR)IA32_SYSENTER_EIP中指定的地址。可以读写该寄存器,但它是一条特权指令,这意味着必须从环0级别上执行该指令。

以下是一个简单的驱动程序,它读取IA32_SYSENTER_EIP的值,将其存储在一个全局变量中,然后将钩子地址填充到该寄存器中。MyKiFastCallEntry钩子只是跳转到原始的函数,不执行其他任何工作。这是钩住SYSENTER控制流程所需的第一步。

至于系统下面是怎么执行并找到SSDT表就不清楚了
2008-9-1 09:19
0
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
8
SSDT的地址在NTOSKRNL初始化的时候被存入MSR了,对这个感兴趣的话可以反汇编NTOSKRNL看一下
虽然可以替换整张表,但理论上rootkit同样可以欺骗检查SSDT的动作或是保护hook过的SSDT
这个游戏先入者占有理论上的优势,但是如果有针对性的分析也总能找到相应的手段绕过
2008-9-1 09:40
0
雪    币: 48
活跃值: (491)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
看来还是先反汇编NTOSKRNL看一下
2008-9-1 12:57
0
游客
登录 | 注册 方可回帖
返回
//