本帖最后由 winddyj 于 2021-3-22 11:33 编辑
起因:前几天在论坛求助区看到这样一篇帖子[这个软件注册码有时间限制]
https://www.52pojie.cn/thread-1382492-1-1.html
标题很新颖,于是就下载了,发现破解起来很简单,两个跳转一改就行了,看到众多大佬已经回过解决方式,以为就此结束了。
软件用的是sql server的数据库,自带一个贼小巧的数据库服务端,想着以后写软件或调试软件方便,就把它留下了。
过了几天,看到楼主还在研究这个软件,应该是工作中要用到这个软件吧,害怕爆破存在暗桩,闲来无事,就分析一下吧。
如果你们打开软件有这个提示,请系统的数据格式里修改下短日期格式
改成这种带-的就行了。
运行了数据库服务端,打开软件,输入密码8968登陆,就来到了喜闻乐见的重启验证环节。
是不是很专业,4位一组,一共4组,很多刚入行的兄弟见到这样的场面可能就会犯晕,觉得太复杂了。
其实静下心来,慢慢分析,和普通的也差不多,就是表现形式有点不一样。
随便输入一组码遛它一下,看看是啥情况。
注册码检验和错误,还不是注册码错误,大致能推断出注册码先判断数据格式,再判断对错。
先查壳,无壳,Delphi写的,咱们先OD载入,看看情况,再决定用不用DeDe
直接能找到错误提示,看样子一个OD足矣了,确实要判断两次。
双击注册码检验和错误这行,转到代码窗口,就能看到关键跳,相等就能路过这个错误提示,如果爆破就改JMP
再向后拉一些,就能看到注册码的跳转了,要跳过这个错误提示,需要再向上看一点
相等就不跳,这样才能顺利走到下面的JMP来跳过错误,所以爆破这儿改NOP。
好了,爆破看完了,我们来研究下注册码。回到注册码检验和错误那儿,向上翻翻,咱们来跟一下。
OD已经帮我们分析好数据了,在错误提示上面,一共有5个循环,在第一个循环入口处下断,输入注册码,成功断下来了。
F8步进,遇CALL就F7进去瞧瞧,发现前两个循环的作用,就是把机器码和我们的注册码,按2位一组取出,转换成16进制,保存下来,一共八组。
从数据窗口里能看到,排列很整齐,上面两行是我们的注册码,下面两行是机器码。
继续再向下看,发现接下来两组循环的结构是一样,大胆猜测下,应该是分别对机器码和注册码处理。
还是F8单步,遇CALL就F7进去看看。
倒不是特别复杂,先将机器码/注册码 第七组拿出,进行AND F0操作,结果与0x60比较(结果不保存),
小于0x60时,第七组XOR 3,并把结果重写入第七组,大于等于0x60时保持不变。
然后将第八组数据与第七组比较,大于时 用第七组-第八组+0x64,小于时 第七组-第八组,结果写入第七组
然后继续循环,从第七组循环到第一组,共七次,第八组数据始终不变化。
说起来繁琐,写代码的话,几句就解释清楚了
a7 = a7 AND F0
if a7 < 0x60 then a7 xor 3
if a8 > a7 then a7 + 0x64
a7 = a7 - a8
接下来就是检验和的最后一个循环了,很简单,把注册码从第一组累加到第七组,每加一次就和0x64对比(也就是100)
大于等于100就减100,然后继续累加,确保最后结果在100以内。
最后的结果和第八组对比,相等就说明检验和正常,否则失败。
现在我们已经完成万里长征第一步,撒花庆祝,虽然一共只有两步
我们继续,很轻松能看出,两个跳转,判断我们的注册码第一组和第二组是否小于等于99,小于等于99时,就继续
这里继续判断,第一组和第二组数据连起来,是否为1901,第三组是否为3,第四组是否为C。
第六组是否小于等于C,第七组是否小于等于1F。
看到这里,我们对这些数据应该也有了大致的理解,第六组数据不能大于12,第七组数据不能大于31,这就是月和天呗。
到这里,我们的注册码其实已经接近成功了,程序把第五组数据转成10进制,前面加上20就是年份,中间加上-符号
连接上第六组、第七组数据,就是注册码的激活截止时间了。
走到这个CALL,会再次判断我们输入的注册码生成的激活截止时间是否正确,不正确就弹窗,正确就把机器码和注册码保存进入数据库。
现在我们就可以从前面总结出来的流程,来手写一个注册码,来看看我们的判断是否正确了。
前四组已经被程序限制死了,分别是13(19),1,3,C(12)
第五、六、七组,就是我们需要的年、月、日,来,顶格处理,63(99),C(12),1F(31)
然后第八组数据就是前七组数据的和,如果大于100就减100,那最后数据结果如下
13 1 3 C 63 C 1F 4D
继续按前面分析的结果,逆向前推
第七组加第八组,结果大于100就减100,然后再XOR 3,再转回10进制,就是真正的第七组数据
循环...一直推回第一组数据,就是这么一个过程,结果如果,从下向上推的
1 2 3 4 5 6 7 8
23 07 12 08 08 40 11 77
17 7 C 8 8 28 B 4D
14 4 F B B 2B 8 4D
13 1 3 C 63 C 1F 4D
把我们得到的注册码2307-1208-0840-1177,填入程序
是我们想要的结果,因为程序年份限定在20开头,所以这就是在不修改程序的基础上,能得到的最大日期了
总结一下,程序其实不是很复杂,就是繁琐一些,细心一点,耐心一点,大家应该都可以的。
而且这程序还有一点好的地方,注册成功了也能继续输入注册码重新注册,方便大家练手。
最后,注册机代码和成品奉上
[Visual Basic] 纯文本查看 复制代码 Dim a(8) As Long
Dim b(8) As Long
Dim c(8) As String
If Mid(Text1.Text, 5, 1) <> "-" Or Mid(Text1.Text, 8, 1) <> "-" Then
Text2.Text = "输入的日期不正确"
Exit Sub
End If
a(1) = 19
a(2) = 1
a(3) = 3
a(4) = 12
a(5) = Val(Mid(Text1.Text, 3, 2))
a(6) = Val(Mid(Text1.Text, 6, 2))
a(7) = Val(Mid(Text1.Text, 9, 2))
If a(5) > 99 Or a(6) > 12 Or a(7) > 31 Then
Text2.Text = "输入的日期不正确"
Exit Sub
End If
a(8) = a(1) + a(2) + a(3) + a(4) + a(5) + a(6) + a(7)
If a(8) > 100 Then a(8) = a(8) - 100
c(8) = a(8)
For i = 7 To 1 Step -1
b(i) = a(i) + a(i + 1)
If b(i) >= 100 Then b(i) = b(i) - 100
b(i) = b(i) Xor 3
c(i) = b(i)
If Len(c(i)) = 1 Then c(i) = "0" & c(i)
Next i
Text2.Text = c(1) & c(2) & "-" & c(3) & c(4) & "-" & c(5) & c(6) & "-" & c(7) & c(8)
前面上传注册机因为图标问题,可能无法在WIN7及以下系统运行,重新换了图标,重新上传,这回应该没问题了
给大伙造成不便,抱歉抱歉
售电管理软件V3.1注册机2.zip
(6.19 KB, 下载次数: 432)
|