最近學習脫殼 好多事知其然不知其所以然。
脫殼只是一個小過程,不少的加殼軟件已經有了相對應的脫殼機。
也有固定的脫殼方法知道怎么脫即可,其中脫殼的方法我感覺有一下幾個(我接觸到的)
首先說一下殼好文章有一切從”殼”開始,殼的作用有壓縮程序和保護程序等等。
所以分壓縮殼和加密殼
區分兩種殼:
OD載入時有入口警告或詢問是壓縮程序嗎?普通壓縮殼OD調試時候沒有異常
加密殼全部有反跟蹤代碼,會有許多SEH陷阱使OD調試時產生異常。
脫殼的根本目的是找到程序真正的OEP
對于壓縮殼來說簡單點有一些固定格式:
PUSHAD PUSHFD POPAD POPFD RETN JMP EAX(跨斷跳躍到一地址)
單步跟蹤這種殼有幾個注意:
F7(步入) F8(步過) F4(運行到鼠標處) F2(下/取消訪問斷點)
尋找OEP的路上一定要勇往直前不能回頭,使勁一切方法跳出其循環,他想回頭就F4他,也有好多例外不過總會有解決的辦法越過他去,繼續前行。
注意一下幾點:
JMP的時候看一下地址的差距很遠F8即可很近就得F7進去否則程序會飛
CALL有的時候就是變形的JMP比較地址差選擇F7 F8即可
F7是很安全的不過就是浪費時間
F8步過對壓縮殼用的很多,F7步過加密殼用的很多
其他的脫殼方法(這里只說怎么做):
1簡單常見有名的殼可以去下載其脫殼機脫之
2 ESP定律(堆棧平衡定律)(很有用可以脫去大部分壓縮殼和少量的加密殼)
3內存鏡像法 在rcsc這里斷 F9第二次在code斷F9差不多到OEP了就
4最后一次異常法不忽略所有異常shift+f9一路下去數著次數知道程序運行
重新加載再shift+f9一路下去次數比運行時的次數少一次,然后查看堆棧窗口處查看
下邊找一實例
0012FFBC 0012FFE0 指向下一個SEH記錄的指針
0012FFC0 0040CCD7 SE處理程序 //CTRL+G到這個地址處 下斷 Shit+F9運行
0012FFC4 7C817077 返回到kernel32.7C817077
0012FFC8 7C930228 ntdll.7C930228
然后單步走即可,找OEP去,嘎嘎…
5懶方法(好像可以脫好多殼),設置OD如下
1、忽略所有的異常
2、“調試選項”–“SFX”–“字節模式跟蹤實際入口”
等著OEP自己出來。
6模擬跟蹤法打開內存找到 00405000 SFX,數據這地
直接這樣下斷tc eip< 00405000等OEP出現等等
脫殼完后還有重要的一步修復。
有的程序脫完殼就不能運行了。
1 直接ImportREC獲取源程序(加殼的那個)的導入表然后DUMP咱脫完殼的程序
2 如果碰到有無效的函數指針、將其修復先嘗試使用右擊設置跟蹤級別為1 2 3什么的 如果還有的話 直接右擊反匯編進去找到那個函數復制
其名字然后雙擊這個無效的函數指針將這個函數名復制進去確定即可 最后沒有了無效的DUMP。
3 有的時候是PE損壞了 用LOADPE的重建PE功能即可
4 我碰見過幾回先LOADPE 再ImportREC修復就行了。
一點小筆記先記下接下來就是無限的去脫殼,總結經驗。
下一篇:學OD -- 函數參考