序列号保护方式
序列号保护机制
软件验证序列号,其实就是验证用户名和序列号之间的数学映射关系。
1.将用户名等信息作为自变量,通过函数F变换之后得到注册码
这是非常不安全的,因为无论F有多么复杂,只要解密者把他从软件中提取出来就可以编制一个通用的计算注册码程序了。
2.注册码验证用户名的正确性
跟上一种差不太躲,就是要求F是一个可逆变换。
不同的是这里的F未直接出现在软件代码中,比上一种要安全一点。
以上就是一些解密方法。
3.对等函数检查注册码
解密加密方法类似。
以上三种自变量都只有一个。
4.用户名注册码同为自变量
也就是采用二次函数
看上去相当不错,但由于同时少了用户名和序列号的意义关系,软件开发者可能难以写出注册机,所以必须维护用户名和序列号的唯一性,需要建一个数据库。
如何攻击序列号保护机制
重要的是利用各种工具来定位判断序列号的代码段。
一种方法是跟踪输入注册码后的判断来找到代码,另为一种是跟踪程序启动时对注册码的判断过程。
1.数据约束性秘诀
数据约束性和密码相邻性。真正的密码会在离保存用户输入密码不远的地方露出马脚。
由于不少软件作者不了解这些基本的解密只是,虽然在算法上下了很大的功夫,但最后还是采用明码比较,导致了会使用WINHEX的普通用户就能找到序列号。
2.hmemcpy函数
是一种之前用的断点(不常用)。
3.利用消息断点
当按下和释放鼠标时,将发送WM_LBUTTONDOWN和WM_LBUTTONUP消息。因此,用消息断点很容易看到按钮的事件代码。
4.用提示信息
采用了人机对话的模式,由此进入。
字符串比较形式
1.寄存器直接比较
2.函数比较a
3.函数比较b
4.串比较
制作注册机
注册机算法一般是一些极为简单的算法,基本上都是明码,或者明码相近例如查表,异或,换位,移位等。
1.对明码比较软件的攻击
只要正确的序列号在内存中曾以明码形式出现,就属于这一类。攻击还是比较容易的,利用keymake软件,它能够拦截程序指令并将出现的明码以某种方式直接显示出来。
2.非明码比较
下面代码用于计算k1=F1
下面用于计算F2=k2
如果满足k1=k2注册就成功了。编写注册机时要对函数F1和F2进行逆变换,若都不可逆就只能用穷举法了。
常见的加密指令xor/xor,add/sub,inc/dec,rol/ror一条是加密一种是解密。