打印

菜农友情为STM32设计一种通用加密方法之原理

[复制链接]
楼主: hotpower
手机看帖
扫描二维码
随时随地手机跟帖
21
hotpower|  楼主 | 2010-8-20 20:34 | 只看该作者 回帖奖励 |倒序浏览
像正常的ISP必被**。
因为串口拦截软件可以轻松地拦截ISP的整个过程。
我在网上有拦截实例。
为此俺提出了远程ISP+IAP+UID新方法,并在此和香主约定网上讨论。
可惜被网友误导偏离了航向。
很是郁闷…

使用特权

评论回复
22
hotpower|  楼主 | 2010-8-20 20:39 | 只看该作者
此方法实际为两部分:
1.ISP+UID 此过程为理论不可**。
2.IAP+UID 此过程为理论可**。

使用特权

评论回复
23
eydj2008| | 2010-8-20 20:54 | 只看该作者
"千年老妖".....:lol

使用特权

评论回复
24
hotpower|  楼主 | 2010-8-20 23:08 | 只看该作者
菜农发布NXP ARM(Cortex)专用ISP程序HotFMShell V1.01 这是菜农绑架了NXP和Keil 实际可以做到UID自动改写,HEX文件不用变化

Cortex-M0菜鸟之Keil内运行ISP(第3天作业) 这是菜农绑架了Keil

CortexMo菜鸟逆向学习ISP(第4天作业)  这是ISP的拦截过程

使用特权

评论回复
25
sinanjj| | 2010-8-20 23:36 | 只看该作者
本帖最后由 sinanjj 于 2010-8-20 23:48 编辑

按照我的理解写写加密思路:

1, isp的时候读出MCU UID. pc软件记住.
2, 在pc上对这个UID crc加密. 得到一个唯一结果, 此结果可逆. 这个crc不是标准crc (大家注意!这里称之为crc_hot), 这个crc_hot是有密钥的.

函数如下: crc_hot(密钥, UID)= UID_CRC

用这个结果改动hex程序的存放UID_CRC的字节 (就是假定**者得到hex文件后diff出来的不同点)
3, 源代码里有对这个UID_CRC检测的函数, 函数通过对crc_hot函数的逆运算来得到UID, 对比读出的UID, 来判断hex文件与MCU的唯一对应.

**者需要**CRC_HOT加密算法才可得知UID_CRC应该填什么值.



大体思路应该是这样的.




这个实施需要注意的地方: 1, 加密算法得保密啊. 加密函数给**了就完蛋啦! 2, 代码实现得有库(代码不能公开啊). 3, 解密函数占用的ROM/ram尽量小.

别的还没想到.

如果易用性做的好, 估计能成为新一代放**标准

使用特权

评论回复
26
mcuisp| | 2010-8-21 00:19 | 只看该作者
1、一般加密算法无法保密,因为验证的过程必定包含解密,而一般mcu只能用对称算法。所以肯定可以从代码里分析出加密算法。
2、即使用不对称公钥算法,也很容易绕过。

所有这些伎俩,都只是增加**成本而已。包括费用成本和时间成本。

通过一些策略,是可以让**者的成本远高于正向开发成本。

使用特权

评论回复
27
hotpower|  楼主 | 2010-8-21 00:33 | 只看该作者
实际俺从不用**的程序,因为俺只相信自己~~~
**主要是用一些算法和协议。

使用特权

评论回复
28
李冬发| | 2010-8-21 02:12 | 只看该作者
最难的是读这个UID,用个函数?!那我就直接ret 0x0123456789ABCDEF12345678

使用特权

评论回复
29
dadodo| | 2010-8-21 02:43 | 只看该作者
俺认为可以把加密和解密算法都放在源HEX文件中,将此源HEX文件写入芯片中,首次上电运行时加密函数读取芯片ID生成一个或多个副ID通过IAP写入芯片多个相关地址处,其中包括加密函数所在FLASH空间,甚至还可以写入部分无效数据填充原加密算法部分的FLASH空间。这样解密者读出的每个芯片的HEX文件都不相同,而且加密算法部分已被破坏,如果用对称和非对称算法多重结合效果会更好。此法好处是不需要在电脑上读ID写副ID来回折腾,一次写入即可,缺点是不能象老hot那样远程ISP。
另外非常赞同老hot的观点,解密结果不能直接用来验证,而是参与后面程序运行。可以不是简单的X=0,也可以参考下当年的DOS时代,各自发挥想象力吧。

使用特权

评论回复
30
dadodo| | 2010-8-21 02:50 | 只看该作者
最近初学IAR for STM8,发现编译器很配合,可以很简单的得到任意函数的地址,放在一起就是函数的指针数组,ID可以派上用场了,哈哈。

使用特权

评论回复
31
dadodo| | 2010-8-21 02:53 | 只看该作者
最难的是读这个UID,用个函数?!那我就直接ret 0x0123456789ABCDEF12345678
李冬发 发表于 2010-8-21 02:12


直接返回无效!因为另外有人盯着呢:D

hot大叔,我理解的是不是这个意思?

使用特权

评论回复
32
dadodo| | 2010-8-21 02:55 | 只看该作者
读STM的ID连函数都不用,直接指针访问,非常方便,呵呵

使用特权

评论回复
33
hotpower|  楼主 | 2010-8-21 03:23 | 只看该作者
最难的是读这个UID,用个函数?!那我就直接ret 0x0123456789ABCDEF12345678
李冬发 发表于 2010-8-21 02:12


这个UID是公开的,解密者也是知道的

使用特权

评论回复
34
hotpower|  楼主 | 2010-8-21 03:28 | 只看该作者
利用指针运算打乱散转命令运行地址以增加反汇编难度
HotPower 发表于 2004-8-24 00:08 侃单片机 ←返回版面   举报该贴

