首页
社区
课程
招聘
[旧帖] [原创]应hwlin回应注册程序完全注册码破解全攻略 0.00雪花
发表于: 2010-4-23 01:58 5877

[旧帖] [原创]应hwlin回应注册程序完全注册码破解全攻略 0.00雪花

2010-4-23 01:58
5877
标题:凯越乐风防盗诊断匹配程序  完全注册码破解全攻略
作者: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虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 24
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好贴,应该写成通用的破解过程
2010-5-2 22:09
0
雪    币: 1222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
请问楼主,是先运行软件,再开OD调试吗?
2010-5-3 07:49
0
雪    币: 111
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这是先开程序,输入自己的注册码。配合C32ASM静态分析找断点,用OD下断点,再点注册,就断下来了。这样的步骤。
2010-5-3 08:55
0
雪    币: 226
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
说的还是很详细的,研究研究。
2010-5-3 09:10
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
写的很详细,收藏一下,有机会自己试一下
2010-5-3 09:38
0
雪    币: 24
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
好贴,应该写成通用的破解过程
2010-5-3 12:03
0
雪    币: 56
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
svf
8
“在CALL的入口下断点,跟到00470E1A的时候,”

请教:1)这个断点怎样下?在CALL点右键,按f2?
2)“跟到”是怎样跟?是用按F7跟吗?谢谢!
2010-5-9 13:31
0
雪    币: 111
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
在CALL那行点F2下断点
进CALL跟踪当然是用F7步入了,如果是F8就步过了
2010-5-9 19:58
0
雪    币: 58
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
好帖,学习学习
2010-5-9 20:46
0
雪    币: 58
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
附件DEFun.dll怎么是个病毒
2010-5-9 21:46
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢楼主 的帮助 与关注  

我加你QQ 请教下  

看了你的帖子 我还是没能追到注册码  内功差啊
2010-6-23 16:52
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
楼主您好  
我是您这这篇文章的 原软件 发帖者 看了您的帖子 深受 启发   

感谢您的分析  

兄弟愚笨  还请再赐教一二

我 F7 下去 一直找不到 码
2010-6-23 19:38
0
雪    币: 499
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
支持原创
2010-6-23 19:53
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
上传的附件:
2010-6-23 20:01
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
在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

跟到这里 是空白的  没有我输入的错误序列号
00470E1D    8B55 F8                mov edx,dword ptr ss:[ebp-8]  ;错误的软件序列号进EDX

请教了
2010-6-23 20:03
0
雪    币: 626
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
楼主你好   我是刚学这个的没点基础   现在我还不懂得 怎么用OD 也就是还不会用OD 更别说下断点  怎么去断咯   不知道你有你没有这类似的教程呢  可以的话 就到我系统信箱吧 谢谢
2010-6-23 23:27
0
雪    币: 111
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
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

这里才是关键部分,留意堆栈区域的内容。
2010-6-25 00:23
0
游客
登录 | 注册 方可回帖
返回
//