脫殼經驗1

脫殼-0.upx.exe
① 找OEP
ESP定律

脫殼-0.exe(FSG 2.0)
① 找oep
單步跟蹤
跳轉到OEP代碼:
JMP DWORD PTR DS:[EBX+0xC]
② dump內存
。。
③ 修復IAT
FSG 2.0對內存中的IAT 進行了一些空隙填充,需要將其改為0

image.png

脫殼-2.exe
① 找OEP
單步跟蹤

② IAT加密,解密IAT
解密IAT需要先找到加密IAT的地方,然后將其刪除或是能還原。

找加密IAT代碼的方式
① 對IAT設置硬件寫入斷點
對GetVersion所在的iat設置硬件寫入斷點,最終可以找到填充IAT的地方
004385EE 8907 MOV DWORD PTR DS:[EDI],EAX ; 填充IAT 函數地址

修改附近代碼

修改前


image.png

修改后


image.png

② 對IAT相關的API設置斷點
LoadLibraryA
GetProcAddress
GetModuleHandleA
VirtualProtect

脫殼中的一些問題
拿到程序怎么辦?
以脫殼為目的,盡可能完成脫殼
技巧的使用?
① API下斷注意的問題
API下斷之后,第一應該觀察的是堆棧,確定返回地址是我們要分析的模塊

image.png

②注意當前分析的模塊是不是主模塊

image.png

脫殼-4.exe(未知殼)
① 找OEP
ESP定律
② IAT加密
這個殼使用一些加密技術:

IAT函數地址是不規則的
填充IAT時有混淆代碼
自己實現了一個GetProcAddress
字符串使用Hash值來存儲
殼代碼填充IAT的代碼是在申請的內存中執行
混淆規則

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 // 申請的內存
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=函數地址

// 3. 清除所有斷點
BPHWC
BPMC
BC

// 4. 設置斷點
BPHWS dwGetBaseAddr, "x"
BPHWS dwOEP, "x"

// 5. 循環判斷
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!"

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容