标题:凯越乐风防盗诊断匹配程序 完全注册码破解全攻略
作者:knightsoft (ryo)
时间:2010年4月22日
论坛上的hwlin兄弟发了个软件研究,所以看了下,贴出分析的过程与大家共同研究。
原贴地址:【求助】用NOP填充了两个地方有效果 还是注册失败
http://bbs.pediy.com/showthread.php?t=99154
原程序地址:http://www.qcc123.com/www/ky.rar
准备工具:flyODBG V1.10 修改版(全插件),C32ASM或WDASM
运行程序,打开注册输入框,随便填入三个值:
用户申请码:12345678
软件序列号:23456789
软件注册码:34567890
根据C32ASM分析字符串查找“尊敬的用户,您输入的注册信息不正确,请和软件供应商联系”找到该地址
00473F91 8B45 EC mov eax,dword ptr ss:[ebp-14]
00473F94 5A pop edx
00473F95 59 pop ecx
00473F96 E8 39CEFFFF call ky原文件.00470DD4 ;比对CALL调用
00473F9B 84C0 test al,al
00473F9D 75 0C jnz short ky原文件.00473FAB ;没跳就注册成功,跳过就显示“尊敬的用户,您输入的注册信息不正确,请和软件供应商联系”
00473F9F B8 14404700 mov eax,ky原文件.00474014
00473FA4 E8 9F40FBFF call ky原文件.00428048
00473FA9 EB 16 jmp short ky原文件.00473FC1
00473FAB B8 54404700 mov eax,ky原文件.00474054
00473FB0 E8 9340FBFF call ky原文件.00428048
00473FB5 A1 F41A4800 mov eax,dword ptr ds:[481AF4]
00473FBA 8B00 mov eax,dword ptr ds:[eax]
00473FBC E8 B370FEFF call ky原文件.0045B074
00473FC1 33C0 xor eax,eax
00473FC3 5A pop edx
00473FC4 59 pop ecx
00473FC5 59 pop ecx
00473FC6 64:8910 mov dword ptr fs:[eax],edx
00473FC9 68 06404700 push ky原文件.00474006
所以上面那个比对调用的CALL是关键。跟进去,看下是怎么判断的。注意下面整个CALL代码的寄存器变化,我已经加了详细的注释。
在CALL的入口下断点,跟到00470E1A的时候,寄存器窗口发生了变化,显示对应ECX地址内的ASCII字符了,这个字符就是我们输入错误的软件注册码。
00470E1A 8D4D F0 lea ecx,dword ptr ss:[ebp-10] ;错误的软件注册码进ECX
00470E1D 8B55 F8 mov edx,dword ptr ss:[ebp-8] ;错误的软件序列号进EDX
00470E20 8B45 FC mov eax,dword ptr ss:[ebp-4] ;错误的用户序列号进EAX
F7单步到下一行,EDX对应地址内出现了我们输入错误的软件序列号,继续F7到下一行,EAX对应地址内出现了我们输入错误的错误的用户序列号。
这表明,3个输入的值都开始要准备好运算了。
F7到了00470E23的CALL,经分析,这个CALL的作用是比对我们输入的3个值是否为空的,为空就直接跳到注册失败,因为输入不为空,所以这里不会跳到注册失败。
后面接下来的几行就是寄存器取地址的准备工作了,F7步过。
00470E3A 33C0 xor eax,eax
00470E3C 55 push ebp
00470E3D 68 120F4700 push ky原文件.00470F12
00470E42 64:FF30 push dword ptr fs:[eax]
00470E45 64:8920 mov dword ptr fs:[eax],esp
到00470E48时,EAX对应地址中出现了“9F8F-832E-A6BA-456789”字样的ASCII字符,不会吧,竟然是明码,猜想就是正确的值了。
00470E48 8B45 F0 mov eax,dword ptr ss:[ebp-10] ;输入正确的软件序列号值到EAX
F7接下来,我们输入错误的软件序列号出现了
00470E4B 8B55 F8 mov edx,dword ptr ss:[ebp-8] ;输入错误的软件序列号值到EDX
紧跟后面有个CALL调用和一个跳转,那比对的过程就在这个CALL里
00470E4E E8 E135F9FF call ky原文件.00404434 ;比对CALL调用
00470E53 0F85 AF000000 jnz ky原文件.00470F08
跟进去,看下是怎么比对的。
00404434 53 push ebx
00404435 56 push esi
00404436 57 push edi
00404437 89C6 mov esi,eax
00404439 89D7 mov edi,edx
0040443B 39D0 cmp eax,edx ;这里是关键,比对EAX和EDX的值
0040443D 0F84 8F000000 je ky原文件.004044D2 ;相等就跳了,表明输入的软件序列号正确,如果不正确,就继续往下走运算比对。
00404443 85F6 test esi,esi
00404445 74 68 je short ky原文件.004044AF
可以返回了,到RET返回,总算回到跳转了
00470E53 0F85 AF000000 jnz ky原文件.00470F08 ;不相等则跳,GAMEOVER
如果是爆破,当然是改这里的跳转了。接下来是另一个软件注册码的比对
到00470E59时,EDX对应地址中出现了“TO4kDOBFTQ1E0MEF”字样的ASCII字符,不会吧,竟然也是明码,猜想就是正确的值了。
00470E59 8B45 EC mov eax,dword ptr ss:[ebp-14] ;输入正确的软件注册码值到EAX
F7接下来,我们输入错误的软件序列号出现了
00470E5C 8B55 F4 mov edx,dword ptr ss:[ebp-C] ;输入错误的软件注册码值到EDX
继续调用刚才的那个比对的CALL
00470E5F E8 D035F9FF call ky原文件.00404434 ;比对CALL调用
出了比对,跳转的地址和上个跳转一样
00470E64 0F85 9E000000 jnz ky原文件.00470F08 ;不相等则跳,GAMEOVER
现在整理一下整个00473F96的call调用的代码
00470DD4 55 push ebp
00470DD5 8BEC mov ebp,esp
00470DD7 83C4 E8 add esp,-18
00470DDA 53 push ebx
00470DDB 56 push esi
00470DDC 57 push edi
00470DDD 33DB xor ebx,ebx
00470DDF 895D F0 mov dword ptr ss:[ebp-10],ebx
00470DE2 895D EC mov dword ptr ss:[ebp-14],ebx
00470DE5 894D F4 mov dword ptr ss:[ebp-C],ecx
00470DE8 8955 F8 mov dword ptr ss:[ebp-8],edx
00470DEB 8945 FC mov dword ptr ss:[ebp-4],eax
00470DEE 8B45 FC mov eax,dword ptr ss:[ebp-4]
00470DF1 E8 E236F9FF call ky原文件.004044D8
00470DF6 8B45 F8 mov eax,dword ptr ss:[ebp-8]
00470DF9 E8 DA36F9FF call ky原文件.004044D8
00470DFE 8B45 F4 mov eax,dword ptr ss:[ebp-C]
00470E01 E8 D236F9FF call ky原文件.004044D8
00470E06 33C0 xor eax,eax
00470E08 55 push ebp
00470E09 68 390F4700 push ky原文件.00470F39
00470E0E 64:FF30 push dword ptr fs:[eax]
00470E11 64:8920 mov dword ptr fs:[eax],esp
00470E14 33DB xor ebx,ebx
00470E16 8D45 EC lea eax,dword ptr ss:[ebp-14]
00470E19 50 push eax
00470E1A 8D4D F0 lea ecx,dword ptr ss:[ebp-10] ;错误的软件注册码进ECX
00470E1D 8B55 F8 mov edx,dword ptr ss:[ebp-8] ;错误的软件序列号进EDX
00470E20 8B45 FC mov eax,dword ptr ss:[ebp-4] ;错误的用户序列号进EAX
00470E23 E8 B4010000 call ky原文件.00470FDC ;比对输入信息是否为空调用
00470E28 A2 3C324800 mov byte ptr ds:[48323C],al ;不为空则返回AL为1,空则返回AL为0
00470E2D 803D 3C324800 00 cmp byte ptr ds:[48323C],0 ;比对输入是否为空
00470E34 0F84 E4000000 je ky原文件.00470F1E ;输入为空则跳
00470E3A 33C0 xor eax,eax
00470E3C 55 push ebp
00470E3D 68 120F4700 push ky原文件.00470F12
00470E42 64:FF30 push dword ptr fs:[eax]
00470E45 64:8920 mov dword ptr fs:[eax],esp
00470E48 8B45 F0 mov eax,dword ptr ss:[ebp-10] ;输入正确的软件序列号值到EAX
00470E4B 8B55 F8 mov edx,dword ptr ss:[ebp-8] ;输入错误的软件序列号值到EDX
00470E4E E8 E135F9FF call ky原文件.00404434 ;比对CALL调用
00470E53 0F85 AF000000 jnz ky原文件.00470F08 ;不相等则跳,GAMEOVER
00470E59 8B45 EC mov eax,dword ptr ss:[ebp-14] ;输入正确的软件注册码值到EAX
00470E5C 8B55 F4 mov edx,dword ptr ss:[ebp-C] ;输入错误的软件注册码值到EDX
00470E5F E8 D035F9FF call ky原文件.00404434 ;比对CALL调用
00470E64 0F85 9E000000 jnz ky原文件.00470F08 ;不相等则跳,GAMEOVER
00470E6A 807D 08 00 cmp byte ptr ss:[ebp+8],0
00470E6E 0F84 92000000 je ky原文件.00470F06
00470E74 33C0 xor eax,eax
00470E76 55 push ebp
00470E77 68 FF0E4700 push ky原文件.00470EFF
00470E7C 64:FF30 push dword ptr fs:[eax]
00470E7F 64:8920 mov dword ptr fs:[eax],esp
00470E82 B2 01 mov dl,1
00470E84 A1 60A74200 mov eax,dword ptr ds:[42A760]
00470E89 E8 D299FBFF call ky原文件.0042A860
00470E8E 8945 E8 mov dword ptr ss:[ebp-18],eax
00470E91 BA 02000080 mov edx,80000002
00470E96 8B45 E8 mov eax,dword ptr ss:[ebp-18]
00470E99 E8 629AFBFF call ky原文件.0042A900
00470E9E B1 01 mov cl,1
00470EA0 BA 540F4700 mov edx,ky原文件.00470F54 ; ASCII "\Software\WEST\License_BuickExcelle_IMMO\RegisterInfo" ;查注册表信息
00470EA5 8B45 E8 mov eax,dword ptr ss:[ebp-18]
00470EA8 E8 B79AFBFF call ky原文件.0042A964
00470EAD 84C0 test al,al
00470EAF 74 30 je short ky原文件.00470EE1
00470EB1 8B4D FC mov ecx,dword ptr ss:[ebp-4]
00470EB4 BA 940F4700 mov edx,ky原文件.00470F94 ; ASCII "UserSerialNo" ;查注册表信息
00470EB9 8B45 E8 mov eax,dword ptr ss:[ebp-18]
00470EBC E8 3F9CFBFF call ky原文件.0042AB00
00470EC1 8B4D F8 mov ecx,dword ptr ss:[ebp-8]
00470EC4 BA AC0F4700 mov edx,ky原文件.00470FAC ; ASCII "SoftwareSerialNo"
00470EC9 8B45 E8 mov eax,dword ptr ss:[ebp-18]
00470ECC E8 2F9CFBFF call ky原文件.0042AB00
00470ED1 8B4D F4 mov ecx,dword ptr ss:[ebp-C]
00470ED4 BA C80F4700 mov edx,ky原文件.00470FC8 ; ASCII "SoftwareRegisterNo" ;查注册表信息
00470ED9 8B45 E8 mov eax,dword ptr ss:[ebp-18]
00470EDC E8 1F9CFBFF call ky原文件.0042AB00
00470EE1 8B45 E8 mov eax,dword ptr ss:[ebp-18]
00470EE4 E8 E799FBFF call ky原文件.0042A8D0
00470EE9 33C0 xor eax,eax
00470EEB 5A pop edx
00470EEC 59 pop ecx
00470EED 59 pop ecx
00470EEE 64:8910 mov dword ptr fs:[eax],edx
00470EF1 68 060F4700 push ky原文件.00470F06
00470EF6 8B45 E8 mov eax,dword ptr ss:[ebp-18]
00470EF9 E8 DA23F9FF call ky原文件.004032D8
00470EFE C3 retn
整理一下内容:(如下值仅做参考,因为注册码运算是取硬盘和CPU的ID得来的)
(自己随便输入的)
用户申请码:12345678
软件序列号:23456789
软件注册码:34567890
(跟踪得出的正确的)
用户申请码:12345678
软件序列号:9F8F-832E-A6BA-456789
软件注册码:TO4kDOBFTQ1E0MEF
下面附上跟踪过程中根据程序调用内存情况的内存部分转存数据:
00EA3FF0 53 4E 3A 31 32 33 34 35 36 37 38 48 44 3A 57 44 SN:12345678HD:WD
00EA4000 2D 57 4D 41 4D 39 4C 34 34 36 38 32 36 43 50 55 -WMAM9L446826CPU
00EA4010 3A 33 39 31 34 33 39 31 34 30 31 32 36 36 31 34 :391439140126614
00EA4020 40 00 00 00 27 00 00 00 01 00 00 00 15 00 00 00 @...'.........
00EA4030 39 46 46 32 2D 38 33 31 39 2D 41 36 39 39 2D 33 9FF2-8319-A699-3
00EA4040 34 35 36 37 38 00 E9 00 08 26 48 00 08 26 48 00 45678.?&H.&H.
00EA4050 50 10 00 00 46 46 46 46 46 34 43 38 00 00 44 36 P..FFFFF4C8..D6
这表明该程序的注册码运算是调用了硬盘和CPU的ID的,我也没去仔细研究运算的过程了,有兴趣的朋友可以研究下。
好了,在上面相应的几个比对和跳转上下断点,重新载入程序,你会发现程序重起验证的时候也调用了这些地址,所以会中断下来。到此,正确的注册码已经拿到了,输入就可以注册成功了,可以收工了。
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法