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