学会软件破解,让注册机制形同虚设
一、修改注册表文件,清除软件使用次数限制。
打开软件后,会出现一个注册框,其中用户名可以随意填写。左下角显示还可以试用的次数。点击试用后,可以进入软件。但是试用总共只有100次。我们的目标是消除次数限制,实现无限试用。
原理分析:通常情况下,试用次数被记录在注册表中。无论使用了多少次,如果我们能找到这个注册表文件,并将已使用的次数改为0,就可以重新计数,实现无限循环使用。
工具:Regshot,一款小巧的注册表比较软件,可以在操作前后对注册表进行两次快照,并自动进行比较。
步骤:
- 安装好软件后,先不要启动软件。打开Regshot,选择第一次快照,记录试用次数为100的注册表状态。
- 扫描完成后,不要关闭Regshot,然后打开软件,点击试用,进入软件,然后可以退出。
- 启动Regshot,选择第二次快照。扫描结束后,自动比较两次扫描结果,并弹出报告。
- 报告显示有3处发生了改变,找到显示改变注册表的路径。其中[HKEYLOCALMACHINE/SOFTWARE/tw/twzc]引起了我们的注意,因为这个路径中的tw是软件名称拓维的缩写,而且键的名称是day,肯定和时间有关。
- 点击开始,运行,输入regedit,回车,进入注册表编辑器。按照路径找到这个键,选中它,依次点击文件,导出。可以将这个注册表文件任意命名保存。
- 这个文件记录的是还能试用99次的状态。当试用次数快结束时,双击导入这个文件,又恢复到可以试用99次的状态了。至此,我们实现了循环试用的目的。
以前在网上流传了一个卡巴斯基30天试用循环的补丁,批处理内容如下:
@echo off
@reg delete HKEY_LOCAL_MACHINE/SOFTWARE/KasperskyLab/LicStorage /f
@reg delete HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Cryptography/RNG /f
@reg delete HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/SystemCertificates/SPC/Certificates /f
pause & exit
核心部分就是删除了3个键。想找到这三个键,可以使用Regshot这个工具,大家可以试一试。在选择激活试用版本前后,对注册表进行快照,比较之后就会得到这三个键,只要做成批处理,此外不管怎么改变外貌,加上个人的标记都行,此话后说。
二、爆破,让注册机制形同虚设。
在注册时,如果输入的注册码不正确,就会提示注册失败。我们能否任意输入一个数,都会显示注册成功,让注册机制形同虚设?爆破就可以实现这样的效果,不需要知道注册码到底是什么,非常强大、暴力而简单。
原理分析:给出这样一个软件的注册验证算法:
- 输入自己获得的注册码(简称输入码)。
- 调用储存在软件中的真正注册码(简称真码),与输入码进行比较。如果两者相同,即输入的是正确的码,则继续进行下一步。如果两者不同,则跳转到步骤4。
- 显示“注册成功”,结束。
- 显示“注册失败”,结束。
显然,这里的第二步判断是关键。如果将第二步改为“调用储存在软件中的真正注册码(简称真码),与输入码进行比较。如果两者不同,即输入的是错误的码,则继续进行下一步。如果两者相同,则跳转到步骤4。”会出现怎样的情况呢?对了,当我们随便输入一个数字时,软件都会提示注册成功。这不就是破解了吗?而像这样通过修改判断的方法就是爆破。简单直接,但是需要找到关键的跳转判断。
一些有用的语句:
- cmp a,b:比较a与b。
- mov a,b:将b的值赋给a。
- ret:返回主程序。
- nop:无作用,英文“no operation”的简写,意思是“do nothing”(机器码90)。
- call:调用子程序。
- je或jz:若相等则跳(机器码74或0F84)。
- jne或jnz:若不相等则跳(机器码75或0F85)。
- jmp:无条件跳(机器码EB)。
- Jb:若小于则跳。
- ja:若大于则跳。
- jg:若大于则跳。
- jge:若大于等于则跳。
- jl:若小于则跳。
- jle:若小于等于则跳。
- pop:出栈。
- push:压栈。
工具:调试工具(我习惯使用Ollyice)。
步骤:
- 查壳,发现是Aspack的壳,使用脱壳机进行处理。
- 脱壳后,得到Unpacked.exe文件。
- 打开调试工具Ollyice,依次点击文件,打开,选择该文件路径,载入。
- 依次点击插件,超级字串参考,查找ASCII。
- 这里显示了所有软件提示的字符。
- 打开软件,随意注册一下,观察提示的字符,记住“注册码输入错误”。
- 在ASCII码中查找到这个字符。
- 双击跟进,来到这个地址。从这个地址向上,沿着红线来到判断的地址,这里的jnz表示比较输入码和真码,如果两个值不一样,就会沿着红线跳转到“注册码输入错误”的地址。如果相同,就会向下运行,来到“注册成功”的提示。因此,我们可以将这个jnz的判断改成相反的je。
- 在jnz这一行的地址上,右键,汇编,直接更改为je。
- 更改完毕后,点击汇编按钮,这一行已经变成红色。
- 右键,复制到可执行文件,选择全部,全部复制。保存文件,替换原来的文件。
- 关闭调试工具,打开经过爆破处理的Unpacked.exe软件(原文件已经备份为Unpacked.bak)。输入任意注册码,都可以成功注册。再次打开软件,没有注册提示框,信息变成已经注册。至此,爆破成功。
爆破方法比较简单,但并非万能,关键是找到判断跳转的地址。
三、追踪注册码,正式注册成功。
另一个思路是,软件已经在寄存器中放置了真码,只是我们看不见。我们可以使用调试工具逐步运行软件,查看寄存器,找到真码。
原理分析:真码已经存储在寄存器中,调试工具可以查看寄存器内容。在软件中,CALL命令非常重要,CALL是调用,存在一个关键CALL,调用的就是寄存器中的真码。找到这个关键CALL,就可以看到真码,并使用它进行注册,肯定会成功。一般来说,关键CALL位于判断的上方。
工具:调试工具(我习惯使用Ollyice)。
步骤:
- 根据爆破方法,找到判断jnz。
- 上方有很多CALL需要尝试,而且软件运行时是从上到下的,因此从jnz附近最上方的CALL开始下断点。在地址006E63E1,按下F2,地址变红,设置断点。断点意味着软件运行到这里会停止,我们可以进一步操作。我们并不知道哪一个是关键CALL,只是从上面开始尝试。
- 按下F9开始运行软件,当出现注册提示时,随意输入注册码,点击注册,发现没有出现错误提示,因为软件运行到断点时停住了。此时按下F8,让软件单步运行,同时注意观察右边寄存器中的ASCII值。当运行到地址006E6435时,寄存器出现了一长串字符,引起了我们的注意。A32D725C66BG3099224B7796D9HA22AAGAG3,这一串字符不是机器码,有无规律可循,有理由猜想是储存在寄存器中的注册码。
- 右键,将寄存器的信息复制出来,即可得到注册码。我们可以使用这个注册码进行软件注册。
- 注册结果当然是成功的。至此,我们成功追踪到了注册码。
追踪注册码的方法具有普适性,而且可以为制作注册机打下基础。
四、制作注册机,成为高手。
很多朋友认为注册机很神奇,是高手的专利。实际上,一个内存注册机只是将人工追踪注册码的过程自动化,没有什么神秘的。以这个软件为例,有了前面追踪码的基础,我们可以制作一个属于自己的注册机。
原理分析:我们为注册机规定读取ASCII的寄存器地址,运行寄存器后,它会自动从该地址读取并显示内容,从而生成注册码。但注册机不是算号器,不涉及注册码的算法,只是通过取出寄存器中的内容来简化过程。基础仍然是调试工具中看到的信息。
工具:keymake(下载地址:)。
步骤:
- 打开工具软件keymake,依次选择其他,内存注册机。
- 点击浏览,找到软件所在位置。在设置注册机信息的界面中,点击左下角的添加。
- 中断地址为006E6435,中断次数为1,第一字节E8,指令长度为5(每两个字母为一个长度),这些信息可以在调试工具的HEX数据中找到。寄存器方式为EAX。填写完毕后,点击添加。
- 界面如图所示,点击用户信息,可以添加自己的网页和邮箱。
- 设置完成后,点击生成。
- 选择一个界面样式,点击确定。
- 注册机必须放在软件安装目录下。
- 使用时,双击注册机,弹出软件注册界面,随意输入注册码,提示注册码错误,注册机会显示正确的注册码。但是,前8位数字要略去,因为我做的只是一个简单的演示,一些与地址相关的多余字节没有去掉,注意这一点就可以了。
这样,我们就制作了一个注册机,比破解更高级。
五、注册本质分析。
本来想做一个算法的分析,但时间比较紧,没弄明白,就用这个来代替。到底注册软件改变了什么?
工具:Regshot(下载地址:)。
在未注册状态下,进行第一次注册表扫描,得到第一次快照。然后使用获取的注册码进行注册,最后进行第二次注册表扫描,得到第二次快照。比较两次快照的结果。
Com这一项的变化是因为我们注册的公司名称发生了改变,day这一项是因为我们启动了软件,导致试用次数减少。而id这一项是真正注册成功前后的变化。而这一项的数值我们非常熟悉,它就是软件的机器识别码!因此,这个软件的注册本质就是,如果注册表中的id的值与机器识别码相同,就会变成注册版。因此,我们又得到了一种破解方法,只需将机器识别码写入id这个注册表项,就可以成功注册!而机器识别码是软件显示出来的。想不到吧。




