地址:https://bbs.pediy.com/thread-225617.htm
总结
1.有反调试去掉反调试 dump seh 回调函数出来用ida查看
2.找OEP 一般有esp定律,下断点法(如下断到BP GetVersion 运行到返回 再f7就返回上一层 就是OEP 在系统领空就不是)等
3.下IAT写入断点 (有可能要几次才到真正的写入IAT指令) 。
4.在写入断点处下软件断点(防止跑飞)
5.下断成功上下 看下指令 大部都是花指令 像下图在上一条指令要nop一条指令才能看出
6.找到后只能f7跟一圈 去掉花指令(ctrl 加方向键可以查看上下指令 会过掉花指令) 盯着寄存器 堆栈 它很定会匹配api 就会有api名称出现(有的可能不出现)这里可以直接自动单步(调试选项 打开run 跟踪 设置条件 然后在查看选项中 查看run跟踪)就能够快速定位到相应的位置)
进去就发现感觉都有可能 那就下断再人肉跟一圈
7.如果找到了api 盯着地址 盯着地址去向 (一般在eax里 因为一般是getxxxaddr())
8.找到三个关键点(找到OEP ,找到真正的api地址(一般是先获得相对虚拟地址 ,然后加上基地址)的指令,找到写入api地址的指令 )就可以写脚本了 。
下图是计算api的地址
下图是代表匹配到了api
9。如果要修复IAT 就先修改再dump
脱壳脚本
MOV vOEP,00409486 //OPE地址
MOV vGetAPIAddr,438F9F //获取APT地址
MOV vWriteIAIAddr,43918c //写入IAT 地址
MOV vHardwarePointAddr,0043AF51 //清除硬件断点的地方
MOV vAPIaddr,0
BPHWC //清除所有硬件断点
BC //清除所有软件断点
BPHWS vHardwarePointAddr, "x"
BPHWS vOEP, "x"
BPHWS vGetAPIAddr,"x"
BPHWS vWriteIAIAddr,"x"
LOOP_1:
RUN
CMP eip,vHardwarePointAddr
JNZ SIGN_1
fill vHardwarePointAddr,22,90 //nop十个字节
SIGN_1:
CMP eip,vGetAPIAddr
JNZ SIGN_2
MOV vAPTaddr,eax
SIGN_2:
CMP eip,vWriteIAIAddr
JNZ SIGN_3
mov [edi],vAPTaddr
SIGN_3:
CMP eip,vOEP
JE EXIT_1
JMP LOOP_1
EXIT_1:
MSG "修复完毕"
两个问题,第一,在分析程序时不能修改了清除硬件断点代码然后保存程序,这样再调试程序,程序就会破坏,因为清除硬件断点的代码是动态解密出来的,修改了那段代码再运行壳执行解密时就会出错。第二,壳代码或是oep下断,在调试脱壳时尽可能使用硬件执行断点,这样防止动态解密把断点冲掉。
转载于:https://blog.51cto.com/haidragon/2120886