天天看點

007 未知加密殼

文章目錄

      • 查殼
      • OD脫殼
      • 解密IAT
      • 修複導入表
      • 破解Crackme

查殼

007 未知加密殼

目标程式連結器版本是6.0 可能是VC6寫的程式 PEiD查殼沒有查出來,應該是别人自寫的一個殼

OD脫殼

載入之後到達殼的入口點 采用單步跟蹤的方式找到程式的OEP 一直單步之後 到達OEP

007 未知加密殼

在入口處 我們發現程式符合VC6的入口特征 但是第一個call并不是GetVersion

檢視記憶體 發現IAT被加密了 這個時候 如果直接dump記憶體 程式就無法運作 必須先将IAT解密 解密IAT的方法就是找到寫入

007 未知加密殼

IAT的位置 然後将函數原本未加密的位址寫回去 即可完成解密

解密IAT

是以 我們在IAT處下硬體寫入斷點 找到寫入IAT的地方

007 未知加密殼

重新開機程式 一直按F9找到加密IAT的地方

007 未知加密殼

一般加密IAT的地方都會有一個規律

mov dword ptr ds:[edi],eax

都是類似這樣的格式

找到IAT之後 一般有兩種處理方式 一是重新開機程式 在

LoadLibraryA/W

GetProcAddress

下API斷點 二是繼續單步跟蹤 找到IAT原本的位址 因為一般加密IAT的地方是個循環 這裡我們采取第二種方法

單步幾次之後 我們發現程式使用

GetProcAddress

擷取到了函數位址 之後對這個位址進行了異或

007 未知加密殼

之後又申請了一塊空間 将加密後的位址填充到這塊空間裡

007 未知加密殼

我們隻需要将加密前的IAT填充回去就完成了解密

007 未知加密殼

修改後的代碼如下

007 未知加密殼

之後單步到OEP處

007 未知加密殼

可以發現 IAT解密已經完成 然後dump檔案 修複IAT即可

在手動修複IAT的時候要注意 當單步跟蹤找到了寫入IAT和擷取IAT位址時 應該重新加載程式 在程式寫入IAT之前完成對代碼的修改 因為如果在單步跟蹤的時候直接修改 這個時候程式已經加密了部分的代碼 此時再去修複IAT就會出問題 但是如果用寫腳本的方式就不需要擔心這種問題

修複導入表

007 未知加密殼

然而 當我們使用ImportREC修複導入表時 我們發現 軟體并沒有能完整的識别所有的IAT資訊 隻搜尋到兩個子產品的導入資訊 在遇到這種情況一般采取的方法有兩種 一種是将ImportREC自動分析的RVA取整 Size增加到1000 這樣也能比較完整地分析全IAT表 隻是會分析出很多無用函數 還有一種是手動檢視IAT區域的基址和大小 然後填入ImportREC的RVA和Size中 這裡我們采取第二種方法

先在OD中觀察IAT表的起始位置 是422000

007 未知加密殼

然後找到結束位置 422504

007 未知加密殼

由此得出IAT表的大小 是504

重新在ImportREC中指定RVA和Size 點選擷取輸入表

007 未知加密殼

在擷取到的函數位址中 會有一部分無效的 一般無效的看能否修複 如果可以修複就修複 如果不能修複就剪切掉

在分析的無效函數中 有一種轉發函數 被分析成了無效函數 如圖中的

NtdllDefWindowProc_A

007 未知加密殼

這種無效函數的成因其實是函數被轉發了 上面的函數在user32中的函數名的

DefWindowProcA

而在user32子產品中這個函數位址空間并沒有實際的代碼 而隻是一個函數名 類似的函數還有幾個

這種函數可以使用ImportREC修複 輕按兩下函數名 然後先選擇子產品 再填入函數名

007 未知加密殼

如果還有無效函數 就右鍵剪切掉

007 未知加密殼

當沒有無效函數的時候 就可以轉儲檔案了,程式正常運作

007 未知加密殼

注意,我的運作環境是W7 64位,脫殼後的程式放到我的W10實體機上的跑不起來的

破解Crackme

既然是個Crackme,就順手把他幹掉吧

007 未知加密殼

根據字元串提示找到來自401557的位址

007 未知加密殼
007 未知加密殼

然後根據跳轉提示就來到了成功的地方

007 未知加密殼

接着往上翻,發現這裡有一個HackAv,直接輸入

007 未知加密殼

提示成功,破解完成

需要相關檔案可以到我的Github下載下傳:https://github.com/TonyChen56/Unpack-Practice