能力值:
( LV2,RANK:10 )
|
-
-
2 楼
mov eax,ZwQuerySystemInformation eax == 000105E2
inc eax
inc eax eax == 000105E4
mov eax,[eax] eax == 00010604
mov eax,[eax] eax == 地址
.text:000105E2 FF 25 04 06 01 00 jmp ds:__imp_ZwQuerySystemInformation
如果要一次取地址
请这样弄 EXTRN _imp__ZwQuerySystemInformation@16:NEAR
mov eax,dword ptr [_imp__ZwQuerySystemInformation@16] eax==就是你想要的
|
能力值:
( LV12,RANK:300 )
|
-
-
3 楼
其实楼主用IDA把驱动反汇编一下,就知道这个的意思了。
原文中的:
mov eax,ZwQuerySystemInformation
编译后其实得到的是像这样一个指令:
mov eax, offset loc_10484
loc_10484:
FF 25 E0 04 01 00 jmp ds:ZwQuerySystemInformation
其实这一句,如果没有符号的话,应该反汇编成:
FF 25 E0 04 01 00 jmp dword ptr [001004E0]
也就是说,这里mov eax,ZwQuerySystemInformation中的ZwQuerySystemInformation被编译成了一条通过IAT,jmp向ZwQuerySystemInformation函数的指令
所以,以下几句的寄存器情况(以上面那个指令地址为例)
mov eax,ZwQuerySystemInformation;这里得到jmp指令地址,0010484
inc eax
inc eax ;这里eax变成了0010486
mov eax,[eax] ;取出此处的DWORD值,也就是IAT项位置,这里是001004E0
mov eax,[eax] ;取出IAT项中的函数地址,也即是windbg中查到的804feff8
inc eax ;加上1,这样指向的是那个AD000000,即DWORD值0ADh
movzx ecx,byte ptr[eax] ;把0ADh扩展放到ecx,这样ecx=000000ADh
接下来的楼主就应该明白了。
楼主如果不想采用这种方式,除像楼上那样直接用lib中的符号外,还可以动态获取ZwQuerySystemInformation函数的地址;
.data
CCOUNTED_UNICODE_STRING "ZwQuerySystemInformation", g_ProcName, 4;UNICODE_STRING常量,函数名
.code
……
invoke MmGetSystemRoutineAddress, offset g_ProName;直接得到函数地址,调用后eax为函数地址,即804feff8
inc eax;加1,指向DWORD值0ADh
movzx ecx,byte ptr[eax];ecx=000000ADh
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
先谢 再看 在吃东西~不方便
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
原来 是这样 感谢一 二楼 感谢咯
|
|
|