加密方法:
1、大量使用内联验证函数;
验证函数是用来检测本系统是否被破解的功能函数,内部应该包含加密的正反解算法,在此特别说明一定要用内联函数 inline,普通函数作为一个反复调用的模块编译时被存储在bin文件的固定地点,每次调用时会跳转到这个地点运行,如果验证函数使用普通函数,那么破解人员只用搞定存储验证函数在bin文件的这个区域就万事大吉了,那么系统中所有验证功能都被破解了;而内联函数在系统编译时会将函数复制在调用的部分成为一个分身,是一块独立部分,如果系统在不同的地方调用了10次内联函数,那么就有10个功能相同的函数在bin内,互不影响,这样可以有效的增加破解的时间成本,狡兔N窟;验证函数最好放在一些不经常运行到的程序中,在程序体积与性能允许的情况下,×××;
2、读取密文绝对不使用直接寻址;
由于Bin文件被反汇编之后成为汇编代码,如果只直接寻址(例如寻址到UID密文0X11111111地址上的数据)那么被寻址的地址是直接在汇编代码上可以看到的,直接通过查找功能就可以锁定读取密文的位置,所以一定要用间接寻址,例如我们要寻址0x11111111,可以制定一个32位数据指针,先让其等于0x11110000,再加上0x00001111,最后等于0x11111111再进行寻址,这样的方法破解人员只能在仿真时严格跟踪R0-R3寄存器,才能发现在哪读取了密文,增加其破解时间成本和难度;
3、尽量增加外部功能硬件的密文数量,获取密文后进行算法运算增加其复杂性;此处实际上是增加其余的密文,避免破解人员观察加密程序读取UID的代码位置,防止被锁定;
4、全文加密,针对于单片机系统的程序区code进行全文计算算出MD5,计算出MD5存储到某一个位置,如果bin文件中程序区段被修改,那么在检测函数针对全文进行二次MD5验证是得到的密文会和之前不同,这种方法可以查看出代码区是否被动过手脚;
5、程序中发现被破解或者动过手脚不要卡死,或者不要有任何实时的处决动作,而是尽可能的延后处决;这个很重要,因为在破解人员自认为破解成功后,会自行测试设备是否能够正常运行,如果防破解此时发现被破解直接自毁程序或者卡死,那么就是告诉破解人员还有地方没有破解完成,需要继续,这个时候需要用户做的就是设置一个延迟处决的代码,当发现系统被动过手脚,先要按兵不动,程序能够正常运行,当系统重新启动500次或者通电时间超过1000个小时,系统再自毁,增加足够的测试周期,极大地延缓测试频率,拖慢脚步,如果此时被误认为已经破解成功,并量产产品,往往会对破解用户造成足够大的经济损失;更绝的是在自毁之后再FLASH中写入当前代码的原作者以及公司,通过bin读取出提取信息,可以告发对方侵权!
原文地址:http://blog.51cto.com/13690049/2094999