SSDT笔记。(System Services Descriptor Table)

妖精的绣舞 提交于 2019-11-26 19:35:51

本人只是业余爱好,勿喷,有兴趣的看。懂的也就没必要看了。

希望能结交更多的朋友,不论技术如何,在下都愿意一起分享学习。

肯定有错的地方,希望大家指出,下面只是概念性东西。希望能给和我一样菜的朋友看下。看书上或者资料介绍的很繁琐感觉,我这算大白话吧。因为业余也没想系统学习,所以朋友给我科普了下,在这里谢谢下他。

说了这么多废话看笔记吧。

r0的inline hook 其实理论上和 r3的 我感觉差不多。(自己的看法)

OpenProcess(kernel32.dll)->NtOpenProcess(ntdll.dll)->NtOpenProcess(ssdt kernel api address)->real NtOpenProcess Address

首先是SSDT的结构

 typedef struct _SYSTEM_SERVICE_TABLE

  {

  PVOID ServiceTableBase; //这个指向系统服务函数地址表

  PULONG ServiceCounterTableBase;

  ULONG NumberOfService; //服务函数的个数

  ULONG ParamTableBase;//参数表 

  }SYSTEM_SERVICE_TABLE,*PSYSTEM_SERVICE_TABLE;

这里使用OpenProcess做例子。

OD调试 Ctrl+G 直接跳到 OpenProcess。

7C830A2C FF15 1C11807C CALL DWORD PTR DS:[<&ntdll.NtOpenProcess>] ; ntdll.ZwOpenProcess

 回车进入

7C92D5FE > B8 7A000000 MOV EAX,7A
7C92D603 BA 0003FE7F MOV EDX,7FFE0300
7C92D608 FF12 CALL DWORD PTR DS:[EDX]

 

第一条。7A是ZwOpenProcess在 SSDT表里面的索引号。  SSDT 一共有 11c H个服务函数。(0-283)

咱们用工具看下。

没错吧?知道了索引号 然后使用Windbg。

Open- Kernel debug- local 挂上本机。

 

在命令行输入 dd nt!KeServiceDescriptorTable

lkd> dd nt!KeServiceDescriptorTable
8055d700  80505494 00000000 0000011c 80505908
8055d710  00000000 00000000 00000000 00000000
8055d720  00000000 00000000 00000000 00000000
8055d730  00000000 00000000 00000000 00000000
8055d740  00000002 00002710 bf80c321 00000000
8055d750  b9598a80 b8f0db60 8a514538 806f80c0
8055d760  00000000 00000000 ffeced30 ffffffff
8055d770  02299df0 01cd34b1 00000000 00000000

80505494 00000000 0000011c 80505908 找四个值就是 SSDT结构的值了。

ServiceTableBase==80505494 

NumberOfService==11c

ParamTableBase==80505908

7A是NtOpenProcess的索引号。80505494是指针,指向函数表的地址.

 

然后使用dd 80505494+0x7a*4 (*4 是因为 表里面的地址存放是 11cH个dword)

lkd> dd 80505494+0x7a*4
8050567c  805cc456 805eef26 805eeb8a 805ab3f4
8050568c  80616046 805c4be8 805cc6e2 805eef44
8050569c  805eecfa 80617f80 80646c0e 805ca508
805056ac  805f930a 805f4f30 805f511c 805b9426
805056bc  80610004 80577ef4 80617e50 80617e50
805056cc  80540c2e 80611bf6 80612856 8057ae82
805056dc  805bf65a 8057b1d0 806100cc 80578048
805056ec  806170ca 8057ba3c 805d6cbc 805a63ec

805cc456就是ZwOpenProcess 入口地址了。

lkd> u 805cc456 
nt!NtOpenProcess:
805cc456 68c4000000      push    0C4h
805cc45b 68c0b44d80      push    offset nt!FsRtlLegalAnsiCharacterArray+0x2010 (804db4c0)
805cc460 e88b07f7ff      call    nt!wctomb+0x45 (8053cbf0)
805cc465 33f6            xor     esi,esi
805cc467 8975d4          mov     dword ptr [ebp-2Ch],esi
805cc46a 33c0            xor     eax,eax
805cc46c 8d7dd8          lea     edi,[ebp-28h]
805cc46f ab              stos    dword ptr es:[edi]

如果需要inline hook这里5字节就可以了。

805cc456 68c4000000      push    0C4h

转载于:https://www.cnblogs.com/yueyue184/archive/2012/05/19/2508568.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!