脱壳
脫殼
我們知道壓縮殼實現原理了,所以大概知道怎么拖了,只要我們找到解壓后的代碼入口點,在把他dump下來基本上就成功一半了,因為dump下來的IAT此時存放的是函數地址,而不是函數名的RVA,而且你也不知道對方有沒有抹掉導入表,所以需要修復導入表
脫殼步驟大致如下
查找OEP OEP的識別:經驗、案例收集
1.1 VC編譯程序的OEP:API斷點QueryPerformanceCounter,棧回溯往上找
1.2 VS2003-VS2015編譯程序的OEP:call+jmp 通用方法: ESP定律
ESP定律 :偽入口點找到程序返回的位置,也就是自己寫壓縮殼的時候,需要保存寄存器環境,等回到入口點執行時就要pop寄存器 這時候在push寄存器下一個硬件訪問斷點就可以找到了
1.3 API:收集不同編譯器編譯后的真實入口點,找到必來的API,然后下API斷點往上查找
單步跟蹤:單步跟蹤(步過循環,只向下跳轉),遇到一個跨節的大JMP一般就是真正的OEP
dmp文件
注意:這里一定要在入口點再dup文件,因為有些全局變量一開始是未初始化狀態,如果程序已經正在運行,那么這時候dmp全局變量的值可能是錯的
3.修復PE:修復對應導入表
脫殼案例
用exeinfope.exe查看一下是什么殼,發現是upx
用x32db加載程序
看到pushad,可以用ESP定律查看試一下,入棧后下個硬件訪問斷點,f9運行
看到此時已經,pop了,接下來可以判斷應該是進入入口點了,繼續F8 jmp過去,如下圖,入口點位置如下
此時dump下來,運行exe失敗,這個時候就要自己查看一下原因了,把dump下來的加載進x32dbg查看一下, 如下圖
看到這個很像IAT的位置中的地址無效,查看一下原PE這個地址是什么,如下圖
發現運行完這個函數之后ret就是api函數入口地址,這就相當于IAT填的是混淆代碼,反正最終是會運行到api入口地址去的,所以多運行api試一下,找找規律,把IAT的api入口地址填進行,我這個規律就是ret以后就是api入口地址,用python寫一個腳本去修復IAT,下載python2.7版本設置環境變量,然后把pythonSDk放到x32dbg插件的目錄下,重新啟動x32dbg
python腳代碼如下
然后執行代碼,此時IAT填的都是真正的地址,這時候用工具ImportREC把導入表(IAT)給保存下來,記得工具要管理員權限運行,不然會找不到PE文件,填好OEP和IAT的首地址和大小,獲取一下看看是否有效,有效的話直接點擊成load tree,因為有些是轉發函數(也就是函數實現在另一個dll里面),所以會無效,這個也必須修復一下,填真實的dll和函數名就修復了,如下圖
最后把dump下來的文件用ImportREC修復導入表,點擊加載load tree----勾選上add new section----點擊fix dump,此時會生成一個新的修復導入表的新PE 如下圖
總結
- 上一篇: # Day15-Java基础
- 下一篇: [django]梳理drf知识点