从爆破到注册算法流程,再到注册机的编写
从爆破到注册算法流程,再到注册机的编写2006-10-21 23:49【软件介绍】WinReplace 批量文件内容替换工具 是一款功能强大的多文件字符串替换工具,它可以在不打开文件的情况下,批量地将文件中匹配的字符串一次性替换成您定义的内容。它可以处理所有的二进制格式的文件,包括文本文件和HTML文件等。它还可以做到:
1.系统支持拖放功能,您可以用鼠标将系统中的文件拖入左边列表框中。
2.如果您搜索的是文件夹,您可以在『设置』中选择是仅搜索该文件夹下的文件,还是搜索该文件夹和子文件夹下的所有文件。
3.在查找或者替换文件之前,您可以在查找或者替换对话框时选择是否应用“区分大小写”选项。
4.在查找和替换的过程中,您可以点击工具栏上的『暂停』或者『停止』按钮来暂停或者停止程序的进行。
5.您可以在『设置』中选中“启用自动备份功能”,系统会在替换前先备份要替换的文件。
6.系统设置改变后,不用重新运行软件,系统设置是即时生效的。
【软件爆破】
使用PEID检测到程序为Borland Delphi 6.0 - 7.0编写,没壳,一个字形容,就是爽,接着运行程序,首先看到的是未注册的限制,简单明了,谢谢作者这么好心的提示.
试一下乱注册,发现有错误的对话框提示.
哇塞~~形势是一片大好哪,高兴ING,兴奋的我马上出动OD载入程序,然后迫不及待的使用老罗最新发布的超级字符串插件,发现能搜到上面出现的内容,如下面信息和图3所示:
Ultra String Reference Plugin,项目 568
Address=004B11E6
Disassembly=push WinRepla.004B1258
Text String=注册失败,请与作者联系
小提示:这个信息在后来发现只是验证注册码长度的,如果注册码小于8位就会出现,大于等于8位就不会出现的.
“简体中文版(未注册版本,1次只能操作3个文件,购买只要15元人民币)”双击到代码处:
04B2601 8B45 FC mov eax,dword ptr ss:
004B2604 BA 7C264B00 mov edx,WinRepla.004B267C ; ligang,thanks!
004B2609 E8 D61FF5FF call WinRepla.004045E4 /// 经典比较
004B260E 75 1E jnz short WinRepla.004B262E /// 不相等的话,就是未注册版本,直接跳到下面的004B262E,显示未注册,将jnz改为je
004B2610 33D2 xor edx,edx
004B2612 8BC3 mov eax,ebx
004B2614 E8 E3000000 call WinRepla.004B26FC
004B2619 C605 647D4B00 01 mov byte ptr ds:,1
004B2620 BA 94264B00 mov edx,WinRepla.004B2694 ; winreplace简体中文版 /// 注册后显示的内容
004B2625 8BC3 mov eax,ebx
004B2627 E8 B4B5FBFF call WinRepla.0046DBE0
004B262C EB 1C jmp short WinRepla.004B264A
004B262E B2 01 mov dl,1
004B2630 8BC3 mov eax,ebx
004B2632 E8 C5000000 call WinRepla.004B26FC
004B2637 C605 647D4B00 00 mov byte ptr ds:,0
004B263E BA B4264B00 mov edx,WinRepla.004B26B4 ; winreplace简体中文版(未注册版本,1次只能操作3个文件,购买只要15元人民币) /// 未注册前显示的内容
………………
在004B2609处是比较是否注册版本,这个就好比是一个决策者,而下面的关键跳转就好比是一个执行者,如果是注册版,那么就不用执行跳转,如果是未注册版,那么就执行跳转,所以我们如果要使用注册版本的话,那么这里就一定不能够跳走,否则就是未注册版本了,修改方法就是将jnz改为je,继续寻找另一处爆破点,找到“winreplace简体中文版”双击它到代码处.
004B3E1E E8 D9E8FFFF call WinRepla.004B26FC
004B3E23 A1 58654B00 mov eax,dword ptr ds:
004B3E28 8B00 mov eax,dword ptr ds:
004B3E2A 8A80 1C030000 mov al,byte ptr ds:
004B3E30 A2 647D4B00 mov byte ptr ds:,al
004B3E35 803D 647D4B00 01 cmp byte ptr ds:,1
004B3E3C 75 0C jnz short WinRepla.004B3E4A /// 这里jnz改为jmp
004B3E3E BA 543E4B00 mov edx,WinRepla.004B3E54 ; winreplace简体中文版
………………
这里在004B3E35处同样有一个比较,的值如果为1的话,那么将执行注册版本的流程,如果不是1的话,那么将执行未注册版的流程,所以这里也一定不能让它跳过去,修改方法和上面一样,将jnz改为je。
最后,将修改的这两处保存,再运行程序,发现程序已经没有原来运行时弹出来的NAG了,再看看程序的界面,也发现原来的“winreplace简体中文版(未注册版本,1次只能操作3个文件,购买只要15元人民币)”已经不见了,再操作4个以上的文件试试,发现没有了原来的限制,到这里,爆破基本完成了
【追踪注册算法】
使用字符串插件后,还发现一个有用的信息:
Ultra String Reference Plugin,项目 559
Address=004B0B4C
Disassembly=mov edx,WinRepla.004B0BD4
Text String=registername
这里搜索后看到有两处,发现第一处不是关键点,所以在第二处看看,发现这里就是关键地方,代码分析如下:
004B12B4 8D55 F8 lea edx,dword ptr ss:
004B12B7 E8 9472F5FF call WinRepla.00408550
004B12BC 8B45 FC mov eax,dword ptr ss:
004B12BF E8 D431F5FF call WinRepla.00404498
004B12C4 85C0 test eax,eax ; 是否输入用户名?
004B12C6 74 0C je short WinRepla.004B12D4 ; 没输入就OVER
004B12C8 8B45 F8 mov eax,dword ptr ss:
004B12CB E8 C831F5FF call WinRepla.00404498
004B12D0 85C0 test eax,eax ; 是否输入注册码?
004B12D2 75 1B jnz short WinRepla.004B12EF ; 没输入就OVER
004B12D4 6A 10 push 10
004B12D6 68 54134B00 push WinRepla.004B1354
004B12DB 68 5C134B00 push WinRepla.004B135C
004B12E0 8BC3 mov eax,ebx
004B12E2 E8 0932FCFF call WinRepla.004744F0
004B12E7 50 push eax
004B12E8 E8 6F5BF5FF call <jmp.&user32.MessageBoxA> ; 没输入的话,来到这里就没得玩了
004B12ED EB 31 jmp short WinRepla.004B1320
004B12EF 8B4D F8 mov ecx,dword ptr ss:
004B12F2 8B55 FC mov edx,dword ptr ss:
004B12F5 8BC3 mov eax,ebx
004B12F7 E8 7CFDFFFF call WinRepla.004B1078 ; 算法CALL,跟进
004B12FC 3C 01 cmp al,1 ; 与1比较
004B12FE 75 19 jnz short WinRepla.004B1319 ; 不相等就注册失败
004B1300 E8 A7FCFFFF call WinRepla.004B0FAC
004B1305 8B55 FC mov edx,dword ptr ss:
004B1308 B8 84134B00 mov eax,WinRepla.004B1384 ; ASCII "registername"
004B130D E8 B6FBFFFF call WinRepla.004B0EC8
004B1312 C683 1C030000 01 mov byte ptr ds:,1 ; 注册成功标志
004B1319 8BC3 mov eax,ebx
004B131B E8 4094FDFF call WinRepla.0048A760
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
光是看上面的代码,还不能够将注册流程分析出来的,所以一般都要跟进核心的算法Call去分析的,进去后看到下面的代码:
004B10D3 83F8 08 cmp eax,8 ; 注册码长度与8比较
004B10D6 8D45 EC lea eax,dword ptr ss:
004B10D9 50 push eax
004B10DA 8B45 F0 mov eax,dword ptr ss:
004B10DD E8 B633F5FF call WinRepla.00404498
………………
上面代码分析出的结果一个,就是注册码长度与8比较,但是注册码长度是小于8位还是大于8位,又或是等于8位,表面看来还不太清楚,但是从后面的代码知道注册码长度至少为8位,否则一定没得玩,具体我们继续分析:
004B1110 E8 8333F5FF call WinRepla.00404498 ; 获取用户名长度
004B1115 8BF0 mov esi,eax ; 用户名长度转移
004B1117 8D45 DC lea eax,dword ptr ss:
004B111A 50 push eax
004B111B B9 04000000 mov ecx,4
004B1120 BA 01000000 mov edx,1
004B1125 8B45 F0 mov eax,dword ptr ss:
004B1128 E8 CB35F5FF call WinRepla.004046F8
004B112D 8B45 DC mov eax,dword ptr ss:
004B1130 E8 BF77F5FF call WinRepla.004088F4
004B1135 8BF8 mov edi,eax ; 注册码的前四位转移到edi
004B1137 8D45 D8 lea eax,dword ptr ss:
004B113A 50 push eax
004B113B B9 02000000 mov ecx,2
004B1140 BA 05000000 mov edx,5
004B1145 8B45 F0 mov eax,dword ptr ss:
004B1148 E8 AB35F5FF call WinRepla.004046F8
004B114D 8B45 D8 mov eax,dword ptr ss: ; 注册码的五六位转移到eax
004B1150 E8 9F77F5FF call WinRepla.004088F4
004B1155 8945 F8 mov dword ptr ss:,eax
004B1158 8D45 D4 lea eax,dword ptr ss:
004B115B 50 push eax
004B115C B9 02000000 mov ecx,2
004B1161 BA 07000000 mov edx,7
004B1166 8B45 F0 mov eax,dword ptr ss:
004B1169 E8 8A35F5FF call WinRepla.004046F8
004B116E 8B45 D4 mov eax,dword ptr ss: ; 注册码的七八位转移
004B1171 E8 7E77F5FF call WinRepla.004088F4 ; 注册码长度至少为8位,否则一定没得玩
004B1176 8945 F4 mov dword ptr ss:,eax ;
004B1179 8D55 D0 lea edx,dword ptr ss:
004B117C 8D047F lea eax,dword ptr ds: ; 这里计算得到第一段注册码
004B117F E8 3476F5FF call WinRepla.004087B8
004B1184 FF75 D0 push dword ptr ss: ; 然后入栈
004B1187 8D55 CC lea edx,dword ptr ss:
004B118A 8B45 F4 mov eax,dword ptr ss:
004B118D 03C0 add eax,eax ;这里计算第二段注册码
004B118F E8 2476F5FF call WinRepla.004087B8
004B1194 FF75 CC push dword ptr ss: ; 然后入栈
004B1197 8D55 C8 lea edx,dword ptr ss:
004B119A 6BC6 0D imul eax,esi,0D ; 这里计算第三段注册码
004B119D E8 1676F5FF call WinRepla.004087B8
004B11A2 FF75 C8 push dword ptr ss: ; 然后入栈
004B11A5 8D55 C4 lea edx,dword ptr ss:
004B11A8 6B45 F8 43 imul eax,dword ptr ss:,43 ; 这里计算第四段注册码
004B11AC E8 0776F5FF call WinRepla.004087B8
004B11B1 FF75 C4 push dword ptr ss: ; 然后入栈
004B11B4 8D45 F0 lea eax,dword ptr ss:
004B11B7 BA 04000000 mov edx,4
004B11BC E8 9733F5FF call WinRepla.00404558
004B11C1 8B45 EC mov eax,dword ptr ss:
004B11C4 8B55 F0 mov edx,dword ptr ss:
004B11C7 E8 1834F5FF call WinRepla.004045E4 ; 这里可做内存注册机
004B11CC 75 02 jnz short WinRepla.004B11D0
004B11CE B3 01 mov bl,1 ; 注册成功标志
004B11D0 33C0 xor eax,eax
004B11D2 5A pop edx
004B11D3 59 pop ecx
………………
总结一下注册算法以方面下面的注册机编写:
1) 注册码与用户名长度、假注册码有关,并且经过四段的注册计算;
2) 第一段计算为:假注册码前四位+假注册码前四位*2
3) 第二段计算为:假注册码七八位*2
4) 第三段计算为:用户名长度*Dh
5) 第四段计算为:假注册码五六位*43h
到这里,整个注册流程已经彻底曝光出来了,选择一款你喜欢的编程语言或者用Keymake做出一个注册机吧!
【注册机编写】
注册机的编写一般有两种,一种就是使用Keymake做出来的内存注册机,另一种就是使用编程语言自己编出来的算法注册机
小知识:做出来的内存注册机,一般要放到程序安装的那个文件夹才可以正常使用。
好了,如果你选择Keymake的话,那么在004B11C7处就可以做出来,前几期的杂志都有介绍,这里不多说了,下面我使用VB来做一个算法注册机吧。
其“计算”按钮的源代码如下:
Private Sub Command1_Click()
Dim a, b, c, d, zcm As String
If Len(Text2.Text) >= 8 Then
a = Mid(Text2.Text, 1, 4)
a = a * 2 + a
b = Mid(Text2.Text, 7, 2)
b = b * 2
c = Len(Text1.Text)
c = c * 13
d = Mid(Text2.Text, 5, 2)
d = d * 67
zcm = a & b & c & d
Text3.Text = zcm
Else: MsgBox ("请输入8位或者8位以上的假的注册码")
End If
End Sub
代码比较简单,不懂的话,看多几次就应该看得明白的了!!
类 学习收藏了。 注册算法变化较多,学起来有些困难。 还要学习阿!!!! 写得很详细,正在学习中……谢谢 真不知道该如何学习算法~! 经典呀!学习学习。 楼主分析的透彻1!!该好好学习一番 学习学习~~~
页:
[1]
2