Ollydbg
先设置INT3异常
载入程序,shift+F9两次,来到内存在00401000下F2中断
来到FOEP
0040B760 3D 00100000 cmp eax,1000 \\FOEP
0040B765 73 0E jnb short ASProtec.0040B775
0040B767 F7D8 neg eax
0040B769 03C4 add eax,esp
0040B76B 83C0 04 add eax,4
0040B76E 8500 test dword ptr ds:[eax],eax
在转存窗口右键==>长型==>地址
记录IAT的启始地址:00425000 77DAEFB8 ADVAPI32.RegOpenKeyA
往下拉到结束地址:00425534
在反汇编窗口右键==>查找==>所有模块间的调用
记录
变形代码: 008C0000
双击CALL调用:记录15 FF
004016EB FF15 F8534200 call dword ptr ds:[4253F8] ; user32.GetClientRect
变形代码: 008C0000
OD设置全部忽略所有,重载程序,F9运行ALT+L打开记录,数下记录数据, 消息=访问违例: 写入到 [00000000]
共31个.设置内存异常.重载程序,来到最后一次异常
009FFAA5 C700 EFCA5C85 mov dword ptr ds:[eax],855CCAEF \\最后一次异常.
009FFAAB 67:64:8F06 0000 pop dword ptr fs:[0]
009FFAB1 83C4 04 add esp,4
009FFAB4 83E8 AF sub eax,-51
009FFAB7 83C8 4B or eax,4B
009FFABA 58 pop eax
009FFABB A1 0C38A000 mov eax,dword ptr ds:[A0380C]
009FFAC0 8B00 mov eax,dword ptr ds:[eax]
往下拉到此断的最后一个CALL
009FFBF5 E8 1A30FDFF call 009D2C14
009FFBFA E8 B5D0FFFF call 009FCCB4 \\最后一个CALL
009FFBFF 83C4 2C add esp,2C
009FFC02 5D pop ebp
009FFC03 5F pop edi
009FFC04 5E pop esi
009FFC05 5B pop ebx
009FFC06 C3 retn
F2下断,shift+F9,来到CALL,F2取消断点,F7步入
CTRL+F9执行到返回,记录注释窗口:返回到 00C60294
CTRL+B查找89 45 F0 B8 00 07 00 00
来到
009F7188 8945 F0 mov dword ptr ss:[ebp-10],eax
009F718B B8 00070000 mov eax,700
009F7190 E8 B7B3FDFF call 009D254C //申请内存地址
009F7195 8945 E4 mov dword ptr ss:[ebp-1C],eax
009F7198 C645 EF 00 mov byte ptr ss:[ebp-11],0
MemoryManage插件审请内存VA:01640000 size:10000,审请成功OD下面有提示
MEmoryManage Allocate:00ce0000,size 10000
把CALL 009D254C 改成 jmp 01640037
CTRL+G来到01640000
写入代码
01640000 BA 00104000 mov edx,ASProtec.<模块入口点>
01640005 803A E8 cmp byte ptr ds:[edx],0E8
01640008 75 12 jnz short 0164001C
0164000A 8B42 01 mov eax,dword ptr ds:[edx+1]
0164000D 03C2 add eax,edx
0164000F 83C0 05 add eax,5
01640012 3D 00800C00 cmp eax,0C8000 ; 变形代码
01640017 75 03 jnz short 0164001C
01640019 EB 0C jmp short 01640027
0164001B 90 nop
0164001C 42 inc edx
0164001D 81FA 00504200 cmp edx,425000 ; CODE段后面的启始位置
01640023 ^ 72 E0 jb short 01640005
01640025 - EB FE jmp short 01640025
01640027 8915 00016401 mov dword ptr ds:[1640100],edx
0164002D 60 pushad
0164002E FFE2 jmp edx
01640030 90 nop
01640031 90 nop
01640032 90 nop
01640033 90 nop
01640034 90 nop
01640035 90 nop
01640036 90 nop
01640037 60 pushad
01640038 B8 00504200 mov eax,425000 ; IAT启始位置
0164003D 90 nop
0164003E 3910 cmp dword ptr ds:[eax],edx
01640040 75 20 jnz short 01640062
01640042 8B0D 00016401 mov ecx,dword ptr ds:[1640100]
01640048 C701 FF150000 mov dword ptr ds:[ecx],15FF ; CALL或JMP调用(FF 15/FF 25)
0164004E 8941 02 mov dword ptr ds:[ecx+2],eax
01640051 61 popad
01640052 90 nop
01640053 8B15 00016401 mov edx,dword ptr ds:[1640100]
01640059 90 nop
0164005A 90 nop
0164005B 90 nop
0164005C ^ EB BE jmp short 0164001C
0164005E 90 nop
0164005F 90 nop
01640060 90 nop
01640061 90 nop
01640062 83C0 04 add eax,4
01640065 3D 34554200 cmp eax,425534 ; IAT结束位置
0164006A ^ 7E D2 jle short 0164003E
0164006C ^ EB E3 jmp short 01640051
二进制:
BA 00 10 40 00 80 3A E8 75 12 8B 42 01 03 C2 83 C0 05 3D 00 80 0C 00 75 03 EB 0C 90 42 81 FA 00
50 42 00 72 E0 EB FE 89 15 00 01 64 01 60 FF E2 90 90 90 90 90 90 90 60 B8 00 50 42 00 90 39 10
75 20 8B 0D 00 01 64 01 C7 01 FF 15 00 00 89 41 02 61 90 8B 15 00 01 64 01 90 90 90 EB BE 90 90
90 90 83 C0 04 3D 34 55 42 00 7E D2 EB E3
在01640000处右键==>新建EIP
F9运行==>LordPE脱壳==>ImportREC修复
OEP填5000==>自动查找IAT==>获取输入表==>显示无效的==>把OEP改成[返回到 00C60294-基址=]860294 ==>抓取脱壳文件
下面的工作来了,慢慢享受,呵
OD打开内存查看
从00470000到01640000是要补的区断,
打开LordPE,选中进程,区域脱壳,选择00470000脱壳,复制地址00470000
打开另一个LordPE==>PE编辑器==>选择修复好的文件==>区断==>右键==>从磁盘载入==>刚脱的文件
选中刚加的区断==>右键==>编辑区断==>
名称:00
虚拟地址:00470000 - 基址400000 =70000
循环操作到01640000
====================================================================
经过N久的补区,完成,LordPE重建PE,注意重建选项PE只选择验证PE,[使PE有效]
运行一下程序,提示ERROR:111错误,证明我们没出错,暗笑中....
OD全部忽略异常!!
载入OD单步走,到00C60339 步入
00C60332 66:9D popfw
00C60334 68 070AC600 push Unpack_.00C60A07
00C60339 E8 C2FC0500 call Unpack_.00CC0000 //F7步入
00C6033E 68 A6444200 push Unpack_.004244A6
00C60343 66:9C pushfw
继续F8
到00CC0159 F7步入
00CC0155 2BEE sub ebp,esi
00CC0157 2BEF sub ebp,edi
00CC0159 FFD5 call ebp //F7步入
00CC015B EB 01 jmp short Unpack_.00CC015E
00CC015D 9A 2EEB019A 64F>call far FF64:9A01EB2E
F8单步,看到下面的
009F8A66 8B40 34 mov eax,dword ptr ds:[eax+34] ; Unpack_.00C30000
009F8A69 FFD0 call eax
009F8A6B 2945 0C sub dword ptr ss:[ebp+C],eax
009F8A6E 8B45 0C mov eax,dword ptr ss:[ebp+C]
这里就是我们可爱的Route check了
选上,用SYSCOM大侠的办法,二进制粘贴 90 90 90 8B 44 24 58 83 E8 05 90
保存,运行,还是出现ERROR:111错误,,,重新来过,还是这样,,,,不知道怎么搞了!!~大侠帮下忙

[培训]科锐逆向工程师培训第53期2025年7月8日开班!