惡意軟件反調試分析的對抗技術
在本文中,我們會介紹惡意軟件如何利用一個打包的Exe原始入口點來欺騙結構化異常處理程序(SEH)。
在此,我們會拿一個名為sample.exe的惡意軟件樣本進行具體講解,首先將其加載到ExeInfo,進行打包。
注意入口點是28E8,此外,我們開始調試它的時候,為了確保不被ASLR檢查到并避免稍后出現的動態加載,看看DLL的特點,就可以看到這個DLL不能移動。
現在將該sample.exe示例加載到OllyDBG中,它向我們提供了一個信號,即代碼可以被壓縮,以下是我們之前看到的。
一旦樣本加載到OllyDBG中,它將開始在Unpacker代碼中運行,由于手動逐步執行此代碼將需要很多時間,所以我們會很可能錯過OEP,下面就分析一下我們已經執行的這幾行代碼。
有一些指向SHE結構的FS寄存器,在進一步了解之前,需要了解Windows是如何找到FS寄存器地址的。FS寄存器指向線程信息塊(TIB),其包含有關當前正在運行的線程的信息,并且指向SHE鏈的起點的指針位于TIB的偏移量0x00處。
現在,我們來看看結構異常處理程序。
單個SEH記錄由堆棧上的兩個元素組成,此過程稱為_Exception_Registration。構成SEH記錄的兩個要素是:
1.SEH處理函數;
2.PTR到下一個SEH記錄;
這樣才能形成SEH鏈結構。
一旦代碼被加載,它將519870復制到EAX并將其推到堆棧的頂部。
我們可以看看堆棧的頂部這個推送的ESP指向14FF80。
根據SEH的上述說明,這是處理程序函數代碼,但仍然需要由下一行代碼PUSH DWORD PTR FS:[0]完成的FS來指出。把指針指向SEH鏈的堆棧頂部,將完成SEH記錄。此時寄存器的當前狀態如下所示。
有了MOV DWORD PTR FS:[0], ESP的說明,代碼通過將ESP(指向記錄的頂部)移動到FS:[0]來將新創建的記錄指定到SEH鏈的頂端。執行此語句后,我們可以看到堆棧狀態SEH記錄的兩個元素。
我們也可以在VEH/SEH鏈中創建新的記錄。
但是,自從下一行代碼XOR EAX,EAX將0放入EAX后,樣本代碼應該執行這個SEH處理程序代碼。
然后它試圖將它寫入一個只讀位置來導致異常,第一個處理程序會捕獲此異常,然后執行解包程序代碼。
此外,在執行最后一條語句時,將跳轉到519870(記住這是我們之前提交給EAX寄存器的地址,并且是SEH處理函數SEH記錄的一部分)。
這是隱藏打包程序代碼的一種智能技術,但是我們的分析還沒有完成,因為我們仍然需要找到OEP,從二進制文件中解壓縮代碼并重新構建它是很困難的。
為此,我們將嘗試通過在打開代碼之前查找打包程序通常使用的一些常見模式:
- 一個是在解碼器代碼中尋找EAX跳轉的模式,通常是跳轉到未打包的代碼;
- 一個是打包機通常在打包代碼之前清理堆棧;
因此我們應該按照這個順序查看:清理堆棧→JMP EAX。
一旦進入519870(SEH處理程序代碼)中,我們可以通過每個指令,也可以沿著創建SEH記錄設置一個斷點。
下面就讓我們采用沿著創建SEH記錄設置一個斷點的辦法。
由于SEH被創建到系統上,所以當創建結構時,我們將一個斷點放在堆棧的頂部。
然后運行樣本,它需要用到下面這部分代碼。
這與我們正在尋找的模式相匹配,讓我們來執行JMP eax,然后看看這個代碼將會帶給我們的驚喜,如下圖所示。
由于代碼28E8看起來更簡潔,我們來轉一下這個代碼。
另外,我們還需要檢查這個轉儲代碼是否執行,在執行檢查之前,請先建立導入地址表。
現在,我們來分析Process Hacker中exe是否正在運行。一旦exe啟動,它會給出錯誤的警告。
有趣的是,這只是為了糾正錯誤信息,因為即使在點擊ok之后,我們也可以看到進程中的黑客進程正在運行并產生一個進程。
通過本文的分析,你可以看到惡意軟件的開發者是如何包裝代碼并阻止分析的。