能力值:
( LV2,RANK:10 )
|
-
-
2 楼
明白了
|
能力值:
( 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)
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
学习了,请问Naylon
函数地址是否为80501ac0
而1正好是b8的长度
80501ac0+1就定位到了ad000000
|
能力值:
( LV7,RANK:100 )
|
-
-
6 楼
是的
不过读出来不是ad000000而是000000ADh,因为Intelx86内存组织用的是Little Endian方式
参考 大端与小端简介
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
多谢指点,现在已经非常明白了
函数序号DWORD方式保存所以低字节在前
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
Naylon回帖非常细心,不仅有引用,连接,还标记了颜色...
|
能力值:
( LV9,RANK:140 )
|
-
-
9 楼
围观。。。。。。
|
|
|