和02程序类似 但是我们换一种方式脱壳 就是利用OD脚本脱壳
我们通过02程序知道壳代码在获取真正的api地址以后 会对api地址做一些处理 然后在填写到iat表中 在我们调用api的时候 并没有直接调用到api 而是加密后的api的代码
脚本的框架:只需要知道三个地址 获取真正api的地址 填写iat的地址和oep的地址
得到获取真正api的地址把api地址存放在一个临时变量里 中间不管他怎么加密 到填写IAT表的时候 都会填写我们事先保存的临时变量里的api的地址
我们现在只要调试出这三个地址 在用OD加载脚本 就可以自动填写iat了
//1. 初始化变量
MOV dwGetApiAddr,0 //获取api真正地址的地址
MOV dwWriteIATAddr,0 //iat的地址
MOV dwOEP,0 //OEP的地址
//2.删除断点
BC //清除软件断点
BPHWC //删除所有硬件断点
BPMC //清除内存断点
//3.设置硬件执行断点
BPHWS dwGetApiAddr,"X"
BPHWS dwWriteIATAddr,"X"
BPHWS dwOEP,"X"
//4.循环
LOOP0:
RUN //F9
CMP dwGetApiAddr,eip
JNZ CASE1
MOV dwTmp,eax //把正确的API地址放到临时变量里
JMP LOOP0
CASE1:
CMP dwWriteIATAddr,eip
JNZ CASE2
MOV [edi],dwTmp //把正确的API地址填写到iat里
JMP LOOP0
CASE2:
CMP dwOEP,eip
JNZ LOOP0
MSG "修复成功"
这个程序完全和程序2一样 利用函数getVersion函数找到oep地址 填写到OD脚本中
0049D5ee eax就是api加密后代码的地址 填写到正确的iat以后 我们再用正确的函数地址覆盖 所以0049D5F0下断点覆盖iat 0049D5F0填写到OD脚本中
向上翻 GetProcAddress函数获取真正的函数地址 走过这一句eax也就保存了函数地址 填写到OD脚本中
填写后的 od脚本
//1. 初始化变量
MOV dwGetApiAddr,0049D5BF //获取api真正地址的地址
MOV dwWriteIATAddr,0049D5F0 //填写iat的地址
MOV dwOEP,0044848D //OEP的地址
//2.删除断点
BC //清除软件断点
BPHWC //删除所有硬件断点 a
BPMC //清除内存断点
//3.设置硬件执行断点
BPHWS dwGetApiAddr,"x"
BPHWS dwWriteIATAddr,"x"
BPHWS dwOEP,"x"
//4.循环
LOOP0:
RUN //F9
CMP dwGetApiAddr,eip
JNZ CASE1
MOV dwTmp,eax //把正确的API地址放到临时变量里
JMP LOOP0
CASE1:
CMP dwWriteIATAddr,eip
JNZ CASE2
MOV [edi],dwTmp //把正确的API地址填写到iat里
JMP LOOP0
CASE2:
CMP dwOEP,eip
JNZ LOOP0
MSG "修复成功"
OD右键 运行脚本 打开
直接运行
说明跑到了OEP
再看IAT表就已经修复完成了
接下来就是dump
转存到文件
成功运行 脱壳成功