21ic电子技术开发论坛 单片机与嵌入式系统 侃单片机论坛 关于应用FLASH二次写入防止改写代码问题
发新帖我要提问
12下一页
返回列表
打印

关于应用FLASH二次写入防止改写代码问题

[复制链接]
4623|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2008-10-3 12:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在某种场合,有时不得不将Hex文件即程序代码交付对方自己烧写。

这在FLASH的MCU/ARM/DSP上会经常遇见,因为派人到对方现场ISP的费用太高。

故如何防止对方改写代码是我们需要考虑的问题。

这实际是已知代码反汇编源码的问题,如果不加以手段,那么任何反汇编软件

都会反出汇编源码,即使源码是C源码。

那么如何阻止对方反汇编及调试出程序真正的入口地址呢???

FLASH/EPROM大多都可以“二次写入”,即FLASH的某位为‘1’时可继续写入‘0’

但一旦写入‘0’时必须擦除后恢复为‘1’。

那么我们即可利用FLASH这一“特性”来保护真正的代码和数据在对方反汇编及调试时得不到所需结果。

我们可以将真正的代码(入口地址)和数据在HEX文件里让其为‘空’,即0xff/0xffff/0xffffffff

当首次运行时,解开一部分代码或数据,利用内部或外部看门狗复位,再次重复

解开一部分代码或数据...

这样复位N次后,真正的代码和数据才出现在FLASH中,程序才真正可以运行。

由于“解码”需要N次复位,故反汇编和调试工具也就无用武之地了。

实际应用中,一般要把显式调用函数改为结构函数指针调用。即类似COM接口技术。

它实际上是将重要函数的入口地址作为结构中的成员(函数指针表)。

若是我们将其申请为动态的结构指针,结构成员将要动态装载(函数指针表),这样

我们即可将“解码”后的“数据”装载即可完成。

如何防止代码被改写呢???这实际是个很简单的算术问题。

假入真正的数据或代码为(前3位):

01 02 03 FF. 

求和为0B.

由于不为0,我们认为未“解码”。

由于“惧怕”反汇编及调试跟踪“断点”,故不能去判断这个0B不为0是错误!!!

应该将此值去对函数指针表进行“解码”运算,因为正确为0,那么+或^实际

函数指针表会不变的!!!

由于debug时,很难发现IAP调用,即FLASH二次写入,故用0B去“解码”肯定不对。

所以我们只需将FF二次写入F5即可得到:

01 02 03 FA

这样求和为0。

假若这个FA隐藏在别处,或为其他“解码”所用,那么对方想改写源代码,即

想改写01 02 03都会出错。这就达到了我们利用FLASH二次写入保护代码的目的。

假若用CRC等算法和多次复位加载等,对方“解码”难度肯定增强。

当然本主题是在MCU不被解密的前提下,HEX文件的保护问题。

相关帖子

沙发
救火车| | 2008-10-3 12:36 | 只看该作者

只能防改动,无法防复制。不过也是挻绝的。

使用特权

评论回复
板凳
yewuyi| | 2008-10-3 12:47 | 只看该作者

热电源又出新招数了。。。

使用特权

评论回复
地板
hotpower|  楼主 | 2008-10-3 13:11 | 只看该作者

哈哈~~~这是和汽车电子约会时他提出的问题

实际很简单~~~

使用特权

评论回复
5
testcode| | 2008-10-3 13:14 | 只看该作者

直接用AES~~~

其实也只怕防君子~~~

使用特权

评论回复
6
hq_y| | 2008-10-3 17:10 | 只看该作者

哎这是实际问题啊,现在俺是整了一个加密芯片

使用特权

评论回复
7
makesoft| | 2008-10-4 19:51 | 只看该作者

楼主的风格完全不像老顽童

是不是正身,严重怀疑中

使用特权

评论回复
8
zyok| | 2008-10-4 19:55 | 只看该作者

没"鸟语"反而不习惯了?

使用特权

评论回复
9
aweyfan| | 2008-10-6 12:03 | 只看该作者

局限性

烧写时不加密,等正常运行不就可以读出了。
这方法只适合少数没有读出机制的mcu

使用特权

评论回复
10
pheavecn| | 2008-10-6 14:06 | 只看该作者

我正专注这方面研究中。。。

产品不日将出。
彻底解决这类问题。
到时候软件升级就完全可以放心交给客户代劳。

使用特权

评论回复
11
boy123| | 2008-10-6 19:14 | 只看该作者

有意思.这样可以把代码放心交给客户代工.

使用特权

评论回复
12
forthlab| | 2008-10-7 10:37 | 只看该作者

我觉得如果能用自己的ISP或IAP升级程序最安全

    每个CPU有独立的ID,生成ISP或IAP通讯密钥.ISP通讯数据加密,下载后CPU解密再写入flash.由于每个CPU的ID不一样,所以每个CPU下载的代码都不一样.外人就是监测或拷贝下载代码也没有用,写到其他的CPU内不能正常解密.
    用这个办法尤其适用于用户自己通过internet网络更新程序,并且可以记录更新的CPU的ID,时间,版本,数量等.

使用特权

评论回复
13
dragon_hn| | 2008-10-8 00:31 | 只看该作者

大多数情况还是要防程序被读出

1.不能控制数量.客户可以直接连PCB一起CLONE.
2.像PIC,EMC等量大的单片机不用说了,几百RMB搞定.
3.对用得不是很广的单片机,如果价值大的话,可以直接拨开塑封用显微镜照相.
4.对部分厂家提供的ID芯片,因为通讯协议通常是串口/I2C/SPI等,ID是可以仿造的.

使用特权

评论回复
14
dragon_hn| | 2008-10-8 00:32 | 只看该作者

唉,难啊!

使用特权

评论回复
15
hotpower|  楼主 | 2008-10-8 00:37 | 只看该作者

现在stm32每片唯一ID就提供了本主题的应用环境~~~

使用特权

评论回复
16
hq_y| | 2008-10-8 08:20 | 只看该作者

好东西

使用特权

评论回复
17
martial| | 2008-10-9 08:13 | 只看该作者

这是个不错的思路

使用特权

评论回复
18
汽车电子| | 2008-10-10 09:33 | 只看该作者

谢谢HotPower,约会半天,让我受益非浅,再次感谢!

   我的目的是:放心把代码交给客房自己烧录。和10楼一样。

   用远程ISP也是一个方法,B/S 或C/S。但客户可以监控串口。

   

使用特权

评论回复
19
hq_y| | 2008-10-10 09:42 | 只看该作者

强烈要求上艳照

一睹大叔芳容~~~~~~~``哈哈

使用特权

评论回复
20
hotpower|  楼主 | 2008-10-10 18:27 | 只看该作者

pheavecn在这方面是专家~~~汽车人可以请教他~~~

使用特权

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

本版积分规则

1538

主题

21697

帖子

506

粉丝
关闭 热门推荐
快速回复 在线客服 返回列表 返回顶部