芯唐的NUC100系列Cortex-M0有一个保护flash的配置。
按照NUC100 spec的说法,当写入了flash保护位后,flash将受到保护,
用户不能通过编程器或其他设备读出flash中的内容,当然flash中的程序还是可以运行的。
这个功能无疑是非常有用的,尤其国内的环境,保护代码是非常必要的,防火防盗放叫兽。。。
那么,这个flash保护的实效如何呢?有没办法破解掉?X-Hawk的确不信这个邪,
既然程序能如常运行,就一定有数据,既然有数据,怎么就抓不出来呢?
首先想到,先通过ICE调试接口从flash寄存器读读看。结果读上来全都是无效的数据,
全为0xFFFFFFFF。这个实验显然有点辱没开发者的智商。。。
于是再想,既然flash中程序能运行,那么flash中的程序显然能得到正确的flash内容了。
那么只需要将一段程序放到内存中去运行,由这段程序输出flash中的内容,这样是不是可以呢?
当然首先要解决的是,通过什么途径将程序放到内存中并运行。唯一靠谱的就是通过ICE调试接口了。
但是却无不遗憾的发现,在设上flash保护位时,ICE无法对内存直接进行读写。又一技谋失败!
一计不成再生一计,在一个风雨交加的夜晚,终于想到一个无比绝妙的主意。
不就是要先将读flash的程序放到芯片内部执行嘛,办法应该有的,只是道路曲折的。
我们知道,通常一个正常的ARM thumb程序,总有一些PUSH和POP指令在里头。
那么。。通过ICE调试接口修改CPU寄存器,使PC和SP寄存器指向同样的地址,然后单步使CPU运行一下.
如果PC处指向的是一条POP指令,那么该指令的内容将被POP到R0, R1等通用寄存器。
运行完检查寄存器R0, R1等,就可以判断出某个地址处是否有POP指令。
这样用单步运行的方式扫描代码,对整个flash地址区间做一遍,找到一两条POP指令必定不成问题。
有了POP指令的位置还不好办?改变SP,就可以读出任意地址的内容。
接下来的步骤就简单了,整理出破解思路如下:
1. 通过设定PC和SP一样,使PC指向不同地址扫描,找出指令POP所在的位置。
2. 将PC指向POP指令处,变换SP指向各个地址,将整个程序的内容POP出来。
基本上,程序内容就是部分flash的内容了。
3. POP出的程序内容中,只要是正常的程序,必定有PUSH指令。找出PUSH指令的位置。
4. 将PC指向PUSH指令处,SP指向RAM的地址,单步执行,就可以想RAM中写入数据。
这样写一段特殊的导出全部flash的程序到RAM中。
5. 执行RAM中的程序导出全部flash.
无懈可击的步骤!抑制不住激动的心情,和同事讨论了下想法,第二天一早就试验。
试验结果却再次失败,用ICE改PC,SP, 扫描所有的地址,均找不到POP指令,十足邪门。
而同事再次找到了根本的所在,当ICE连接上去,在flash受保护时,NUC100的flash到系统总线的数据将全变为0xFFFFFFFF。也就是说,任何想用ICE接口破解flash保护的尝试,都被硬件上直接杜绝了。。。
至此,所有尝试破解flash的努力均告失败。
厂商在保护flash程序被窃取方面,还是有一套的。
阅读(3033) | 评论(2) | 转发(0) |