脫殼——pediy 加密殼
- 尋找OEP
- IAT 加密問題
- 撰寫腳本(OllySubScript 撰寫)
- 腳本思路
- 解決基址問題
關于程式連接:
,,,火絨爆毒,就不傳程式鏈接了,,,
尋找OEP
-
首先(PEiD)查看下聯結器版本
- VC 6.0?

- 使用 OD 打開,發現 pushad/pushfd(妥妥的 ESP定律 呀)

- F9 運行后斷下,再 F7 單步,發現 jmp 到遠處

- 進入,發現
sub esp, 0x58,又因為根據聯結器版本,猜測是 VC6.0,所以進入第一個 call 驗證

- F7 單步步入驗證(果然是呢),OEP位置確認(dwOEP 0047148B),但是 IAT 被加密了

IAT 加密問題
-
所以需要在填充IAT處,下硬體寫入斷點
- 首先找到 IAT地址

- 下硬體寫入斷點

- 重新運行后

-
此處是填充 IAT 的地方,即 dwWriteAddr
-
但是觀察不到明顯特征;
- 按住 F7 運行,觀察暫存器變化
- ESI 是要填入的字串,可看到名稱
- EDX(無規則) 應該是哈希值
- EAX 字串單個字母的 ASCII(hex)
- 按住 F7 運行,觀察暫存器變化
-
【回圈】—— 省略一些 call + lea;并觀察何時跳出回圈

-
F2 下斷,跳出查看后續,發現
cmp,又一處跳出條件
-
繼續 F7 運行

- 下斷,使其運行在比較結果相等后

-
不要著急,繼續F7單步運行,終于發現
GetversionAPI 函式地址- dwGetAPIAddress

撰寫腳本(OllySubScript 撰寫)
腳本思路
- 先獲取程式運行基址 -> (基址+偏移)算出正確的獲取API函式命令的地址,填充API命令的地址 ->
// 1.初始化地址
MOV dwGetAPIAddr,00001914
MOV dwWriteAddr,00000897
MOV dwOEP,0047148B
MOV dwBase,0047A37F
// 2.設定斷點
BC // 清除所有軟體斷點
BPHWC // 清除所有硬體斷點
BPMC // 清除所有記憶體斷點
BPHWS dwBase, "x"
BPHWS dwOEP, "x" //當執行到此地址時產生中斷
LOOP1:
RUN // 相當于在OllyDbg中按 F9
CMP dwBase,eip
JNZ CASE0
ADD dwGetAPIAddr,eax // eax 保存的是程式基址
ADD dwWriteAddr,eax
BPHWS dwGetAPIAddr, "x" //當執行到此地址時產生中斷
BPHWS dwWriteAddr, "x" //當執行到此地址時產生中斷
BPHWC dwBase
JMP LOOP1
CASE0:
CMP dwGetAPIAddr,eip
JNZ CASE1 // 如果不是就比較下一個,如果是就可以保存函式地址了
MOV dwTemp,eax // eax 保存 API函式地址
JMP LOOP1
CASE1:
CMP dwWriteAddr,eip
JNZ CASE2
MOV [edx],dwTemp // 根據原加殼程式,填充至 edx 處
JMP LOOP1
CASE2:
CMP dwOEP,eip
JNZ LOOP1
MSG "修復完成"
解決基址問題
-
由于殼代碼填充 IAT 的代碼是在【申請的記憶體中執行】,每次申請的空間是偽隨機的
- 所以采用基址+偏移的方式

-
雙擊堆疊中 VirtualAlloc 那行,回傳呼叫它的地址
- 并在它的下行命令下斷(因為回傳值 eax 是程式的 加載基址)
- 所以 dwBase 0047A37F

- 腳本運行效果:錄制了個動圖,因為圖片大小限制在5MB,只截取了一部分

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/266772.html
標籤:其他
上一篇:解決 Win10 局域網下兩臺電腦無法ping通: 無法訪問目標主機
下一篇:解決微信支付退款回呼通知介面req_info AES解密報錯Illegal key size or default parameters.
