脫殼入門----脫ASPack殼保護的DLL


前言

結合脫dll殼的基本思路,對看雪加密解密里的一個ASPack殼保護的dll進行脫殼分析。

脫殼詳細過程

尋找程序的OEP

先將目標DLL拖入OD,來到殼的入口處。

然后利用堆棧平衡原理在pushad后,對棧頂下硬件訪問斷點。

之后我們直接運行程序,當程序popad后會被斷下,觀察得出OEP的RVA為0x1240。

找到殼的重定位代碼

我們在來到程序真正的入口點后可以看到一些會被重定位的代碼,我們選擇最近的一個會進行重定位的代碼記住其RVA。
本例子中我們選的是RVA為0x1253的代碼。

然后我們重新加載dll,我們先對剛剛記住的那個RVA下內存寫入斷點,程序會先斷在殼代碼解壓區塊處我們需要在殼代碼將所有的區段解壓縮后對剛剛記住的那個RVA再下內存訪問斷點,然后程序會斷在殼的重定位代碼處。

跳過重定位代碼並dump程序

我們只需要將修正重定位數據的代碼nop去就可以讓重定位代碼無法發揮作用。

nop去重定位代碼后我們繼續運行程序,程序會停在我們尋找OEP時設置的斷點處。然后我們就可以用LordPE來dump文件了,將dump的文件命名為ASP.dll

重建輸入表

在重建輸入表前我們需要知道原程序IAT表的位置,我們可以在OD中Alt + M查看內存然后我們在主模塊可以看到各個區塊,一般IAT表都是在.rdata區塊處。我們在此處右擊然后選擇在cpu數據窗口查看,然后將cpu數據窗口的顯示形式調為地址。我們可以看到在區塊一開始就是IAT表。此IAT表的RVA為0x7000。

在查找IAT表示還要注意,不要將原程序的IAT表與殼的IAT表搞混。在區塊.aspack處也存在一個IAT,這個IAT是殼代碼的。

獲取IAT的RVA后我們可以打開ImportRE工具重建輸入表,我們在OEP處填寫1240,在IAT 的RVA處填寫7000,大小盡量填大點。然后點擊獲取輸入表。

獲取輸入表后我們發現有好多無效的這是因為我們IAT的大小填的過大,我們只需點擊顯示無效函數,然后右擊剪切/刪除指針數據即可去除無效數據。


接着我們點擊修復轉存文件,並選擇我們剛剛轉存的ASP.dll即可生成名為ASP_.dll的文件。

修復重定位數據

如果把剛剛我們修復了輸入表的dll加載到OD中我們可以看到需要重定位的數據還是按照基地址為0x400000的數據,而此時的基地址為0x220000其數據並沒有被修正,這是因為windows加載器在加載的時候並沒有找到重定位表,所以我們需要修復重定位表。

我們重新加載加殼的dll,來到我們剛剛找到的殼的重定位代碼處,分析程序可得0x22d247地址處edi+ebx即為對應需要重定位的數據的地址。我們需要在此處打補丁獲取所有需要重定位的數據的RVA地址。我們在0x22d598處寫補丁程序,此處跳轉到0x22d598處。

然后在0x22d598處打補丁程序,將獲得的重定位數據地址存在0x229000處,0x22d600為其指針。

運行程序程序停在OEP跳轉處,我們在數據窗口處可以看到重定位數據的RVA地址。(每一個dword是一個地址)

將這些二進制數據復制后用WinHex保存為bin文件。然后用拖入重定位重建工具ReloREC,然后選在重定位表存在RVA:9000處。點擊Fix Dump選擇我們重建了輸入表的名為ASP_.dll的文件,其會生成一個名為ASP__.dll的文件。

這時在用OD加載此文件就會發現需要重定位數據處的數據已被修正。

優化PE文件

①將在殼空間中的資源數據都放到一個資源區段中,用工具DT_ResFix.exe選擇對應的dll文件,然后直接重構資源。

②將殼代碼的區段刪除,利用pe編輯工具。

③查看pe文件頭的一些數據是否有錯誤。(一般我們在前面重構輸入表和重定位表的時候,相關工具都已經修改過了)

④在重建輸入表是可以將輸入表放在一個已存在的區塊處,這里我們是新建了一個區塊。

總結

脫dll殼的思路大致就是這樣,當然各個步驟的方法不唯一,像尋找oep就有很多方法。需要根據對應的殼,靈活使用各種方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM