--------------------------------------------------------------------------------------------------------------------------------
思路:1)程序运行出现模态对话框,想去掉这个NAG框来达到破解,由于水平太差没成功;2)查找字符串来切入验证体系,没找到有用信息;3)API函数下断,能断下太返回太多前后花了差多1个半小时还没找到放弃;4)没办法最后只能用工具DEDE来直接找按钮事件。
1、DEDE载入程序,在注册窗体里找到三个按钮事件;用PPE Explorer查找具体是那个按钮,翻了一会还是没找到,OD载入程序F9跑起来输入注册信息果断三个全下断,点击“OK”断到按钮事件上;
0046E42C /. 55 push ebp ; 按钮事件
0046E42D |. 8BEC mov ebp,esp
0046E42F |. 83C4 8C add esp,-0x74
0046E432 |. 53 push ebx
0046E433 |. 56 push esi
0046E434 |. 57 push edi
………………………………………………………………………………………………………省略去中间N多代码
0046E605 |> \50 push eax
0046E606 |. 8B15 9C284D00 mov edx,dword ptr ds:[0x4D289C] ; Panorama.004D2614
0046E60C FF52 68 call dword ptr ds:[edx+0x68] ; 关键CALL
0046E60F |. 83C4 08 add esp,0x8
0046E612 |. BA 02000000 mov edx,0x2
0046E617 |. 50 push eax
0046E618 |. 8D45 E8 lea eax,dword ptr ss:[ebp-0x18]
0046E61B |. FF4D B8 dec dword ptr ss:[ebp-0x48]
0046E61E |. E8 15CA0300 call Panorama.004AB038
0046E623 |. FF4D B8 dec dword ptr ss:[ebp-0x48]
0046E626 |. 8D45 EC lea eax,dword ptr ss:[ebp-0x14]
0046E629 |. BA 02000000 mov edx,0x2
0046E62E |. E8 05CA0300 call Panorama.004AB038
0046E633 |. 59 pop ecx
0046E634 |. 85C9 test ecx,ecx
0046E636 |. 0F84 BC010000 je Panorama.0046E7F8 ; 关键跳 跳就注册失败
0046E63C |. 66:C745 AC 50>mov word ptr ss:[ebp-0x54],0x50
………………………………………………………………………………………………………省略去中间N多代码
0046E803 |. 83F8 02 cmp eax,0x2
0046E806 |. 7E 0D jle short Panorama.0046E815
0046E808 |. 8B15 BC644D00 mov edx,dword ptr ds:[<&VCL50.@Forms@App>; Vcl50.@Forms@Application
0046E80E |. 8B02 mov eax,dword ptr ds:[edx]
0046E810 |. E8 A5D90300 call <jmp.&VCL50.@Forms@TApplication@Ter>; 注册时点OK后有很大的缓冲
0046E815 |> 68 D0070000 push 0x7D0 ; /Timeout = 2000. ms
0046E81A |. E8 69E70300 call <jmp.&KERNEL32.Sleep> ; \Sleep
0046E81F |. 68 18DB0000 push 0xDB18
0046E824 |. E8 7FE60300 call <jmp.&PALNG._LoadRStr> ; 出现 注册信息错误
0046E829 |. 59 pop ecx
0046E82A |. 8BD8 mov ebx,eax
2、按钮事件里CALL很多,一个一个具体分析的话容易出错把头转晕而且花时间也多,今天听了Nisy大大的第八课,正好听到 “如果一个CALL调用地方太多一般不是关键CALL” 按照这个方法以及要跳过下面的注册出错误这两个原则,找到关键CALL及关键跳转,F7进关键CALL;
1004442F CC int3
10044430 . 8B4424 04 mov eax,dword ptr ss:[esp+0x4]
10044434 . 57 push edi
10044435 . 8B7C24 0C mov edi,dword ptr ss:[esp+0xC]
10044439 . 50 push eax
1004443A . E8 41FDFBFF call ppano.10004180 ;F7进:看到这段代码没有对eax赋值等操作
1004443F . 83C4 04 add esp,0x4
10044442 . 5F pop edi
10044443 . C3 retn
100041D8 |.^\75 FA \jnz short ppano.100041D4
100041DA |> E8 61280500 call ppano.10056A40 ; F7进去可以找到另一个爆破点
100041DF |. 84C0 test al,al
100041E1 |. 74 1A je short ppano.100041FD
100041E3 |. 803D DEAD1510>cmp byte ptr ds:[0x1015ADDE],0xE7
100041EA |. 75 11 jnz short ppano.100041FD
100041EC |. 803D DDAD1510>cmp byte ptr ds:[0x1015ADDD],0xF6
100041F3 |. 75 08 jnz short ppano.100041FD
100041F5 |. B8 01000000 mov eax,0x1
100041FA |. 5E pop esi
100041FB |. 5B pop ebx
100041FC |. C3 retn
100041FD |> 5E pop esi
100041FE |. 33C0 xor eax,eax ; 爆破点:or eax,eax或mov al,1
10004200 |. 5B pop ebx
10004201 \. C3 retn
4、F7进上面100041DA |> E8 61280500 call ppano.10056A40
代码:
10056D5A |. E8 41020000 call ppano.10056FA0
10056D5F |. 8B8C24 DC0400>mov ecx,dword ptr ss:[esp+0x4DC]
10056D66 |. 8A4424 13 mov al,byte ptr ss:[esp+0x13] ; 爆破点:mov al,1或把esp+0x13修改为esp-/+上一个数值,使它所在内存中的值不为零
10056D6A |. 5F pop edi
10056D6B |. 5E pop esi
10056D6C |. 64:890D 00000>mov dword ptr fs:[0],ecx
10056D73 |. 5B pop ebx
10056D74 |. 8BE5 mov esp,ebp
10056D76 |. 5D pop ebp
10056D77 \. C3 retn
----------------------------------------------------------------------------------------------------------------------------
【破解总结】:
1、关键字符串查找不到,这点做好;
2、API函数能断下但返回点找不位,使分析者花很多精力而放弃;
3、只修改关键跳转还是注册失败,有二次验证但在关键CALL里没找到这个二次验证调用的地方;
4、这个二次验证调用的地方应该在关键CALL与上面第3步中第一个爆破点之间(如果在这个爆破点之后调用来实现二次验证,那这个地方爆破就会失败);
5、这个软件再高版本就换C++写的,没有搞定。
6、想用DUP2来做DLL的补丁(今天N大的第八介绍了DUP怎样做exe文件补丁),最终没折腾出这个用这个DLL的补丁,到N大说了怎样做DLL再回来补做一个;
----------------------------------------------------------------------------------------------------------------------------
【版权声明】:
本文原创于geekcat,转载请注明作者并保存文章的完整!