首页
社区
课程
招聘
[求助]ARM系统加密防山寨,希望听听诸位的看法
发表于: 2011-7-6 01:55 9334

[求助]ARM系统加密防山寨,希望听听诸位的看法

2011-7-6 01:55
9334
  我用的IC是STM32,是一款主频只有72MHz的32位定点处理器。需要对产品升级过程中的数据流进行加密。只是不知道什么加密算法速度比较快,且能把解密门槛设置得足够高,下文会详细介绍。

  大学读的机械设计专业,没学过离散数学,高等数学和概率论之类也不是很熟悉,死命复习或许能捡起来一些。不过是在确实有必要的前提下。我对密码学了解甚少,刚刚才看过DES的文章,算法还没彻底消化。先简单介绍一下我系统的结构。

  整个系统包含一套PC端软件(VC++编写),一个USB外设,以及连接在这个USB外设上的一些子外设。所有外设都是芯片,程序(也就是固件)都存储在内置flash里并通过芯片内置的硬件加密机制进行了第一道加密。如果硬件出售之后不需要升级的话我就不用发帖子了。现在的问题是我需要升级部分外设。

  升级分两类,一类是给直接插入电脑的USB外设升级,另一类是通过前者给它的子外设升级。升级过程基本相同:

  • 用户插入USB外设,在PC端软件上点击升级固件的按钮。
  • PC端软件收集硬件信息,自动连接产品网站的服务器,将硬件信息发送回服务器,请求下载对应的固件。
  • PC端软件下载固件后向用户提示固件版本列表,由用户选择希望安装的版本,确定要升级后PC端软件与外设握手并启动升级过程。
  • PC端以特定大小的包为单位一次次向外设发送新的固件。每包发完后外设做应答,如果接收成功则继续发送,如果不成功则终止升级并报错。外设回滚至最近版本的完整固件。
  • PC透过USB外设对子外设升级固件时,USB外设本身只做数据中继,交接底层数据包并做物理层的错误侦测,不干预逻辑层的事务。


先说这里面容易被山寨盯上的细节:
  一方面最直接的是芯片本身。如果没有硬件加密,用一个编程器就可以读出存储器里的所有内容,如果代码不做任何防范措施则可以原封不动拿去写进同型号的空白芯片里,电路板其余部分照抄即可轻易仿制产品。而硬件加密也并非完全可靠,但是破解需要成本。我用的芯片目前用纯软件手段解密成本还是比较高的,用机械手段的话则需要动用精密磨床去掉塑料外壳将flash硅片染色暴露在高倍率显微镜下用光学方式逐bit读取,这个成本也是不低的。

  另一方面是升级过程的数据。从服务器到PC机的环节可以侦测TCP数据流,也可以去内存里挖缓存文件,从PC机到第一级外设可以抓USB通讯包,从第一级外设到第二级外设可以监听我的硬件总线。这几种技术都是存在的而且成本不高。因此我根本不怀疑有人会拦截我用来升级的文件拿去逆向。

  我的对策主要分两部分分别与两类威胁对应,一部分是让同一型号的每个产品固件都不一样,也就是说一块芯片里的固件拷出来,直接写进同型号的另一个芯片是不能工作的。这个要借助芯片内部的硬件UID机制。每个芯片出厂时由厂家在存储区的特定地址固化了32位唯一ID值。这个系列没有任何两个芯片的UID是相同的。利用UID进行加密的机制通常是需要软件干预的,也就是说我可以在UID与特定变量的值/地址之间建立关联,让山寨系统的程序在读写相应变量时走入错误的分支。但不可以改变指令集中每个指令存储在flash中的机器码。

  另一部分就是通讯协议中的加密算法了,上位机通过USB发给外设的固件数据包是密文,截下来也没用。我觉得应该使用对称加密算法,因为我的数据完全不需要对用户透明,用户只须关心硬件操作。我看了DES的密钥是64bit,或许可以用UID做其中一部分,用自己的固定密钥做另一部分。用户的PC端软件在请求升级的时候发回UID,我在服务器上做一个实时加密服务即时生成密文。

  对加密算法的速度要求可以这样量化:我的USB外设程序存储区有128KB,最大的可能有256KB。子外设规模相对较小,程序小的只有16KB左右,大的也不超过128KB。USB连接是全速12Mbps,使用interrupt传输,每个包64字节。经我实测13KB的数据用官方未加密的USB协议升级大概需要3秒钟。目前还没有太大的程序去测试满片升级的速度,但如果真要写满256KB,估计不会很快。子系统与USB系统之间的传输速度可能会成为下一级外设升级的瓶颈。速率满打满算最高可能只有2Mbps。我要在这个基础上加入解密算法,因此速度要求不容忽略。毕竟是72MHz主频的系统。

  值得注意的一点是如果山贼使用机械手段读到了我的flash内容,那么首先不管通讯上做了神马加密,都统统玩儿蛋去了,因为我的解密机制都在flash里面。这时候最后一道防线就是上面说的UID了,而用UID去影响程序行为也是有讲究的。最简单最原始的例子是在程序中定义一个const long,程序启动后首先读取这个常量,然后读取UID,二者若相同则走正常分支,若不同则走邪门歪道。我编译好这套程序之后,用其HEX作为模板并查询到这个常量在文件中的偏移量。然后再专门写一个软件挂在服务器上。当用户的PC端软件发来它所购买产品上所用IC的UID之后,软件自动用这个UID替换模板HEX文件里相应偏移量的数据,然后将替换后的文件加密发过去。这样的原始方式如果被山贼抄了flash,他第一个找的就是flash里和芯片UID完全相同的数字组合。因此基于UID的加密也需要提高山寨的成本,这个速度不做太多要求。因为UID验证不一定要贯穿全程,仅在系统初始化的时候验证一下即可。

  我写的应该够详细了,术业有专攻,机械、电子、软件全是我一个人开发的,已经耗费大量精力了,实在无力从头攻克密码学了。希望诸位高手指一个方向,我好有针对性地选择一些资料去学习。多谢诸位。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
