破解第一步:
PEiD查壳:
ASPack 2.12 -> Alexey Solodovnikov
第二步:
OD载入,入口代码:
007C2001 > 60 pushad
007C2002 E8 03000000 call 007C200A
007C2007 - E9 EB045D45 jmp 45D924F7
007C200C 55 push ebp
007C200D C3 retn
007C200E E8 01000000 call 007C2014
007C2013 EB 5D jmp short 007C2072
Aspack是常见的压缩壳,我们用esp定律直接脱去:
F7单步一下,然后对esp下硬件访问断点
F9运行,停到:
007C23B0 /75 08 jnz short 007C23BA
007C23B2 |B8 01000000 mov eax, 1
007C23B7 |C2 0C00 retn 0C
007C23BA \68 C38A4D00 push 004D8AC3
007C23BF C3 retn 这两条指令跳到OEP
单步运行:
004D8AC3 55 push ebp
004D8AC4 8BEC mov ebp, esp
004D8AC6 6A FF push -1
004D8AC8 68 E8127500 push 007512E8
004D8ACD 68 1CDB4D00 push 004DDB1C
004D8AD2 64:A1 00000000 mov eax, dword ptr fs:[0]
004D8AD8 50 push eax
004D8AD9 64:8925 0000000>mov dword ptr fs:[0], esp
004D8AE0 83EC 58 sub esp, 58
004D8AE3 53 push ebx
004D8AE4 56 push esi
004D8AE5 57 push edi
004D8AE6 8965 E8 mov dword ptr [ebp-18], esp
004D8AE9 FF15 64025100 call dword ptr [510264] ; kernel32.GetVersion
004D8AEF 33D2 xor edx, edx
此时脱壳完成,使用LoadPE dump出来,保存为dump.exe
打开ImportRec,修复IAT,输入OEP = 004D8AC3 – 400000 = D8AC3
ImportRec选择自动查找IAT即可,选择修复转储文件,选择dump.exe,ImportRec自动报错为dump_.exe脱壳完毕。
PEiD查壳dump_.exe, 为Microsoft Visual C++ 6.0编写
用OD打开dump_.exe文件:
F9运行,选择注册,输入错误的注册码:12345678,选择注册,弹出注册对话框:
检测结果:错误的注册码
回到OD,选择F12,选择K界面
选择C,回到当前页面
选择CTRL + G,输入 00459EC0
00459EB8 . 8D0470 lea eax, dword ptr [eax+esi*2]
00459EBB . 50 push eax ; /Style
00459EBC . 52 push edx ; |Title
00459EBD . 51 push ecx ; |Text
00459EBE . 6A 00 push 0 ; |hOwner = NULL
00459EC0 . FF15 C0065100 call dword ptr [<&user32.MessageBoxA>>; \MessageBoxA
00459EC6 . 5F pop edi,此处下断点
00459EC7 . 83F8 03 cmp eax, 3 ; Switch (cases 2..7)
00459ECA . 5E pop esi
选择F9运行
注册失败对话框点击确定,则程序停在00459EC6 . 5F pop edi,此处
向上翻页:
00459E20 . 83EC 64 sub esp, 64,此处下断点,删除00459EC6处断点
00459E23 . 56 push esi
00459E24 . 8B7424 74 mov esi, dword ptr [esp+74]
00459E28 . 57 push edi
00459E29 . 8B7E 08 mov edi, dword ptr [esi+8]
00459E2C . 57 push edi
00459E2D . E8 2E650700 call 004D0360
00459E32 . 83C4 04 add esp, 4
00459E35 . 85C0 test eax, eax
00459E37 . 74 10 je short 00459E49
重新选择注册:
程序停在00459E20 . 83EC 64 sub esp, 64 处
F8单步执行
我们发现无论怎么修改判定条件,程序都不能正常显示注册,那么我们就根据堆栈回溯:
0012F6B4 0047D2C1 返回到 dumped_.0047D2C1
0012F6B8 0012F6C4
0012F6BC 00000003
0012F6C0 0012F6D8
0012F6C4 00000000
0012F6C8 00000000
0012F6CC 00000000
0012F6D0 0043C536 返回到 dumped_.0043C536 来自 dumped_.00457AD5
使用CTRL+G来到0043C536处,并向上翻页
来到此处:
0043BE89 /$ 55 push ebp 这里下断点
0043BE8A |. 8BEC mov ebp, esp
0043BE8C |. 81EC 14000000 sub esp, 14
0043BE92 |. 6A FF push -1
0043BE94 |. 6A 08 push 8
0043BE96 |. 68 03200116 push 16012003
0043BE9B |. 68 8E190152 push 5201198E
0043BEA0 |. E8 60BC0100 call 00457B05
0043BEA5 |. 83C4 10 add esp, 10
0043BEA8 |. 8945 FC mov dword ptr [ebp-4], eax
0043BEAB |. 68 04000080 push 80000004
0043BEB0 |. 6A 00 push 0
0043BEB2 |. 8B45 FC mov eax, dword ptr [ebp-4]
0043BEB5 |. 85C0 test eax, eax
0043BEB7 |. 75 05 jnz short 0043BEBE
重新注册:
程序断到此处:
F8单步运行,F8的时候观察堆栈数据,
如下:
0012F6FC 00783C60 dumped_.00783C60
0012F700 0012F744
0012F704 00000001
0012F708 00D92628
0012F70C 001DAD60 ASCII "12345678"此处出现注册码
0012F710 /0012F744
选择出现注册码部分,数据窗口跟随,并下内存访问断点,断下后,并返回用户窗口:
得到如下算法部分:
004FC29F /$ A1 24257700 mov eax, dword ptr [772524]
004FC2A4 |. 53 push ebx
004FC2A5 |. 8B5C24 08 mov ebx, dword ptr [esp+8]
004FC2A9 |. 56 push esi
004FC2AA |. 8BF1 mov esi, ecx
004FC2AC |. 57 push edi
004FC2AD |. 85DB test ebx, ebx
004FC2AF |. 8906 mov dword ptr [esi], eax
004FC2B1 |. 74 36 je short 004FC2E9
004FC2B3 |. 8BC3 mov eax, ebx
004FC2B5 |. C1E8 10 shr eax, 10
004FC2B8 |. 66:85C0 test ax, ax
004FC2BB |. 75 0B jnz short 004FC2C8
004FC2BD |. 0FB7C3 movzx eax, bx
004FC2C0 |. 50 push eax
004FC2C1 |. E8 CC5A0000 call 00501D92
004FC2C6 |. EB 21 jmp short 004FC2E9
004FC2C8 |> 53 push ebx ; /String
004FC2C9 |. FF15 6C035100 call dword ptr [<&kernel32.lstrlen>] ; \lstrlenA
004FC2CF |. 8BF8 mov edi, eax
004FC2D1 |. 85FF test edi, edi
004FC2D3 |. 74 14 je short 004FC2E9
004FC2D5 |. 57 push edi
004FC2D6 |. 8BCE mov ecx, esi
004FC2D8 |. E8 C1FDFFFF call 004FC09E
004FC2DD |. 57 push edi
004FC2DE |. 53 push ebx
004FC2DF |. FF36 push dword ptr [esi]
004FC2E1 |. E8 BAF7FDFF call 004DBAA0
004FC2E6 |. 83C4 0C add esp, 0C
004FC2E9 |> 8BC6 mov eax, esi
004FC2EB |. 5F pop edi
004FC2EC |. 5E pop esi
004FC2ED |. 5B pop ebx
004FC2EE \. C2 0400 retn 4
此处我们只做爆破,算法部分大家自己去研究。
F8继续往下:
0043C344 |. 53 push ebx
0043C345 |. E8 97B70100 call 00457AE1
0043C34A |. 83C4 04 add esp, 4
0043C34D |> E8 78020000 call 0043C5CA
0043C352 |. 85C0 test eax, eax
0043C354 |. 0F84 52010000 je 0043C4AC 来看这是一个远跳转
此时,修改条件,使其不跳转,然后运行,则提示注册已成功
0043C35A |. 6A 00 push 0
0043C35C |. 68 01000000 push 1
0043C361 |. 6A FF push -1
0043C363 |. 6A 06 push 6
0043C365 |. 68 06200116 push 16012006
0043C36A |. 68 8E190152 push 5201198E
0043C36F |. E8 8BB70100 call 00457AFF
由此可见0043C5CA函数是算法验证部分,其返回为1的时候,表示验证成功。
所以我们做如下修改:
0043C344 |. 53 push ebx
0043C345 |. E8 97B70100 call 00457AE1
0043C34A |. 83C4 04 add esp, 4
0043C34D |> E8 78020000 call 0043C5CA
0043C352 |. 85C0 test eax, eax
0043C354 0F85 52010000 jnz 0043C4AC修改此处
0043C35A |. 6A 00 push 0
0043C35C |. 68 01000000 push 1
0043C361 |. 6A FF push -1
0043C363 |. 6A 06 push 6
保存文件为aaa.exe
运行aaa.exe,注册可以成功
但是在其他选项中,选择其他功能,则还是不能运行
用OD运行aaa.exe,选择设置,提示未注册版本无法使用此功能,请注册
此时我们按下F12,
来到00459EC6处,并向上翻页,断到
00459E20 . 83EC 64 sub esp, 64 下断点
00459E23 . 56 push esi
00459E24 . 8B7424 74 mov esi, dword ptr [esp+74]
00459E28 . 57 push edi
00459E29 . 8B7E 08 mov edi, dword ptr [esi+8]
00459E2C . 57 push edi
00459E2D . E8 2E650700 call 004D0360
00459E32 . 83C4 04 add esp, 4
00459E35 . 85C0 test eax, eax
00459E37 . 74 10 je short 00459E49
重新选择其他中的一个功能选项:
则程序断下:
00459E20 . 83EC 64 sub esp, 64 断在此处
00459E23 . 56 push esi
00459E24 . 8B7424 74 mov esi, dword ptr [esp+74]
00459E28 . 57 push edi
00459E29 . 8B7E 08 mov edi, dword ptr [esi+8]
00459E2C . 57 push edi
00459E2D . E8 2E650700 call 004D0360
查看栈中数据:
0012F6F0 0047D2C1 返回到 aaa.0047D2C1
0012F6F4 0012F700
0012F6F8 00000003
0012F6FC 0012F714
0012F700 00000000
0012F704 00000000
0012F708 00000000
0012F70C 0044EF9F 返回到 aaa.0044EF9F 来自 aaa.00457AD5
0012F710 00000003
CTRL+G 来到0044EF9F处
0044EF51 /. 55 push ebp 在此处下断点
0044EF52 |. 8BEC mov ebp, esp
0044EF54 |. 81EC 0C000000 sub esp, 0C
0044EF5A |. E8 2035FBFF call 0040247F
0044EF5F |. 8945 F8 mov dword ptr [ebp-8], eax
0044EF62 |. 837D F8 00 cmp dword ptr [ebp-8], 0
0044EF66 |. 0F85 58000000 jnz 0044EFC4
0044EF6C |. 68 04000080 push 80000004
0044EF71 |. 6A 00 push 0
0044EF73 |. 68 2AE25600 push 0056E22A
0044EF78 |. 68 01030080 push 80000301
0044EF7D |. 6A 00 push 0
0044EF7F |. 68 40000000 push 40
0044EF84 |. 68 04000080 push 80000004
0044EF89 |. 6A 00 push 0
0044EF8B |. 68 98E25600 push 0056E298
0044EF90 |. 68 03000000 push 3
0044EF95 |. BB 209E4500 mov ebx, 00459E20
0044EF9A |. E8 368B0000 call 00457AD5
0044EF9F |. 83C4 28 add esp, 28
重新选择其他选择,则断在此处:
0044EF51 /. 55 push ebp此处断下
0044EF52 |. 8BEC mov ebp, esp
0044EF54 |. 81EC 0C000000 sub esp, 0C
0044EF5A |. E8 2035FBFF call 0040247F
0044EF5F |. 8945 F8 mov dword ptr [ebp-8], eax
0044EF62 |. 837D F8 00 cmp dword ptr [ebp-8], 0
0044EF66 |. 0F85 58000000 jnz 0044EFC4 修改此处跳转,没有弹出对话框
所以修改如下:
0044EF5A |. E8 2035FBFF call 0040247F
0044EF5F |. 8945 F8 mov dword ptr [ebp-8], eax
0044EF62 837D F8 01 cmp dword ptr [ebp-8], 1
0044EF66 |. 0F85 58000000 jnz 0044EFC4
修改保存文件为bbb.exe
如此,就实现了第一个功能的爆破
同理在地址
0043BAD4 /. 55 push ebp
0043BAD5 |. 8BEC mov ebp, esp
0043BAD7 |. 81EC 0C000000 sub esp, 0C
0043BADD |. E8 9D69FCFF call 0040247F
0043BAE2 |. 8945 F8 mov dword ptr [ebp-8], eax
0043BAE5 |. 837D F8 00 cmp dword ptr [ebp-8], 0
0043BAE9 |. 0F85 58000000 jnz 0043BB47
修改为:
0043BAD4 /. 55 push ebp
0043BAD5 |. 8BEC mov ebp, esp
0043BAD7 |. 81EC 0C000000 sub esp, 0C
0043BADD |. E8 9D69FCFF call 0040247F
0043BAE2 |. 8945 F8 mov dword ptr [ebp-8], eax
0043BAE5 |. 837D F8 00 cmp dword ptr [ebp-8], 1
0043BAE9 |. 0F85 58000000 jnz 0043BB47
实现第二个功能的爆破
在地址
0043BBF1 /. 55 push ebp
0043BBF2 |. 8BEC mov ebp, esp
0043BBF4 |. 81EC 0C000000 sub esp, 0C
0043BBFA |. E8 8068FCFF call 0040247F
0043BBFF |. 8945 F8 mov dword ptr [ebp-8], eax
0043BC02 |. 837D F8 00 cmp dword ptr [ebp-8], 0
0043BC06 |. 0F85 58000000 jnz 0043BC64
修改为:
0043BBF1 /. 55 push ebp
0043BBF2 |. 8BEC mov ebp, esp
0043BBF4 |. 81EC 0C000000 sub esp, 0C
0043BBFA |. E8 8068FCFF call 0040247F
0043BBFF |. 8945 F8 mov dword ptr [ebp-8], eax
0043BC02 |. 837D F8 00 cmp dword ptr [ebp-8], 1
0043BC06 |. 0F85 58000000 jnz 0043BC64
实现第四个功能的爆破
此时已经对该软件完全爆破
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)