首页
社区
课程
招聘
[旧帖] SSDT hook怎么通过函数名得到服务号的? 0.00雪花
发表于: 2012-1-18 13:35 1352

[旧帖] SSDT hook怎么通过函数名得到服务号的? 0.00雪花

2012-1-18 13:35
1352
kssd里的帖子

// 根据 Zw_function 获取服务ID
#define SERVICE_ID(_function)   (*(PULONG)((PUCHAR)_function + 1))

没看懂这句怎么通过zw函数的函数名 获得 服务号的

谁能帮我解释解释…

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 71
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
明白了
2012-1-18 13:52
0
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
拿ZwQuerySystemInformation来说,在RING0下它的反汇编代码如下:
nt!ZwQuerySystemInformation:
80501ac0 b8ad000000      mov     eax,0ADh   ;把函数序号0xAD放到eax里
80501ac5 8d542404        lea     edx,[esp+4]
80501ac9 9c              pushfd
80501aca 6a08            push    8
80501acc e8b0090400      call    nt!KiSystemService (80542481)    ;nt!KiSystemService -> nt!KiFastCallEntry -> nt!NtQuerySystemInformation
80501ad1 c21000          ret     10h


结合机器码,看第一条指令
80501ac0 b8ad000000      mov     eax,0ADh

b8即是mov eax,xxxxxxxxh
后面跟着的ad000000就是函数序号了,读出来就是000000ADh
所以,函数序号就以DWORD方式保存在 Zw函数地址+1 的位置
上面那个宏正是这么做的(不懂C语言的话就得自己补补了)
*(PULONG)((PUCHAR)_function + 1)
2012-1-18 13:55
0
雪    币: 71
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
2012-1-18 14:23
0
雪    币: 639
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习了,请问Naylon
函数地址是否为80501ac0
而1正好是b8的长度
80501ac0+1就定位到了ad000000
2012-1-18 14:32
0
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
是的
不过读出来不是ad000000而是000000ADh,因为Intelx86内存组织用的是Little Endian方式
参考大端与小端简介
2012-1-18 14:48
0
雪    币: 639
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
多谢指点,现在已经非常明白了
函数序号DWORD方式保存所以低字节在前
2012-1-18 15:06
0
雪    币: 639
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
Naylon回帖非常细心,不仅有引用,连接,还标记了颜色...
2012-1-18 15:09
0
雪    币: 603
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
9
围观。。。。。。
2012-1-18 16:07
0
游客
登录 | 注册 方可回帖
返回
//