首页
社区
课程
招聘
SSDT HOOK问题.
发表于: 2010-3-1 14:05 2920

SSDT HOOK问题.

2010-3-1 14:05
2920
初学驱动.因为用汇编编写驱动的资料太少。所以很多问题不知道怎么解决。下面是段关于HOOK的代码。希望高手帮忙解决下小弟心中的疑惑。

代码:
NtHookSSDT         proc        

        pushad       
        mov eax,KeServiceDescriptorTable
        mov esi,[eax]
        mov esi,[esi]                       
        invoke MmGetSystemRoutineAddress,$CCOUNTED_UNICODE_STRING("ZwOpenProcess")

        inc eax
        movzx ecx,byte ptr[eax]

        sal ecx,2                               
        add esi,ecx
        mov dwZwOpenProcess_Addr,esi       
        mov edi,dword ptr[esi]               
        mov OriginalZwOpenProcess,edi               
       
       
        mov edi,offset NewZwOpenProcess               
        cli                                       
        mov eax,cr0
        xor eax,10000h
        mov cr0,eax
       
                mov dword ptr[esi],edi               
       
                mov eax, cr0
                xor eax,10000h
                mov cr0, eax
                sti

        popad
        ret                               
NtHookSSDT         endp       

这段代码的开头是:mov eax,KeServiceDescriptorTable,mov esi,[eax] .mov esi,[esi]
在ntoskrnl.inc头文件中 KeServiceDescriptorTable的定义只有一句:KeServiceDescriptorTable PROTO C       完全不明白是什么意思     后面的       
invoke MmGetSystemRoutineAddress,$CCOUNTED_UNICODE_STRING("ZwOpenProcess")
        inc eax
        movzx ecx,byte ptr[eax]
        sal ecx,2                               
        add esi,ecx
        mov dwZwOpenProcess_Addr,esi                       
        mov edi,dword ptr[esi]                       
        mov OriginalZwOpenProcess,edi
也不明白是什么意思 sal ecx,2  这句应该是获取函数在SSDT中的偏移量。 那add esi,ecx又是什么意思呢?     喜欢高手能帮帮小弟。解释一下代码的意思 ..先谢过了

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

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 75
活跃值: (803)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
NtHookSSDT   proc   

  pushad  
  mov eax,KeServiceDescriptorTable
  mov esi,[eax]
  获得KeServiceDescriptorTable结构
  mov esi,[esi]
   获得KeServiceDescriptorTable.ServiceTableBase的地址   
  invoke MmGetSystemRoutineAddress,$CCOUNTED_UNICODE_STRING("ZwOpenProcess")

  inc eax
  movzx ecx,byte ptr[eax]
  获得"ZwOpenProcess"的系统服务号 i

  sal ecx,2        
  add esi,ecx ( KeServiceDescriptorTable.ServiceTableBase + ecx * 4) 获得ZwOpenProcess的函数地址
  mov dwZwOpenProcess_Addr,esi  
  mov edi,dword ptr[esi]   
  mov OriginalZwOpenProcess,edi   
  
  
  mov edi,offset NewZwOpenProcess   
  cli         
  mov eax,cr0
  xor eax,10000h
  mov cr0,eax
  
                mov dword ptr[esi],edi   
  
                mov eax, cr0
                xor eax,10000h
                mov cr0, eax
                sti

  popad
  ret        
NtHookSSDT   endp  

把上面这段程序给你转换成 C吧
        RtlInitUnicodeString (&TempName, L"ZwOpenProcess");
                Address = MmGetSystemRoutineAddress( &TempName);
                SsdtIndex = *(PULONG)((PUCHAR)Address +1);
                OriginalZwOpenAddress = KeServiceDescriptorTable.ServiceTableBase + SsdtIndex * 4;

#pragma pack(1)
typedef struct ServiceDescriptorEntry {
        unsigned int *ServiceTableBase;
        unsigned int *ServiceCounterTableBase; //Used only in checked build
        unsigned int NumberOfServices;
        unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
extern PServiceDescriptorTableEntry_t KeServiceDescriptorTable
#pragma pack()
2010-3-1 14:32
0
雪    币: 56
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
汇编资料太少了。 完全不明白什么意思  你这么一说我懂了 谢谢你。分就全给你吧   下次
2010-3-1 14:37
0
游客
登录 | 注册 方可回帖
返回
//