脱壳实践之手动构造输入表
0x00 前言
??對于脫殼后的程序往往不能直接運行,這是因為它們很多都沒有重建輸入表。當然用的od脫殼可能可以。重建輸入表一般都是用專業軟件比如ImportREC。但是對于逆向研究者來說會自己重講輸入表是必須的技能。這就需要讀者對前面幾篇所講的PE文件格式非常熟悉。
0x01 尋找OEP脫殼脫殼
??前面已經提到對于區段信息全都已經改的面目全非的加殼程序,用兩次內存斷點法是無法找到OEP地址的,比如今天我們用的這個程序,下圖為它的區段信息:
?上圖可知我們根本無法知曉哪個區段存放數據,哪個區段存放代碼。這種情況下用兩次斷點法難免會失效。因此我們應該采用堆棧平衡法來尋找OEP地址。這里步驟就省去了,畢竟今天的主題是構造輸入表,有興趣了解堆棧平衡法的可以去我的博客按標題查看。下圖為找的OEP地址:
既然找到了OEP地址,就直接使用OD來脫殼了。點擊插件的ollydump,把重建輸入表去掉,畢竟這個是我們接下來的工作。如下圖:
? 0x02 手動重建輸入表
??思路:找到被調用的api函數——》將DLL函數和api函數寫入脫殼后的文件的空白區域——》空白區域重寫IMAGE_THUNK_DATA數組——》空白區域重寫IID數組——》將IID數組地址寫入數據目錄表第二項。
?重建之前我們先來看看脫殼后的程序的輸入表,如下圖:
?
?明顯看出這個輸入表已經紊亂了。接下來我們一步步重建它。
1)我們先用沒有加殼的原程序來看看他調用了哪些函數(一定要用沒有加殼的,加了殼的調用的函數會很不同)。見下圖:
上圖可知共調用了四個個函數KERNEL32.DLL調用了ExitProcess和CreateFileA而USER32.DLL調用了MessageBoxA。
2)將輸入DLL以及被調用的函數寫入脫殼后程序的空白區域
此表是DLL已經函數寫入的地址(這里的地址都是高低位互換的便易在hexworkshop中讀寫)
| DLL名及DLL地址 | 函數名及函數地址 | ||||
| KERNEL32.DLL | 0016 0000 | ExitProcess | 1a16 0000 | CreateFileA | 2816 0000 |
| USER32.DLL | 0d16 0000 | MessageBoxA | 3616 0000 | ? | ? |
?
(PS:DLL之間應該有一個字符空隙,DLL與API函數,API函數與API函數之間應該有三個字符間隙,因為前面API函數前面個兩個字節是預留給IMAGE_IMPORT_BY_NAME的Hint字段多余的一個作為間隙)
3)在空白區域構造IMAGE_THUNK_DATA數組。
??構造IMAGE_THUNK_DATA數組起始位置16b0
| 第一個IID數組的IMAGE_THUNK_DATA數組 | 1a16 0000-2=1816(16b0) | 28160000-2=2616 (16b4) |
| 第二個IID數組的IAMGE_THUNK_DATA數組 | 3616 0000-2=3416(16BC) | ? |
構造完成之后如下圖:
IID數組之間預留四個字節的間隙
4)構造IID數組
另找一塊空白區域,我們這里選用1760處。
構造IID數組位置:1760
| DLL名稱 | OriginalFristThunk | TimaStamp | ForwordChian | Name | FristThunk |
| KERNEL32.DLL | B016 0000 | 0000 0000 | 0000 0000 | 0016 0000 | B016 0000 |
| USER32.DLL | Bc16 0000 | 0000 0000 | 0000 0000 | 0d16 0000 | Bc16 0000 |
| 結束標志 | 0000 0000 | 0000 0000 | 0000 0000 | 0000 0000 | 0000 0000 |
?
構造后如下圖:
?
5)將數據目錄表的第二項改成IID的地址1760,后面四個字節寫入IID數組大小28,如下圖:
?至此手動構造完畢,保存文件。
0x03 檢驗構造的輸入表是否起作用。
我們用LordPE打開保存后的文件,點擊目錄信息,再點擊輸入表即可查看信息,如下圖:
?
?很明顯,我們手動構造的輸入表已經起作用了。
?0x04 總結
雖然手動構造輸入表成功了,但是我發現脫殼后的程序并不能正常運行,這兩天一直在思考其中的緣由,如果有幸哪位大佬看到這篇文章請留言指導一二。
轉載于:https://www.cnblogs.com/2f28/p/9870848.html
總結
以上是生活随笔為你收集整理的脱壳实践之手动构造输入表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高斯消元入门
- 下一篇: web移动端全屏滚动页面的适配问题