007 未知加密壳
文章目錄
- 查殼
- OD脫殼
- 解密IAT
- 修復導入表
- 破解Crackme
 
 
查殼
 目標程序鏈接器版本是6.0 可能是VC6寫的程序 PEiD查殼沒有查出來,應該是別人自寫的一個殼
OD脫殼
載入之后到達殼的入口點 采用單步跟蹤的方式找到程序的OEP 一直單步之后 到達OEP
 
 在入口處 我們發現程序符合VC6的入口特征 但是第一個call并不是GetVersion
 查看內存 發現IAT被加密了 這個時候 如果直接dump內存 程序就無法運行 必須先將IAT解密 解密IAT的方法就是找到寫入
IAT的位置 然后將函數原本未加密的地址寫回去 即可完成解密
解密IAT
所以 我們在IAT處下硬件寫入斷點 找到寫入IAT的地方
重啟程序 一直按F9找到加密IAT的地方
 一般加密IAT的地方都會有一個規律 mov dword ptr ds:[edi],eax都是類似這樣的格式
 找到IAT之后 一般有兩種處理方式 一是重啟程序 在LoadLibraryA/W GetProcAddress下API斷點 二是繼續單步跟蹤 找到IAT原本的地址 因為一般加密IAT的地方是個循環 這里我們采取第二種方法
 單步幾次之后 我們發現程序使用GetProcAddress獲取到了函數地址 之后對這個地址進行了異或
 之后又申請了一塊空間 將加密后的地址填充到這塊空間里
 我們只需要將加密前的IAT填充回去就完成了解密
修改后的代碼如下
 之后單步到OEP處
 可以發現 IAT解密已經完成 然后dump文件 修復IAT即可
 在手動修復IAT的時候要注意 當單步跟蹤找到了寫入IAT和獲取IAT地址時 應該重新加載程序 在程序寫入IAT之前完成對代碼的修改 因為如果在單步跟蹤的時候直接修改 這個時候程序已經加密了部分的代碼 此時再去修復IAT就會出問題 但是如果用寫腳本的方式就不需要擔心這種問題
修復導入表
然而 當我們使用ImportREC修復導入表時 我們發現 軟件并沒有能完整的識別所有的IAT信息 只搜索到兩個模塊的導入信息 在遇到這種情況一般采取的方法有兩種 一種是將ImportREC自動分析的RVA取整 Size增加到1000 這樣也能比較完整地分析全IAT表 只是會分析出很多無用函數 還有一種是手動查看IAT區域的基址和大小 然后填入ImportREC的RVA和Size中 這里我們采取第二種方法
 先在OD中觀察IAT表的起始位置 是422000
 然后找到結束位置 422504
 由此得出IAT表的大小 是504
 重新在ImportREC中指定RVA和Size 點擊獲取輸入表
 
 在獲取到的函數地址中 會有一部分無效的 一般無效的看能否修復 如果可以修復就修復 如果不能修復就剪切掉
 在分析的無效函數中 有一種轉發函數 被分析成了無效函數 如圖中的NtdllDefWindowProc_A
 
 這種無效函數的成因其實是函數被轉發了 上面的函數在user32中的函數名的DefWindowProcA 而在user32模塊中這個函數地址空間并沒有實際的代碼 而只是一個函數名 類似的函數還有幾個
 這種函數可以使用ImportREC修復 雙擊函數名 然后先選擇模塊 再填入函數名
 如果還有無效函數 就右鍵剪切掉
 當沒有無效函數的時候 就可以轉儲文件了,程序正常運行
注意,我的運行環境是W7 64位,脫殼后的程序放到我的W10物理機上的跑不起來的
破解Crackme
既然是個Crackme,就順手把他干掉吧
根據字符串提示找到來自401557的地址
然后根據跳轉提示就來到了成功的地方
接著往上翻,發現這里有一個HackAv,直接輸入
提示成功,破解完成
需要相關文件可以到我的Github下載:https://github.com/TonyChen56/Unpack-Practice
總結
 
                            
                        - 上一篇: 160个Crackme011
- 下一篇: 160个Crackme013之投机取巧
