2013年3月1日 星期五

[Note] - SSDT Hook 筆記 (二)

上一篇是在Ring3 用工具取得服務號 但每個系統的服務號(硬編碼)不可能都相同
所以這篇教大家在Driver中動態取得函數服務號和SSDT函數位子

in ring0:
lkd> u nt!ZwOpenProcess
nt!ZwOpenProcess:
804de044 b87a000000 mov eax,7Ah  ---> 這就是服務號
804de049 8d542404 lea edx,[esp+4]
804de04d 9c pushfd
804de04e 6a08 push 8
804de050 e8dc150000 call nt!KiSystemService (804df631)
804de055 c21000 ret 10h


lkd> u nt!NtOpenProcess
nt!NtOpenProcess:
80573d06 68c4000000 push 0C4h
80573d0b 6810b44e80 push offset nt!ObWatchHandles+0x25c (804eb410)
80573d10 e826f7f6ff call nt!_SEH_prolog (804e343b)
80573d15 33f6 xor esi,esi
80573d17 8975d4 mov dword ptr [ebp-2Ch],esi
80573d1a 33c0 xor eax,eax
80573d1c 8d7dd8 lea edi,[ebp-28h]
80573d1f ab stos dword ptr es:[edi]

可以看得出,ZwOpenProcess函数很短,首先把0x7a(NtOpenProcess的服务号)存入eax,然后做一些保存现场的工作即KiSystemService——这个函数根据eax中的service id在SSDT中查找相应的系统服务,然后调用之。


所以我們在驅動中常會使用

#define GetIndex(_Function) *(PULONG)((PUCHAR)_Function+1)
來取得函數的服務號 (注意_Function需填入Zw開頭函數而非Nt)

甚至更進階一點讓我們直接獲得函數位子
#define GetSystemFunc(FuncName) KeServiceDescriptorTable.ServiceTableBase[*(PULONG)((PUCHAR)FuncName+1)]


沒有留言:

張貼留言