当初由于一些原因以及兴趣,学习了一段时间软件逆向,对于软件加密解密有了点粗略的了解。而后看到某些同学辛辛苦苦的搞出个软件,自己费心费力去加密,但搞出来后往往能被秒破,实不忍心。今天大概总结下一些基本的软件加密手段,以供参考,高手勿喷。
关于解密
软件解密主要有2个层次,一个俗称爆破,就是不分析加密算法,只修改一些与验证相关的跳转指令来使得软件正常运行,另一个就是能真正破解加密算法,进而写出注册机。破解手段通常有静态分析和动态分析两种方式,目前二者的代表工具是IDA和OllyDbg(OD)。
加密算法与代码
加密首先必须设计一套加密算法,这个可以用现成的如MD5,SHA之类的算法,也可以自己设计个稍微简单点的算法。一般情况,作为一个开发者,设计一个简单的加密算法应该问题不大的,但是算法设计必须要严密,不能出现漏网之鱼。比如一个时间限制的算法,如果只记录开始结束时间,然后用当前时间去判断,这样的算法通过修改系统时间就给绕过去了,就不够严密,需要改善;例如可再记录一个最近一次运行时间,这样就可以处理修改系统时间的漏洞了。
有了一个完善的加密算法,最直接也最容易想到的做法就是把用户输入的密码用算法转换后与保存的密钥对比,一致则验证通过,不一致则验证失败。这样的加密程序估计新手也能快速爆破了。那么在代码编写时,需要注意下面几点
首先,加密算法尽量不出现在程序中。比如你的加密算法是(f),用户输入密码(x),程序保存的秘钥为(y),那么只有在(y==f(x))时才能验证通过。避免(f)的具体实现出现在程序中,可以防止破解者分析你的加密算法从而写出注册机,那么可以设计另外一组算法(g)和(h)使得(y==f(x);Leftrightarrow ; g(y)==h(f(x))),记(s=hf),这样在程序里就只会出现(g)和(s)而不会出现(f)了。例如下面代码:
1 #define MAX_LEN 256 2 int Validation(char *py, char *px) 3 { 4 char azy[MAX_LEN] = {0}; 5 char azx[MAX_LEN] = {0}; 6 char *ptmp = NULL; 7 8 //这里加密算法实质是将数字转换为小写字母 9 //但此处分别直接将待匹配密钥py和用户密码px转大写字符后对比 10 //而不是将px转小写字母后与py比较 11 ptmp = azy; 12 while(*py != '