首页
社区
课程
招聘
[求助]初学者关于ssdt的小问题[asm]
发表于: 2009-4-11 20:32 4726

[求助]初学者关于ssdt的小问题[asm]

2009-4-11 20:32
4726
HookFunction        proc

                    pushad
;      int 3
;      invoke DbgPrint, $CTA0("\nEntry into hoookfunction\n")
                    ;下面是用KeServiceDescriptorTabled导出符号获得数组的基地址,这个数组中包含有NtXXXX函数的入口地址。
      mov eax, [KeServiceDescriptorTable]
             mov esi, [eax]
          mov esi, [esi]
                    ;下面五句为获取ZwQuerySystemInformation的地址
      mov eax,ZwQuerySystemInformation
      inc eax
      inc eax
      mov eax,[eax]
      mov eax,[eax]
      inc eax
      movzx ecx,byte ptr[eax]
      sal ecx,2                   
      add esi,ecx
      mov dwAddr,esi 
      mov edi,dword ptr[esi]
      ;保存旧的函数地址。
      mov dwOldNtQuerySystemInformation,edi
                    mov edi,offset NewNtQuerySystemInformation
      ;修改入口地址
      cli
      mov dword ptr[esi],edi
      sti
      popad
                    mov eax, STATUS_SUCCESS

      ret

HookFunction     endp

代码我编译过 能正常运行

获取ZwQuerySystemInformation的服务号我不明白 为什么
      mov eax,ZwQuerySystemInformation
      inc eax
      inc eax
      mov eax,[eax]
      mov eax,[eax]
会有2次      mov eax,[eax]  我用windbg看了

lkd> u ZwQuerySystemInformation
nt!ZwQuerySystemInformation:
804feff8 b8ad000000      mov     eax,0ADh

直接一次
      inc eax
      inc eax
      mov eax,[eax]
就应该能取出来的呀 后面哪个是

哪位能写出每次寄存器取值的变化  

多谢帮忙 虽然没人RMB 但是祝福以后大家三妻四妾

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 419
活跃值: (10)
能力值: ( 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==就是你想要的
2009-4-11 21:16
0
雪    币: 722
活跃值: (123)
能力值: ( 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
2009-4-11 21:27
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
先谢 再看 在吃东西~不方便
2009-4-11 21:32
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
原来 是这样 感谢一 二楼 感谢咯
2009-4-11 22:14
0
游客
登录 | 注册 方可回帖
返回
//