嵌入式代码破解:
通过一定的外部工具和手段,将代码从CPU中读取出来,然后再将其下载到相同芯片上运行。
这样完成硬件抄板后,直接就可把别人的代码抄袭下来。
破解原则:
就像所有的加解密一样,在现有的技术条件下,没有破解不了的密码,只是破解的时效性以及代价。
设计加密的目的是让破解者的破解成本高于收益成本,从而使其放弃破解。
根据破解流程,可以两方面进行防破解:
1,代码下载完成后,将flash锁死,防止代码被读出;
2,代码被读取出来后,下载到其它芯片中无法运行。
对于方法1:
1,可以将芯片抛开,找到熔丝,接上后,即可以将程序读出来;
2,此方法有个不方便的地方: 对于远程代码调试,我们需要将bin文件发给对方,由对方下载进去。
对于方法2:
要求我们的代码即使被读出来了,但下载到其它芯片中,是无法运行的。
这就要求代码的身份信息与芯片的身份信息一致。
代码的身份信息录入方式:
1)下载的bin文件中本身就有身份信息,这就要求在下载bin之前,对bin文件进行处理,加入身份信息;
2)程序运行起来后,通过其它方法,写入身份信息。
代码的身份信息,可以更改。
芯片的身份芯片:
1)最常用的就是芯片的 UID. -- 这个就要求芯片在出厂时就带有唯一的ID;
2)程序运行起来后,以某种方法写入到芯片中 -- 这要求此UID是无法读出来的。
要求芯片的身份信息,写入后无法更改。
简单的单片系统中的防破解方法, 以及破解方法
1,增加加密芯片
即代码启动,先生成一串随机数,后将此随机数发给加密芯片,加密芯片加密后,发给CPU,
CPU对其进行解密,看是否与发出的数据一致。
【即代码和加密芯片使用一套加密算法和密钥,并要求一机一密钥】
破解方案一:
读出CPU的程序,-- 这个比较简单
复制一模一样的加密芯片。【加密芯片一般难以复制】
破解方案二:
读出CPU的程序,进行反汇编后,修改代码,让其跳过与加密芯片的握手阶段即可;
【比如 CJNE这种指令,可能就是进行握手的代码】
这在汇编代码中容易猜测出来。
2,使用芯片ID进行加密
代码启动后,读取芯片的UID,再与代码的身份信息进行比较,若相对应,则代码继续运行;
【芯片的UID基本是无法更改的,即使可以更改,批量化更改也是不现实的】
【可以对代码的身份信息进行加解密处理,以增加难度】
破解方法一:
对代码进行反汇编,找到读取UID的部分。因为一般芯片的UID地址固定。
char *puid = 0x84000001, 一般做的做法是这种形式。
更改bin文件,将此指针,指向一个空白区域,在这个区域写入代码的ID。
这样代码进行比较时,即可认证成功,代码继续运行。
防破解办法:
读取芯片UID时,不要使用立即数,可以通过一些逻辑计算获取,以增加破解难度;
3,破解方法
对于分析汇编代码,找到防破解的功能函数,更改其代码,(或注入新的代码)让其跳过防破解函数,
从而实现破解,
防破解方法:
将防破解函数,防破解认证过程,分解成几个子过程,再将其分布在代码的其它有用功能代码之中
以增加破解难度。
4,对于更改代码,或者注入代码的破解方式,如何进行防破解
1)增加代码的分析困难:
a, 比如讲读取ID的立即数,改为通过逻辑计算获得;
b, 将防破解的关键代码,运行过程分散开来;
2)将代码文件扩展到整个flash空间大小,防止数据注入。
对于编译生成的bin文件,通过增加随机数,或者BIN原片段的方式进行扩展
3)增加代码的完整性验证过程:即对BIN文件进行签名
5,bin文件签名过程:
a, 编译器生成bin文件后,在bin文件后面填充上随机数据(或者bin文件片段),形成新的BIN文件;
b, 将BIN文件进行哈希计算,得到哈希值;
c,对哈希值进行加密,得到文件的签名值;
d,将签名值填充到BIN文件中,形成签名的BIN文件;
e,将签名的bin文件下载到CPU中运行;
f,CPU启动后,对整个BIN文件进行哈希计算,并读取出签名值,对签名值进行解密
对比哈希值与解密后的签名值,如果一致,表明代码没有进行过更改。
【哈希计算也可以改为CRC32等计算,加解密可以是RSA,SM4等,也可以是异或等简单的逻辑计算】
6,代码的身份信息加入:
即如何将代码的身份信息加入到BIN文件中。
1)下载BIN文件前,注入身份信息
a,通过工具,读取出芯片ID;
b,将ID信息进行加密后,注入到BIN文件中,形成新的BIN文件;
这个对于有boot的芯片,比较方便,在下载时,先发命令获取到UID,BIN注入UID后,
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/133444.html