IAT(Import Address Table:輸入函數地址表):
為解決不同操作系統dll文件的兼容性問題而產生。
程序調用了一些系統API,IAT的作用就是在不同系統中實現API調用。
* * * * *
**手動查找并修復IAT**
輸入表重建程序:IREC
查找IAT起始地址:
在入口點下找一個call ,比如地址為425210(IREC驗證一下)
或
搜索FF15 FF25
想下面這樣的指令
call [dword],0x?????(內存地址)
jmp [dword],0x?????(內存地址)
命令行:D 425210(數據窗口跟隨) ,向上向下查找到全都是000的地址
IREC中RVA填iat起始值,size填結束值1000
顯示無效函數,剪切掉,重新轉存
* * * * *
**誤解**
1.加了殼程序無法破解
2.加了殼的程序找不到字符串
不脫殼破解可以打內存補丁,時機很重要
**一般脫殼流程**:
調試器(反調試)
被脫殼的文件
OEP(偷OEP,藏OEP)
dump(.bss)
修復iat(先跳到內存地址再到IAT)
如果IREC無效函數過多,用OD腳本修復
————————————————
**UPX脫殼并修復IAT腳本**
————————————————
例程:
https://pan.baidu.com/s/1cmIQbssfmgoc4Vnjl5ed7w
~~~
mov iat_b,00432000 ;IAT起始地址,給變量賦值
mov iat_e,00432554 ;IAT結束地址下一句
sti ;pushad 單步
bphws esp,"r" ;hr esp 硬件斷點
run
sti
sti
sti ;到了jnz
bp eip ;F4運行到下一行
@LOOP:
run
cmp esp,eax
jnz @LOOP
sti
sti
sti
MSG "到OEP了"
@IAT_LOOP:
mov iat,[iat_b]
cmp iat,0
je @NEXT_LOOP
mov api,[iat+1]
mov [iat_b],api ;重建iat
@NEXT_LOOP:
add iat_b,4
cmp iat_b,iat_e
jne @IAT_LOOP
MSG "OK IAT 修復已經完成"
ret
~~~
;mov iat,[iat_b] ;把00432000內存里面值拿出來,而不是拿出來00432000
;UPX的殼段代碼是差不多的,那么這個腳本就可以用來找這個upx版本所有加殼程序的OEP,而且不用管ASLR的問題
作業:
https://pan.baidu.com/s/1Antw0tybvTb9N-m41U4JWg