首页
社区
课程
招聘
[求助]获得SSDT中函数的地址
发表于: 2008-12-31 10:45 4635

[求助]获得SSDT中函数的地址

2008-12-31 10:45
4635
近日在学习:
http://bbs.pediy.com/showthread.php?t=42422&highlight=%E5%BF%85%E5%A4%87+%E5%A4%87%E7%BB%9D+%E7%BB%9D%E6%8A%80+Hook+%E5%A4%A7%E6%B3%95

基本原理明白了,但有个别细节不懂:

#define SYSTEMSERVICE(_func) \
          KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_func+1)]
  
#define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1)

SYSTEMSERVICE macro:可以获得由ntoskrnl.exe导出函数,以Zw*开头函数的地址,这个函数的返回值就是Nt*函数,Nt*函数的地址就在SSDT中

SYSCALL_INDEX macro:获得Zw*函数的地址并返回与之通信的函数在SSDT中的索引。

这两个宏之所以能工作,是因为所有的Zw*函数都开始于opcode:MOV eax, ULONG,这里的ULONG就是系统调用函数在SSDT中的索引。

请教下*(PULONG)((PUCHAR)_func+1)为什么能够获取MOV eax, ULONG中的ULONG呢?
小弟底层功底太浅,麻烦大家给讲解一下。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
怎么没人回贴呀,顶一下!
2009-1-1 08:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
貌似没人回答这个比较难以描述的问题,偶通过查找资料,有所感悟,现写出来,麻烦大家给判断下对还是错:

举例:
MOV AX,1234 对应的机器码为:B8 34 12

我贴子里说了,"所有的Zw*函数都开始于MOV eax, ULONG"

所以Zw函数的第0个字节为B8(偶知道C/C++计数由0起始),而第一个字节起始的一个ULONG长度的数据,就是我们要找的ULONG了:), 所以才有了那个两宏 。

请问我分析的对不对?
2009-1-1 09:18
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
4
16位的指令集?
32位的是不是在前面加前缀66啊?
2009-1-1 12:45
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
5
机器指令被按照16位程序还是32位程序解释,取决于CS选择子指向的段描述符中的属性位。

看一下GDT、LDT等相关资料,注意Descriptor的定义,其中有一个D/B的位就是干这个的。

查指令表,0xB8是“mov eAX,Iv”

对16位代码,mov ax, 0x1234机器码是0xb8,0x34,0x12(注意little endian的字节顺序)

对32位代码,mov eax,0x12345678机器码是0xb8,0x78,0x56,0x34,0x12

原来的问题中,只要知道mov eAx,Iv这条指令的结构是 “主操作码+立即数”即可得出*(PULONG)((PUCHAR)_func+1)这个表示方法。

补充一下,狐狸说的0x66前缀叫做“操作数大小切换前缀(OprandSizePrefix)”,用来在16位代码中临时执行操作数为32位的指令,或在32位代码中临时执行操作数大小为16位的指令。比如假设目前是在一个16位的段中执行代码,需要临时访问32位的EAX寄存器,那么可以在0xB8前面加上0x66,处理器会将其译码成为一个32位指令,所以会使用EAX寄存器,同时会从0xB8读取4个字节为立即数,而不是(本来的)2个字节。
2009-1-1 12:57
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
6
这些方法在以后的OS不知适不适用?
2009-1-1 13:13
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
7
OPCODE HACK本来就是硬编码的,灵活性极差。

如果想要通用一些,那就必须用反汇编引擎来分析代码了。
2009-1-1 13:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
^^ 感谢各位大虾的指点!特别是"书呆彭"讲的很详细透彻,小弟收藏了,还请大家以后继续关照
2009-1-2 14:52
0
游客
登录 | 注册 方可回帖
返回
//