.net程序的破解实践与理解一、爆力破解篇:改代码(写给新手,超详细)https://www.52pojie.cn/thread-1954009-1-1.html
.net程序的破解实践与理解二、代码分析篇1:启动验证(写给新手,超详细)https://www.52pojie.cn/thread-1955144-1-1.html
今天给大家带来的是第三篇:.net程序破解实践与理解三、代码分析篇:时间限制(写给新手,超详细)
在上一篇的“代码分析篇”中,版主“爱飞的猫”提醒“文章漏掉了从序列号文字到过期时间的映射”。那这一篇咱就来聊一聊程序注册码中关于时间限制的部分。 书接上回:程序重起后加密内容解密出来,然后把解密后的字符串切割成5段放入数组中,第三、四、五段即关于年、月、日的字符串被分别赋值给了gtyear、gtmonth、gtday变量。
1.png (2.67 KB, 下载次数: 0)
下载附件
2024-10-7 22:24 上传
有的小伙伴可能发现当程序走过这三行后,下面局部变量窗口中怎么没发现有这三个变量啊?而走过riht=array[0]和left=array[1]时能看到right和left里面存了第一段和第二段的字符串。
2.png (41.73 KB, 下载次数: 0)
下载附件
2024-10-7 22:27 上传
别急,我们去找到它。
2.1.png (22.66 KB, 下载次数: 0)
下载附件
2024-10-7 22:29 上传
在gtyear上点右键,弹出菜单,点“分析”。
3.png (44.56 KB, 下载次数: 0)
下载附件
2024-10-7 22:28 上传
在下面分析器窗口中点读取于左边的三角。
4.png (39.24 KB, 下载次数: 0)
下载附件
2024-10-7 22:31 上传
在frmMain_Load上双击
5.png (24.31 KB, 下载次数: 0)
下载附件
2024-10-7 22:31 上传
来到下面的地方,在string gtyear=RegData.gtyear;这一行下断。
7.png (15.41 KB, 下载次数: 0)
下载附件
2024-10-7 22:35 上传
点F5(继续),断下来后,点F10往下走,走过这一行后,在下面的局部变量窗口中可以看到gtyear变量被放进了“2025”,gtmonth中是“03”,gtday中是“18”,正好是前面5段字符串中的第三、四、五段。
8.png (19.14 KB, 下载次数: 0)
下载附件
2024-10-7 22:36 上传
这个年月日连起来就构成了最终的限制过期时间。
9.png (35.24 KB, 下载次数: 0)
下载附件
2024-10-7 22:37 上传
如果当前时间超过期限,则显示“本软件使用期已过。请与***联系......”。
10.png (14.78 KB, 下载次数: 0)
下载附件
2024-10-7 22:37 上传
那这个时间又是从哪来的呢?我们知道解密出来字符串来自于mspaibzd735.dll,而这个dll文件是注册成功时建立的,dll文件中存的机器码来自注册窗口中的机器码,那时间应该来自于注册码。点停止调试,
12.png (19.74 KB, 下载次数: 0)
下载附件
2024-10-7 22:38 上传
删掉mspaibzd735.dll,点“启动”,程序运行起来,点帮助-注册-输入假码-确定,显示“注册码不对”。根据 .net程序的破解实践与理解一、爆力破解篇:改代码(写给新手,超详细)中方法找到以下位置
11.png (15.54 KB, 下载次数: 0)
下载附件
2024-10-7 22:41 上传
在bool flag3=.......这一行下断。程序运行到此处,这里判断注册码是不是15位。是15位,跳过“注册码不对”,继续往下跟,下图显示截取注册码中的第5位放到text5中,第6位放到text6中
15.png (37.54 KB, 下载次数: 0)
下载附件
2024-10-7 22:42 上传
然后通过下面的下面的判断和后面的语句转换成数字1或2,
16.png (39.28 KB, 下载次数: 0)
下载附件
2024-10-7 22:44 上传
再通过下面的语句连接成年,上面注册码中是CF,转换后就是2025年。
19.png (38.2 KB, 下载次数: 0)
下载附件
2024-10-7 22:45 上传
第7位、8位转换后连接成月,
20.png (36.46 KB, 下载次数: 0)
下载附件
2024-10-7 22:46 上传
第13位、14位,转换后连接成日,
21.png (41.5 KB, 下载次数: 0)
下载附件
2024-10-7 22:47 上传
然后,将得到的年转变成数值后放到变量num3中,月放到num4中,日放到num5中,年小于2021或大于2036或小于当前年份,或者是月小于1或大于12,或者日小于1或大于31,程序就会显示“注册码不对”。
23.png (28.5 KB, 下载次数: 0)
下载附件
2024-10-7 22:49 上传
否则会先判断从注册码(放在text3中)截取的1到4位和9到12位连成的新字符串text4长度是否是0,若不是则通过yanzheng()函数对通过机器码算出的数值和text4进行比较,
24.png (8.57 KB, 下载次数: 0)
下载附件
2024-10-7 22:50 上传
25.png (17.9 KB, 下载次数: 0)
下载附件
2024-10-7 22:51 上传
(和重启验证过程一样都是调用funcGetZhucema()函数)
26.png (14.14 KB, 下载次数: 0)
下载附件
2024-10-7 22:52 上传
结果一样就注册成功,不一样就显示注册码不对。注册成功后会把这个日期存到mspaibzd735.dll中,程序重启后进行启动验证是否过期。注册码的最后一位可以是1,也可以是2.
27.png (12.25 KB, 下载次数: 0)
下载附件
2024-10-7 22:53 上传
至此,程序注册和重启验证过程都已经分析完毕。 总的思路就是: 1、先判断注册码是否是15位,否则注册码不对。 2、若是15位,则再判断年是否是2021-2036之间(包括两端),月是否是1-12月,日是否是1-31日或年是否是小于当前年或当前年中小于当前月,否则注册码不对。 3、若是,则从机器码中换算出字符串和注册码中截取并连接成的新字符串比较,若一样就注册成功。 4、注册成功后,机器码、步骤3中的字符串及注册码中的年、月、日保存到dll中,程序重启时验证是否是注册版,时间则用来验证是过期。 写在最后: 其实分析别人的程序不只是为了破解程序,更重要的是对别人编程思路的一种学习,是一个自我提升的过程。当然提醒各位全新的小伙伴,要想能有更大的提高,还是要掌握一门编程语言,不但有利于读懂别人和程序,在探索的过程中也可以写出个注册机。程序已经分析透了,那下一篇就剩下写注册机了,大家可以自己先写个注册机试一试。