jicheng0622

【原创猛料】浅谈知识产权保护方法之加密Kinetis K60(方案二)

0
阅读(4168) 评论(11)

    上篇详细的介绍了加密锁定Kinetis的一种方法,我觉着还没有过够瘾,所以本篇再接再厉,给大家再介绍一种加密方法(哎,这点家底都晒出来了,容易吗我)。当然实际上原理还是不变的,即还是通过修改0x400~0x40F地址段的内容来实现加密锁定,万变不离其宗,所谓殊途同归罢了,下面好戏登台:

    既然实现security最终都是改写寄存器加载段flash地址的内容,那实际上修改flash内容的方式还是灵活多变的,方案一中提到的在中断向量表的最后添加flash配置信息只是其中一种,那还有哪些呢?可能有经验的博友会猜到,我还是不摆谱了,不为难大家了,不然该被拍砖了,哈哈。不错,那就是通过在指定地址定义常量的方法,当然定义常量大家都会用到(有些应用譬如LCD显示的字模或者一些固定的查找表为节省RAM空间我们一般会选择定义const常量的方法将它们存放到flash空间中),但是指定地址的存放方式用的会少些(一般都是让编译器自动分配的),如果我们非要指定地址呢(哎,强迫症又开始了,呵呵),即将flash配置信息作为常量强制指定存放到0x400起始的地址,那岂不是跟方案一有了异曲同工之妙了,好吧,这样的话那就该“@”这位老兄上场了(咳咳,可不是给单片机发email啊,呵呵),相信很多人到此处就都明白了,不明白的可以拿出本单片机的书恶补上一番了,呵呵。下面我仍然以IAR环境下锁定K60为例,简单介绍下方案二的使用步骤:

1. 打开待加密工程中的main.c文件,在其中的main函数之前以添加如下图所示常量定义,即将FlashConfig数据组数据存放到“.flashConfig”段中,其中FlashConfig[11]即为0x40C地址:

image

2. 至于这个.flashConfig段属性是需要在与该工程匹配的IAR连接文件(.icf文件)中人为添加定义的,如下图所示,需要添加三个部分,然后保存:

image

image

image

3. 前两步完成之后,其实需要添加的部分就已经完成了,但是还有特别重要的两点需要注意,这里我加红注释一下,如下:

(1)采用方案二的情况,需要确保vectors.c中中断向量表最后的16个字节没有被添加,即不能有4个CONIFG_x配置信息的,否则会出现编译错误,因为这就涉及到两者冲突的问题,也就是说在采用方案一的话就不能采用方案二,同理,采用方案二的话也不能采用方案一,总之两者不能同存;

(2)还需要考虑编译器优化的问题,因为我们在.flashConfig段定义了常量,但是在代码程序里却没有使用它,这种情况下编译器会直接把这段常量优化掉,所以我们做的工作算是白做了,即使我们在IAR的优化等级中设置成low或者none都不行,因为人家编译器认死理儿,反正你也没有使用它,我就是怕它pass掉,这下子伤心了,呵呵。还好IAR给我们留了条后路,在options->Linker->Input选项卡中提供了Keep symbol功能,如下图,将FlashConfig添加进去即可强制编译不优化它,这样目的就达到了,呵呵,看来还是天无绝人之路啊。

image

3. 编译通过,下载调试,程序下载之后同样会出现进入不到调试窗口的现象,这个是正常现象,因为这个时候芯片就已经被security了,这样就可以放心量产了,呵呵~

    至此“浅谈知识产权保护”篇就结束了,呕心沥血之作,首发于ChinaAET,除本人之外转载请注明出处和作者信息。

    希望这两篇文章能对大家有所帮助,enjoy it,未完待续~

  1. @匿名用户(123.124.45.237 )
    你是用IAR下载的还是J-Flash下载?用IAR的话注意配置Flash Loader的write configure,这个请查询我上一篇文章(浅谈知识产权保护1),如果用J-Flash的话,注意选择带xxxxAllowSecurity.jflash工程。
  2. 匿名用户匿名用户
    生成的S19文件 040C 是FC,可是用jlink 时候依然可以读取flash  而且 40C是FE!!这是什么原因
  3. @marsaire
    我个人理解的话AWIC和NVIC都是ARM内核的模块,而在stop模式下唤醒的话是直接通过AWIC唤醒内核的,然后AWIC到Clock logic和NVIC的单向箭头是指可以通过AWIC开启NVIC的~
  4. @marsaire
    恩,是的,那样的话就彻底锁住了,只能通过Backdoor来解锁了~
  5. 还想问你个问题,关于kenitis的NVIC和AWIC是什么关系,我看有的功耗模式运行下(STOP /VLPS)唤醒是用AWIC,NVIC是禁止的,那AWIC的的功能框是这样,是不是先唤醒AWIC再通过NVIC来唤醒?
  6. 恩,多谢!我试了一下,依然是直接擦除!

    补充一个,如果设置了WRFFCCOB那mass erase也禁止了,那样就不能用jtag了,设置的时候需要注意。

  7. @marsaire

    你试试这里~

  8. 用jflash下载的时候:不小心点到了勾勾,现在每次都是自动擦除,不再询问,那我怎么判断是开启了保护?

    能否设置回去?

  9. @marsaire
    貌似是在EZport模式下就不能用JTAG了,我之前试过一次,但不敢确定~
  10. 不知道EZPORT和JTAG哪个优先级高
  11. 想再问你个问题:Kinetis系列支持EZPORT在线编程模式,如果一个空白的芯片,当EZPORT_CS_b没有外部是上拉的时候,这个管脚上上电时是使能了EZPORT,然后内部FOPT寄存器又从Flash中读到1(flash没有信息)。总之这样是会进入EZPORT模式的吧,如果这时使用JTAG有没有用?