OEP入口查找和基本壳的识别
入口点的查找:
VC6特点:入口点代码是固定的代码,入口调用的API也是相同的,其中有的push地址不同程序可能不同;区段有四个也是固定的.text、.rdata、.data和.rsrc。
特征:固定调用API
GetVersion; GetCommandLineA; GetStartupInfoAVS特点:入口点只有两行代码,一个CALL后直接JMP,第一个CALL进去后调用的API也是相同的;区段相对于VC6多了一个.reloc。
特征:call + jmp指令
API:GetSystemTimeAsFlieTime; GetCurrentThreadId; GetCurrentProcessId; QueryPerformanceCounter
脱壳基本方法
1.单步跟踪
2.平衡堆栈
OEP的第一条指令是pushad,作用一般是保存寄存器环境,将8各通用寄存器压入堆栈;单步执行程序,指令pushad执行,堆栈变化,此时在栈顶(ESP)设置硬件断点;
运行,程序在popad附近停止,表示已经处在壳代码末尾,继续单步到一个较大的jmp跳转,目标应该是原始OEP。
观察代码是否确是原始OEP,可以参照上文不同情况入口点特征做判断。
步骤:
1.查找原始OEP
确定原始程序代码的位置
2.dump内存到文件
内存中被还原的代码和数据抓取下来,重新保存成一个文件
3.修复文件
修复IAT,对从内存中转储到本地的文件进行修复
参考
https://www.anquanke.com/post/id/99750
https://www.52pojie.cn/forum-68-1.html
https://www.52pojie.cn/thread-234739-1-1.html
https://zhuanlan.zhihu.com/p/34263050
https://www.cnblogs.com/iBinary/p/7764483.html