/*------------------------------------------------------------------
         利用函数指针数组运行PS2键盘散转命令
-------------------------------------------------------------------*/
void PS2CommandExec(unsigned char key)
{
unsigned int i;
code void *funcpushbuffers[] = {//命令散转表(汇编中的16个DW)
/*------------------------------------------------------------------
         15个压键、放键及长压键事件处理函数指针地址
-------------------------------------------------------------------*/
  (void *)ClrWdt            + 0x0000,
/*---------------------------------------------
           10个功能键压键事件处理(独立管理)
----------------------------------------------*/
  (void *)PS2F1KeyPush      + 0x5b7d,      //功能键F1压键事件处理
  (void *)PS2F2KeyPush      + 0xa6ea,      //功能键F2压键事件处理
  (void *)PS2F3KeyPush      + 0xf157,      //功能键F3压键事件处理
  (void *)PS2F4KeyPush      + 0x4cc4,      //功能键F4压键事件处理
  (void *)PS2F5KeyPush      + 0x9731,      //功能键F5压键事件处理
  (void *)PS2F6KeyPush      + 0xe2ae,      //功能键F6压键事件处理
  (void *)PS2EnterKeyPush   + 0x3d1b,      //功能键Enter压键事件处理
  (void *)PS2EscKeyPush     + 0x8888,      //功能键Esc压键事件处理
  (void *)PS2BkspKeyPush    + 0xd3f5,      //功能键Bksp压键事件处理
  (void *)PS2KpKeyPush      + 0x2e62,      //功能键Kp压键事件处理
/*---------------------------------------------
           2个放键事件处理(集中管理)
----------------------------------------------*/
  (void *)PS2NumberKeyPop   + 0x79df,      //数字键放键事件处理
  (void *)PS2FuncKeyPop     + 0xc44c,      //功能键放键事件处理
/*---------------------------------------------
           2个长压键事件处理(集中管理)
----------------------------------------------*/
  (void *)PS2NumberKeyPushL + 0x1fb9,      //数字键长压键事件处理
  (void *)PS2FuncKeyPushL   + 0x6a26,      //功能键长压键事件处理
/*---------------------------------------------
           1个数字键压键事件处理(集中管理)
----------------------------------------------*/
  (void *)PS2NumberKeyPush  + 0xb593       //数字键0~9压键事件处理
  };
/*--------------------------------------------*/
  i = key;
  key &= 0x3f;//去掉键释放及长压键标志,取真键码
  key --;
  if (key < 20){//只有20个键
    if (key < 10){//数字键0~9
      if (i <= 10) key = 15;//(散转号0)压数字键0~9
      else{
        if (i & 0x80) key = 11;//(散转号11)放数字键0~9
        else key = 13;//(散转号13)长压数字键0~9
      }
    }
    else{//压功能键F1~F6,Enter..KP
      if ((i & 0xc0) == 0) key -= 9;//(散转号1~10)压功能键F1~F6,Enter..KP
      else{
        if (i & 0x80) key = 12;//(散转号12)放功能键
        else key = 14;//(散转号14)长压功能键
      }
    }
    ClrWdt();//喂狗(鬼知道键盘程序要运行多久,就替它先喂一次吧)
    i = ((key * 53 & 0xf) * 0x1000)+ ((key * 43 & 0xf) * 0x100) + ((key * 23 &
0xf) * 0x10) + (key * 13 & 0xf);
    _icall_((void *)funcpushbuffers[key] - i);//取键盘散转表并执行键盘命令
  }
}

使用特权

评论回复
35
hotpower|  楼主 | 2010-8-21 03:33 | 只看该作者
35楼是对函数指针加密的实例

(void *)PS2F1KeyPush      + 0x5b7d,      //功能键F1压键事件处理
这句是对函数指针数组的内容加密,让反汇编者不能通过肉眼看到函数的真实地址

i = ((key * 53 & 0xf) * 0x1000)+ ((key * 43 & 0xf) * 0x100) + ((key * 23 &
0xf) * 0x10) + (key * 13 & 0xf);
这句是解密函数的真实地址。

但这些都逃脱不了解密者的虚拟机或软件仿真的跟踪。

使用特权

评论回复
36
李冬发| | 2010-8-21 03:35 | 只看该作者
读STM的ID连函数都不用,直接指针访问,非常方便,呵呵
dadodo 发表于 2010-8-21 02:55

指针?那更玩完了。

使用特权

评论回复
37
hotpower|  楼主 | 2010-8-21 03:37 | 只看该作者
本帖最后由 hotpower 于 2010-8-21 03:39 编辑

俺和李冬发讨论了一个晚上,俺认为任何软件也逃不过注册机

使用特权

评论回复
38
李冬发| | 2010-8-21 03:53 | 只看该作者
读STM的ID连函数都不用,直接指针访问,非常方便,呵呵
dadodo 发表于 2010-8-21 02:55

查找0x1FFFF7E8,换成&(0x0123456789ABCDEF12345678)

使用特权

评论回复
39
hotpower|  楼主 | 2010-8-21 06:20 | 只看该作者
总之,加密者在明处,解密者在暗处。

使用特权

评论回复
40
香水城| | 2010-8-21 10:17 | 只看该作者
查找0x1FFFF7E8,换成&(0x0123456789ABCDEF12345678)
李冬发 发表于 2010-8-21 03:53


1)除了ST工厂中可以改变地址0x1FFFF7E8的内容,任何人都没有办法改变它

2)程序中可以使用0x1FFFF7E8这个地址,也可以使用任何一个地址+偏移量的方式访问,如果**者只查找0x1FFFF7E8,他会失望的。比如我用0x1FFFF7E0这个地址。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则