本文的目的是提出一种在软件中添加注册码的方法。至于所提出的方法是否有效,能否经受住一些逆向大师的破解,还有待验证。我只是发表我的个人意见。
一、目标。
目标很明确,就是注册软件的个人信息,并根据需要生成注册码。而软件本身必须能够验证注册码是否有效。并且可以防止他人逆向计算验证算法,生成注册机;可以防止他人使用暴力破解方法直接修改软件执行代码绕过注册。
二、方法论
要实现上述目标,有两个方面尤为重要。首先是注册码生成算法的选择;二是让软件有自己的验证机制,防止可执行程序被篡改。下面我们分别讨论这两点。
1. 注册码生成算法的选择
现在很多软件都有注册机,主要原因是软件本身的注册码生成算法过于简单。破解者可以很容易地从反汇编代码中提取注册算法,并且可以很容易地将其还原为C代码。这些饼干算不上高手,但也算是高手了。我也学习了相关知识。反汇编代码不难理解。难的是在大量的汇编代码中找到彼此之间的调用关系,并且能够逆向写出相应的代码;当然有些懒人直接把里面的汇编代码拉出来就可以达到破解的目的,不用了解详细的执行过程。
言归正传,不管别人怎么NB,他至少要拆机,至少看汇编代码。如果我们的算法足够强大,它们就完成了。纵观当今的标准加密算法,无非是对称加密和非对称加密。我们不必再创建自己的算法,不要做一些吃力不讨好的事情。我们设计的算法的安全性远不如现在常用的算法。我将简要列出常用的算法并解释我们为什么选择我们想要的算法。
一种。有两种流行的对称加密算法:DES 和 AES。DES算法广泛应用于银行业。AES出现较晚,但其安全性优于DES。所谓对称是指只有一个密钥,加解密使用相同的密码,所以称为对称加密。如果我们用它来生成一个注册密钥,那么我们的 软件 必须存储这个密钥。无论密钥在哪里,它始终存在于一个地方,我们无法保证这个密钥的安全性。原因很简单,只要破解者跟着代码走,他就知道我们在哪里读到了密钥。
湾。非对称加密包括RSA、椭圆曲线等mfc软件加注册机,最流行的是RSA。椭圆曲线的效率和安全性虽然比RSA好,但是比较复杂,原理我还是没看懂,呵呵。它被称为非对称,因为它有两个密钥,一个称为公钥,一个称为私钥。公钥可以对外发布,私钥自己保管。用公钥加密必须用私钥解密;相反,用私钥加密必须用公钥解密。所以,我们知道可以把公钥的内容保存在软件中,可以公开(当然要隐藏在软件里面,总之可以公开难破解大家可以试试)。然后,我们可以将私钥留给自己。别人拿不到私钥,根本无法计算注册码。
2.至此,我们知道可以使用RSA算法,并且可以保证软件的安全性。至少注册机不能生成,因为别人没有私钥。但是具体怎么做,我们可以按照下面的流程进行。
一种。注册码生成流程:
注册信息(包括用户名等信息)--->RSA私钥加密--->注册码。
湾。软件验证注册码流程:
注册码--->RSA公钥解密--->注册信息。
3. 解决了第一个目标,我们还是很难防止别人直接篡改二进制可执行文件,从而绕过注册码的验证。然而,总有办法。为了解决这个问题,我想到了一个方法:软件的自检。具体做法如下:
一种。我们为我们自己的 软件 生成一个检查值,它使用摘要算法。最常用的摘要算法是MD5,相信大家都听说过,这里不再详述。我们只需要在软件执行的时候读取可执行程序(下面,它自己的可执行文件是可读的。,但是如果你想自己重写,没办法)并计算校验值。
湾。接下来我们可以判断校验值是否正确,如果不正确,我们软件可以直接自杀。
但是这里有一个问题,我们如何将正确的校验和存储在 软件 中?不可能保存在文件或注册表中,所以迟早会被人知道。其他人可以直接修改校验值,使其与错误校验值相同,从而欺骗软件的校验。这是一个方法:回退到(点1、2)中描述的方法。如何返回?我们继续。
4. 保存软件的校验值:将校验值写入注册码。我们修改后的(第 2 点)流程如下:
一种。注册码生成流程:
注册信息(包括用户名等信息)+软件校验值--->RSA私钥加密--->注册码。
湾。软件验证注册码流程:
注册码--->RSA公钥解密--->注册信息+软件校验值。
这样我们就可以判断软件是否注册成功了。首先按照上面的步骤,计算出注册信息和软件校验值,然后将两者与当前用户信息和计算出的校验值进行比较。如果匹配金舟流程图,则表示 软件 已成功注册。
5. 尝试破解。
如果知道详细过程,如何破解这个软件?首先,我们知道注册机不能再写了。唯一的办法就是破解暴利,但是破解暴利,软件增加了自查。不过,百密间总有疏,破巨利还是可以做到的。我们先回顾一下,如果我们按照上面的方法添加注册码验证。所以我们的代码几乎是这样写的:
int ( 字符 * sn ){
该函数计算软件的校验值,根据注册码sn解密校验值和用户信息QQ拼音输入法截图软件,然后比较返回校验是否通过。
}
……
在软件启动时,我们调用了上面的函数。
if( ( sn ) ){ 这里如果验证失败就退出(0), 呵呵~
}
但阿喀琉斯之踵在上述①位置。因为①位置的组装几乎是这样的:
耶 xxxxx
……
……
只是一个跳转语句,然后破解者直接把它改成jne或者其他jmp指令就搞定了,我们的努力都白费了。在这种情况下,我们的代码一定不能这样写,或者我们的方法不应该这么简单。至少,我们可以这样做:
1. 不要把验证算法写成统一接口。
2. 不要只在一个地方评判。这实际上非常简单有效。如果你愿意,可以在软件中对效率不高的地方多加几个判断,这对破解者来说是相当痛苦的,至少他不能同时搜索到所有关键位置. 只要有一个地方没有更改成功,那么我们的自我验证就会起作用,然后我们就有权进行后续的操作。比如直接删除自己的程序(当然这里必须关闭自己,然后调用另一个进程删除软件)等等。
3. 一个更“便宜”的方法是启动一个附加进程,与主进程相互监控和验证。如果验证对方注册异常,则杀掉对方mfc软件加注册机,杀掉对方的可执行程序。听起来很便宜图片批量压缩工具(,但它不起作用,我不知道。
4. 如果想防止一个注册码到处乱用(中国人互帮互助,呵呵),可以在注册信息中添加目标机器的信息,添加到注册信息中。
4.等等,这些方法有很多,大家可以自由发挥。
三. 总结
经过上面的讨论,我觉得没有绝对的安全,有时候如果你的软件不想被黑,那你就只能骂那些不道德的人了。但是我们可以让他们更惨,至少菜鸟不能乱来。在中国,如果你写一些软件,它是开源的,它是免费的,不要指望用它来养家糊口。
四. 附件
RSA加解密实现代码
发表评论