脫殼-0.upx.exe
① 找OEP
ESP定律
脫殼-0.exe(FSG 2.0)
① 找oep
單步跟蹤
跳轉到OEP代碼:
JMP DWORD PTR DS:[EBX+0xC]
② dump內(nèi)存
柜某。委乌。
③ 修復IAT
FSG 2.0對內(nèi)存中的IAT 進行了一些空隙填充,需要將其改為0
脫殼-2.exe
① 找OEP
單步跟蹤
② IAT加密喘垂,解密IAT
解密IAT需要先找到加密IAT的地方,然后將其刪除或是能還原倦青。
找加密IAT代碼的方式
① 對IAT設置硬件寫入斷點
對GetVersion所在的iat設置硬件寫入斷點封拧,最終可以找到填充IAT的地方
004385EE 8907 MOV DWORD PTR DS:[EDI],EAX ; 填充IAT 函數(shù)地址
修改附近代碼
修改前
修改后
② 對IAT相關的API設置斷點
LoadLibraryA
GetProcAddress
GetModuleHandleA
VirtualProtect
脫殼中的一些問題
拿到程序怎么辦?
以脫殼為目的健田,盡可能完成脫殼
技巧的使用?
① API下斷注意的問題
API下斷之后佛纫,第一應該觀察的是堆棧妓局,確定返回地址是我們要分析的模塊
②注意當前分析的模塊是不是主模塊
脫殼-4.exe(未知殼)
① 找OEP
ESP定律
② IAT加密
這個殼使用一些加密技術:
IAT函數(shù)地址是不規(guī)則的
填充IAT時有混淆代碼
自己實現(xiàn)了一個GetProcAddress
字符串使用Hash值來存儲
殼代碼填充IAT的代碼是在申請的內(nèi)存中執(zhí)行
混淆規(guī)則
jmp 地址
等價于
call 地址
LEA ESP,DWORD PTR SS:[ESP+0x4]
哈希算法
edx=0, 保存計算之后的結果
LODS BYTE PTR DS:[ESI]
TEST AL,AL
JE SHORT 002F1CCB
ROL EDX,0x3
XOR DL,AL
尋找OEP腳本
// 1. 定義變量
VAR dwWriteIATAddr // 填充IAT地址的下一行地址
VAR dwGetAPIAddr // 獲取到了API地址
VAR dwOEP // 原始OEP
VAR dwGetBaseAddr // 申請的內(nèi)存
VAR dwTmp // 臨時變量
// 2. 初始化變了
MOV dwOEP, 0047148B
MOV dwGetBaseAddr,0047A37F
// 0047A37F 0BC>OR EAX,EAX ; eax=申請的基地址
MOV dwWriteIATAddr,0897
// 001D0895 890>MOV DWORD PTR DS:[EDX],EAX ; 填充IAT
// 001D0897 E8 >CALL 001D08D5
//00300895 890>MOV DWORD PTR DS:[EDX],EAX
//00300897 E8 >CALL 003008D5
MOV dwGetAPIAddr, 0828
//00300828 ^\E9 >JMP 00300474 ; eax=函數(shù)地址
// 3. 清除所有斷點
BPHWC
BPMC
BC
// 4. 設置斷點
BPHWS dwGetBaseAddr, "x"
BPHWS dwOEP, "x"
// 5. 循環(huán)判斷
LOOP0:
RUN
CMP eip,dwGetBaseAddr
JNZ NEXT1
ADD dwWriteIATAddr,eax
ADD dwGetAPIAddr,eax
BPHWS dwWriteIATAddr, "x"
BPHWS dwGetAPIAddr, "x"
JMP LOOP0
NEXT1:
CMP eip,dwGetAPIAddr
JNZ NEXT2
MOV dwTmp,eax
JMP LOOP0
NEXT2:
CMP eip,dwWriteIATAddr
JNZ NEXT3
MOV [edx],dwTmp
JMP LOOP0
NEXT3:
CMP eip,dwOEP
JNZ LOOP0
MSG "到達OEP!"