2013年3月8日 星期五

[Driver] - Bypass HackShield Memory Protect Driver

FileName:HsDriverBypass.sys
Auther:Secret.. Only can say he is one of my frineds
Description:It can Bypass NtOpenprocess、NtWrite、Read、ProtecVirtualMemory
Download Link:Click me
P.s.:Only supports 32Bit operating system (Win7,Xp)

2013年3月3日 星期日

[Note] - SSDT Hook 筆記 (三)

有在玩對抗HackShield_Driver的朋友一定知道:
HackShield是對nt!_SEH_prolog進行Hook(Call Hook)
來繞到自己函數進行調用對象審查(非白名單就 Return False)

今天就來公布其中一種最簡單的取得nt!_SEH_prolog的方法吧
(本來不想公布的,可是發現已經有人發出來了)

我們以NtProtectVirtualMemory來作範例(Windows7 x86 環境下)

Original:
84490403 6A 38 push   38
84490405 68 485A2A84 push   842A5A48

8449040A E8 99B7E3FF call   842CBBA8  ->  Original
8449040F FF75 14 push   dword ptr [ebp+14]
84490412 E8 CAE9E3FF call   842CEDE1
84490417 83F8 FF cmp    eax, FFFFFFFF
8449041A 75 0A jne    84490426
8449041C B8 450000C0 mov    eax, 0C0000045

...

After HS Hook:
84490403 6A 38 push   38
84490405 68 485A2A84 push   842A5A48

8449040A E8 09E28702 call   86D0E618  -> After HS Hook
8449040F FF75 14 push   dword ptr [ebp+14]
84490412 E8 CAE9E3FF call   842CEDE1
84490417 83F8 FF cmp    eax, FFFFFFFF
8449041A 75 0A jne    84490426
8449041C B8 450000C0 mov    eax, 0C0000045

...

Follow into 86D0E618:
86D0E618 E9 63BE302A jmp    B101A480 -> HS Thread
86D0E61D 90 nop
86D0E61E 90 nop
86D0E61F 90 nop
86D0E620 E9 83D55BFD jmp    842CBBA8 -> Original
86D0E625 90 nop
86D0E626 90 nop
86D0E627 90 nop

...

看到了嗎?! 


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)]