目录 Table of Contents
第一个程序:QQ 非主流 exe
去掉 非法访问内存
的勾勾, 隐藏 OD
去掉这个勾勾应该和之后的内存访问断点有关
老套路来到 retn
, 接着我们去 OEP 看看情况, 还是老套路, 找到内存
很显然这是个 VB 程序并且 OEP 不完整
ximo 是直接现场找了个 VB 程序并观察入口点, 然后类比来修改 QQ 非主流的 OEP 汇编代码
直接上图吧


1.忽略除内存访问的所有断点,隐藏OD
2.F9,找SE句柄,数据窗口跟随,下内存访问断点
3.SHIFT+F9,F2,再SHIFT+F9,F2,再次SHIFT+F9,取消所有断点。
4.运行到RETN
5.打开内存,0401000处下F2断点。SHIFT+F9
6.来到假的OEP。
7.修正代码
8.脱壳,修复
9.OK~!!脱壳完成
第二个程序 : ACP_Feedback1.exe
我们先照老规矩试一下, 发现程序直接跑起来了, 说明这个异常没有起作用
然后我们用 int 3 试试, 然后视频里失败了而我成功了…… 当然我这个也没有来到 OEP
视频里把 int 3 中断
和 非法访问内存
的勾勾都取消了, 程序跑飞, 失败
这时候他把勾勾全部勾上了
我们介绍另外一个方法
1.下断:bp GetCurrentProcessId,F9
2.我们来到这个地方
7C809940 > 64:A1 18000000 mov eax,dword ptr fs:[18] //断在这
7C809946 8B40 20 mov eax,dword ptr ds:[eax+20]
7C809949 C3 retn
取消这个断点
3.用Lord PE查OD的PID。
视频里是 E00, 我的是 36C, 进程号以每一次操作为准, 这个值不唯一
//此处应有图

4.把 2 中的代码改为
7C809940 > B8 3C150000 mov eax,153C //当然,PID号每次都会变, 具体以每一次操作得到的为准
7C809945 90 nop
7C809946 90 nop
7C809947 90 nop
7C809948 90 nop
7C809949 C3 retn
//此处应有图

注意, 16 进制数以字母开头的话, 前面要加 0
然后我们把下面的 mov
也 nop
掉

第一个断点的任务已经完成, 我们来下第二个断点
5.下断,BP GetModuleHandleA,F9
来到下面的位置
6.来到这里
7C80B6C1 > 8BFF mov edi,edi //断在这
7C80B6C3 55 push ebp
7C80B6C4 8BEC mov ebp,esp
7C80B6C6 837D 08 00 cmp dword ptr ss:[ebp+8],0
7C80B6CA 74 18 je short kernel32.7C80B6E4
7C80B6CC FF75 08 push dword ptr ss:[ebp+8]
7C80B6CF E8 C0290000 call kernel32.7C80E094
7C80B6D4 85C0 test eax,eax
7C80B6D6 74 08 je short kernel32.7C80B6E0
7C80B6D8 FF70 04 push dword ptr ds:[eax+4]
7.来到内存,在 CODE 断下 内存访问断点
,F9运行,出现 NAG 窗口,点确定后,来到 OEP!!!
00402150 55 push ebp //OEP!!
00402151 8BEC mov ebp,esp
00402153 83C4 F0 add esp,-10
00402156 53 push ebx
00402157 B8 10214000 mov eax,ACP_Feed.00402110
0040215C E8 4FFCFFFF call ACP_Feed.00401DB0
00402161 68 C4214000 push ACP_Feed.004021C4 ; ASCII "ACProtect Feedback Form"
00402166 6A 00 push 0
00402168 6A 00 push 0

8.脱壳, 修复, 用等级3!或者手动找 MessageBoxA
我等级 3 必死, 然后我直接把那个无效的指针剪切掉, 然后程序可以运行
手动找 MessageBoxA, 就是直接点那个无效的指针, 会弹出个窗口, 然后你在里面找 MessageBoxA 点它就好
用等级 3 下面的插件脱壳, 也是死掉了orz