膜拜,过来后又学到很多东西,希望能有人帮到你。
2011-7-6 09:01
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
提点不靠谱的建议~

通信加密算法的话,可以先试试AES。如果加密速度确实成为瓶颈,可以从eSTREAM的软件组里边随意挑一个,比如HC-128,能快不少。图省事的话,也可以用RC4,代码好写,虽然安全性差了一点。

UID变换的问题,我听下来似乎对安全性没多大要求,只要变换出来和原来的不一样就行了吧。。。简单的异或似乎也没问题吧。个人提个建议,弄个跳转表,然后把它加密,用UID当作密钥,运行时再解密。
2011-7-7 03:45
0
雪    币: 287
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
  多谢LS,看eSTREAM的时候有个意外收获,他们还搞了硬件加密算法,以后有相关需求的时候可以用到FPGA上了。HC-128速度看起来挺快,平均每字节3.05周期,不过那个是奔腾处理器的测试结果,我得仔细看看移植到微处理器平台上应该怎么分配并行处理的资源。这个安全性应该有很大的冗余了,而且估计想山寨的人不一定听说过HC-128。

  RC4(ARC4)我也看了一下,CSDN上有源码,而且提到密钥长度达到128bit时其安全性仍然是非常高的。既然HC-128也是128bit,那我就很好奇地想评估一下同是128bit密钥的情况下二者谁速度快。

  至于UID的用法,对安全性要求并非不高,这个安全性高低是一个相对的概念。只要让山贼花在解密上的成本高到让他几乎无利可图就可以了。他得到一个芯片的flash内容之前要花费数万元成本,随后他会直接把提取出来的HEX文件烧录到空白的新片中,当他发现这个克隆不能工作时就会想办法解密。这时候他的样本只有一对:也就是一套加密后的HEX文件和一个UID。

  接下来他可能会反编译,如果我是他,我会试图找出芯片里读UID的那几句话,因为在我获得UID之前没有密钥,所有加密都是无法运作的。所幸读UID的方法很多,即使thumb指令集用来访问flash的指令数量有限,我也可以用变量寻址的方式绕开常量地址,让他无法一眼看出我是在访问UID的地址段。而且我可以在不同位置安排多个读flash的语句,把UID分开几次读,重复读,增加他猜测我用意的难度。

  如果他觉得这个方法是穷途末路,可能会考虑增大样本空间,也就是多买几套我的产品,都给解出flash内容,这样他的投资又会增加几万乃至近十万。而几份不同的固件和对应的UID拿到手之后他仍然面对着针对地址与数值的双重混合加密,针对数值的好做,但是地址的我不是很有把握。主要问题在编译器上。源代码和编译器我不想放到服务器上,因为一是觉得不太安全,二是如果很多用户同时申请升级固件,一套编译器狂跑,反复四处链接源文件,服务器的任务得卡到死。

  我想用的只有一个版本的固件模板。也就是说里面的变量与函数地址分配都是固定好了的,这样的话跳转表可能无法使用。不知道有没有什么折中的办法可以在编译后实现变址跳转功能,或者实现同样的保密效果,若有兴趣可以继续讨论,谢谢。
2011-7-7 23:40
0
雪    币: 74
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
关注!学习!!
2011-7-8 12:20
0
雪    币: 49
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不用编译也能得到不同固件,
把二进制机器码按不同函数切碎,然后随机排列,当然排列好后要修改函数调用的地址。
大函数还能进一步切碎,这个在源码上做,一个函数分成几个不难吧。

还可以吧部分机器吗加密,在RAM里解密在RAM里运行,flash上的是加密代码,读出来也很难搞,还能增大固件对比的难度。
2011-8-7 16:51
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
硬件芯片DS2401  可以拿来做硬件加密。
2011-9-16 12:24
0
雪    币: 57
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你这样一般人 对付不了就算了,
练psp iphone ps3都被逆向  无非是成本问题
如果是内部flash  估计可以挡住95% 黑客
不管aes 256你总要解密  无非dump的点选在那里
另外为下你那支持dma吗?
2011-9-16 12:52
0
游客
登录 | 注册 方可回帖
返回
//