程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 穿透還原的工作原理分析(逆向工程)--機器狗

穿透還原的工作原理分析(逆向工程)--機器狗

編輯:.NET實例教程

文章末尾所添加的機器狗、IGM、寫穿還原的工具(已可以被卡巴檢測到是病毒)是在無敵小龍那裡看到的,我加了個備用地址。

樣本脫殼
OD加載樣本explorer.exe,
對GetModuleHandleA下斷,參數為NULL時即為入口點處對此函數的調用,
退出CALL之後可以得到入口為 004016ED。
重新加載樣本,對004016ED下內存寫入斷點,中斷後StepOver一步,然後在004016ED
下斷點,F9運行到入口,DUMP。DUMP之後不關閉OD,讓樣本處於掛起狀態,使用ImportREC修復DUMP
出來的文件的導入表。
修復之後DUMP出來的文件用OD加載出錯,使用PEDITOR的rebuilder功能重建PE之後即可用OD加載,說明脫殼基本成功,但資源部分仍有問題,無法用Reshacker查看

pcihdd.sys的提取
OD加載樣本explorer.exe,設置有新模塊加載時中斷,F9運行
當ADVAPI32.DLL加載時,對CreateServiceA下斷點,F9運行
當CreateServiceA中斷時,即可提取出pcihdd.sys

pcihdd.sys基本流程如下
1)檢查IDT的09(NPX Segment Overrun)和0E(Page Fault )處理程序的地址
如果09號中斷處理程序存在,並且處理程序地址的高8位與0E處理程序高8位不同,則把IDT中0E的高16位設為0。估計是檢查0E是不是被HOOK了,我比較龌龊,看不懂這些操作的意思,這樣不BSOD?請懂的兄弟跟帖告訴一聲
2)通過搜索地址來查找自己的加載地址
查找驅動文件的資源中的1000/1000,並復制到一個全局緩沖區中
3)創建了\Device\PhysicalHardDisk0及其符號連接\DOSDevices\PhysicalHardDisk0
4)只對IRP_MJ_CREATE
IRP_MJ_CLOSE
IRP_MJ_DEVICE_CONTROL
作出響應

其中IRP_MJ_CREATE中會斷開\Device\Harddisk0\DR0上附加的設備。這個操作會使磁盤過濾驅動、文件系統驅動(OS提供的,但一些殺毒軟件也通過此渠道進行文件系統監控)及其上的文件系統過濾驅動(大多數文件訪問控制和監控都是這個層次的)無效(參見http://blog.csdn.Net/joshua_yu/archive/2006/02/04/591636.ASPx)

在IRP_MJ_CLOSE 中對恢復DR0上的附加

在IRP_MJ_DEVICE_CONTROL中對0xF0003C04作出響應,只是把2)中找到的資源數據解密後返回到應用程序。
解密密鑰是通過應用程序傳入的一個串(密鑰種子?)查表後產生(KEY:0x3f702d98)

0xF0003C04的作用:
將用戶態傳入的整個代碼體作為密鑰種子對這個代碼體進行類似於校驗和的運算後得
到4字節的解密KEY,然後使用此解密key將驅動自身攜帶的資源解密(僅僅是XOR),將解密
結果返回給用戶態。

關於解除DR0上的附加設備:
這種操作應該會影響系統正常的文件系統操作,但是因為實際操作時此驅動被打開和關閉的的間隔很短,所以應該
不會有明顯影響。

explorer.exe流程
1、釋放資源中的pcihdd.sys並創建名為pcihdd的服務,啟動服務
2、定位userinit.exe在硬盤中的位置。定位方法如下
1)通過FSCTL_GET_RETRIEVAL_POINTERS獲取文件數據的分布信息

2)通過直接訪問硬盤(\\\\.\\PhysicalHardDisk0)的的MDR和
第一個分區的引導扇區得到分區參數(每簇扇區數),配合1)中得到的信息
來定位文件在硬盤上的絕對偏移量。
這裡有個小BUG,扇區大小是使用固定的512字節而不是從引導扇區中獲取

3)通過對比ReadFile讀取的文件數據和自己定位後直接
讀取所得到的文件

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved