本人之前是做软加密破解的,后来良心发现,自觉做我们这行窃取他人劳动成果,和做贼没有区别,所以果断转行了,首选声明我绝不是高手,只是想将我做破解的时候的一些经验和大家分享,以便各位兄弟在做产品的时候重视加密,不要让别人轻而易举就窃取了您的劳动成果,
STM32系列从问世以来就以优异的性能和便宜的价格深得人心,但是不幸的是树大招风,问世不就久就被解密公司破了,从12年的12万的解密价格,到13年的6万,14年一万,再到现在的五千,相信不用两年就会像51一样沦为几百块的白菜价,所以软加密对未来的STM32的工程师来说异常重要,以下正式对各种方式的软加密和破解方法做一个总结,以便各位朋友在日后设计软加密的时候不要给破解的人留下漏洞
1.最简单的软加密不用反汇编,直接在机器码中就可以先到FF1FE8F7,因为STM32机器码是小端格式,这个地址实际就是芯片ID地址,破解的人只需要在程序中找到一块空白的位置,然后将解密的那个芯片的ID复制到这里,再将程序中出现的那个1FFFF7E8改为存放母片的那个ID就破解了,这种方法和你程序采用的什么算法加密毫无关系,防破解处理方法是在程序加密的时候不要直接读芯片ID,应采用几个变量运算合成ID地址再间接的去读,注意不能用立即数合成,因为那样编译器还是会给你优化成一个立即数的。
2.就算在程序中找不到明显的读ID指令也是可以破解的,方法就是仿真跟踪,仿真跟踪前需要反汇编,THUMB2的文档中每条指令生成的机器码有详细的说明,随便都可以找个做上位机的写个自动反汇编工具,之后再人工修改下就可以了,其实还有一种更简单的方法,就是将机器码定义成DCI XXXXH这样的格式,导入KEIL编译能通过,然后仿真,KEIL会自动的帮你反汇编,接下来就是单步执行,延时类函数跳过,这时候要密切注视R0到R15,不管你用什么方法得到的ID地址,最终一定会出现再这几个寄存器中,防破解的方法一个是检验ID号的时候不要在开机就检验,要在特定的硬件条件下才检验ID,然后如果不合法程序就自毁,这样就只能通过JTAG硬件仿真了。所以产品上市的时候切记将其它IO口转到JTAG口,这样就占用了JTAG,仿真就不行了
3.是不是这样就安全了?不是的,你可以禁用JTAG,人家同样可以修改指令开启JTAG,最好的方式是在程序关键的代码块做CRC检验,这样只要关键指令被修改过,就可以发现,剩下的自己看着办……
4.其实没有破不了的软加密,只是一个时间和成本的问题,但是也不能让人家那么轻易的就破解了,除了上面的防破解的方法之外还可以在程序中特定条件下做多次检验,检验的时候不要用简单的判断真假跳转,应该用检验的结果做程序下一步执行的参数,这样别人破出来的产品原以为没问题了,但是用起来不稳定,或者性能差,或者老死机等。 |