继这篇文章https://www.cnblogs.com/zpchcbd/p/12111737.html
1、到如下的时候发现虽然是OEP,但并不是真正的入口,真正的入口是在前面
2、需要重新找到它编程语言的默认OEP头才行,该程序是C++的,那大概样子应该是如下
默认的程序OEP头可以参考https://blog.csdn.net/x356982611/article/details/48370297
Microsoft Visual C++ 6.0
00496EB8 >/$ 55 PUSH EBP ; (初始 cpu 选择)
00496EB9 |. 8BEC MOV EBP,ESP
00496EBB |. 6A FF PUSH -1
00496EBD |. 68 40375600 PUSH Screensh.00563740
00496EC2 |. 68 8CC74900 PUSH Screensh.0049C78C ; SE 处理程序安装
00496EC7 |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
00496ECD |. 50 PUSH EAX
00496ECE |. 64:8925 00000>MOV DWORD PTR FS:[0],ESP
00496ED5 |. 83EC 58 SUB ESP,58
3、窃取代码的操作不会在程序运行完了之后再进行修改,所以我们在最后一个异常的地方,对相应的区段进行下断点
再对相应的区段进行下CC断点,原因是此时CC断下的点地址为3D6744,我们可以3D0000-3D1000之间下CC断点,走出该系统的领空,下完了之后F9
4、然后就是一直F7进行单步步入,原因是F8遇到CALL直接运行程序,会跑飞,之后的过程就是先找PUSH EBP,MOV EBP ESP...,找完如下
003D6A4A 55 PUSH EBP
003D6A6F 8BEC MOV EBP,ESP
003D6A93 6A FF PUSH -1
003D6AB9 68 600E4500 PUSH 450E60
003D6AE3 68 C8924200 PUSH 4292C8
003D6B0D 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
003D6B35 50 PUSH EAX
003D6B59 64:8925 00000000 MOV DWORD PTR FS:[0],ESP
003D6B85 83C4 A8 ADD ESP,-58
003D6BAC 53 PUSH EBX
003D6BCF 56 PUSH ESI
003D6BF6 57 PUSH EDI
003D6C1B 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP
003D6C67 68 D6714200 PUSH 4271D6 需要注意的是这条不是,因为最后的时候还有个return,那么这个压入的数据就是出栈时出去的地址
5、进行替换,效果如下