软件名称:财务分析师V6.9 Build 406
软件下载地址:
http://www.fam2003.com/soft/FApSetup.rar
PEID查壳,显示:Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks
OD载入,
下he GetModuleHandleA+5断点,目的还是找Magic Jmp。
Shift+F9
第六次看到
0012BF20 |00F9C824 返回到 00F9C824 来自 kernel32.GetModuleHandleA
0012BF24 |00FAD6C8 ASCII "kernel32.dll"
0012BF28 |00FAE670 ASCII "VirtualFree"
第七次看到
0012BC98 |00F8799B 返回到 00F8799B 来自 kernel32.GetModuleHandleA
0012BC9C |0012BDD4 ASCII "kernel32.dll"
取消硬件断点,返回,来到
00F879B5 FF15 CC80FA00 call dword ptr [FA80CC] ; kernel32.LoadLibraryA
00F879BB 8B0D E011FB00 mov ecx, dword ptr [FB11E0]
00F879C1 89040E mov dword ptr [esi+ecx], eax
00F879C4 A1 E011FB00 mov eax, dword ptr [FB11E0]
00F879C9 393C06 cmp dword ptr [esi+eax], edi
00F879CC 0F84 AD000000 je 00F87A7F //Magic Jmp
把
00F879CC 0F84 AD000000 je 00F87A7F
改成
00F879CC /E9 AE000000 jmp 00F87A7F
00F879D1 |90 nop
好了。该找OEP了。
下BP GetCurrentThreadId [ESP]<10000000断点,
Shift+F9,来到这里
7C809737 > 64:A1 18000000 mov eax, dword ptr fs:[18]
7C80973D 8B40 24 mov eax, dword ptr [eax+24]
取消断点,返回,单步。
00FA45FD 2BF9 sub edi, ecx
00FA45FF FFD7 call edi ; FAp.007F1001
F7单步步入
007F1001 60 pushad
007F1002 E8 03000000 call 007F100A
好像是aspack,用ESP定律
F8,下hr 0012f564
Shift+F9来到
007F13B0 /75 08 jnz short 007F13BA
007F13B2 |B8 01000000 mov eax, 1
007F13B7 |C2 0C00 retn 0C
007F13BA \68 00F07E00 push 007EF000
007F13BF C3 retn
取消硬件断点
3次F8来到这里
007EF000 9C pushfd
007EF001 60 pushad
007EF002 E8 02000000 call 007EF009
好像是北斗。继续使用ESP定律
下hr 0012f580
Shift+F9,然后F8,来到这里。
007E2000 9C pushfd
007E2001 60 pushad
007E2002 E8 02000000 call 007E2009
又是北斗?继续F9,F8,来到
004099B8 68 049C4000 push 00409C04 ; ASCII "VB5!6&vb6chs.dll"
004099BD E8 EEFFFFFF call 004099B0
终于跑到OEP了。
接下来就是DUMP和修复了。
脱下来后出现程序有N多区段,体积也不小。
于是,除
.text
.data
.rsrc
.aspack
.reloc
.mackt
其它区段全部删除,重建PE。程序从5.58 MB变成3.48 MB。
接下来就是破解了。
这个比较简单。用c32asm查找unicode字符串,发现有“未注册”字样。
004BA05B:: 68 9C104300 PUSH 43109C \->: (未注册)
CTRL+G来到004BA05B,发现
004B9F16 66:833D 0C81760>cmp word ptr [76810C], 0FFFF
004B9F1E 0F85 DB000000 jnz 004B9FFF
只要这个跳不跳就会显示已注册。
在004B9F16下断,F9运行。断下来,可以看到
ds:[0076810C]=0000
对0076810C下硬件断点。CTRL+F2,重新载入。
程序在断在此处
004B9BD1 66:C705 0C817600 0000 mov word ptr [76810C], 0
004B9BDA C745 FC 16000000 mov dword ptr [ebp-4], 16
看来在这里修改就可以了,把004B9BD1改成
004B9BD1 66:C705 0C817600 FFFF mov word ptr [76810C], 0FFFF
保存,收工
总结:都不知道VB程序作者加那么多重壳有什么用,作者加壳不累,我打字倒是打得挺辛苦的。