runningwzf 发表于 2014-6-16 08:52
这不用去想象,这早就是现实了,我们目前项目已经正在使用这个方法:
在应用程序中预留通信接口和命令, ...
2、如果单片机发现密钥区里面的128位密钥不全部为1,则意味这密钥已经被写入,则使用CPU的ID和软件版本号计算密钥,如果密钥不对,则意味着正在被人**,此时通过IAP的方法将程序的后一半和密钥区域擦除,CPU重启;
应对1:就是这里,把程序拷出来,跟踪运行,记下整个流程,发现程序操作FLASH,说明检查已经完成,往前回溯,八成之前某个跳转改掉就**好了。
应对2:跟踪程序,发现读取cpu id,仔细检查之后的程序,应该很快就能找到对比的语句,改掉,**完成。
应对3:在存放cpu id的内存位置设断点,发现这里读取id了,就改一下这里的程序,把原始程序对应的id作为结果返回,骗过之后的检查程序就好了。
其实吧,因为cpu id地址是固定的,没特殊处理的话,直接在程序里搜就能搜到这个地址,查找一下相关访问语句,可能连跟踪都用不到。
顺带告诉大家:实际上CPU 的ID就是私钥,而软件版本的作用就是选择加密算法和公钥。也许有人会认为这种加密方法很复杂,但是实际上很简单,我们在ST的全系列CPU上已经实现了。而且有一个非常实用的方法,使用base64,不同的软件版本对应不同的编码区域,这样会让**你产品的人付出更大的代价
针对这一点,其实复杂的算法一点意义都没有,**的都是直接绕过算法,管你怎么加密,他都等你程序脱壳完毕才用。另外,标准加密算法代码特征十分明显,专业的一看就知道怎么做的,你的所有密钥放在哪里一清二楚,都很容易就能提出来和修改。 |