本人只是业余爱好,勿喷,有兴趣的看。懂的也就没必要看了。
希望能结交更多的朋友,不论技术如何,在下都愿意一起分享学习。
肯定有错的地方,希望大家指出,下面只是概念性东西。希望能给和我一样菜的朋友看下。看书上或者资料介绍的很繁琐感觉,我这算大白话吧。因为业余也没想系统学习,所以朋友给我科普了下,在这里谢谢下他。
说了这么多废话看笔记吧。
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