本帖最后由 数码小叶 于 2020-7-11 11:32 编辑
前面已经体验了PW200的基本烧录调试功能,但是PW200的主要特色是加密,加密分为:在线授权、离线授权、IcwKey三种,可以体验的是在线授权和离线授权。
这一篇体验的是离线加密,打开PowerWriter的烧录器Tab标签,UID加密设置
加密模式选择“内置离线授权”,选择后可以设置的就是密钥地址、用户密码、Matrix编码。
用户密码有一点不太友好,不能全部显示出明码,要点一个输入框才能看到那一个框的密码。
离线授权主要的重点是Matrix编码设置,自动的按键有随机生成,检查代码,导出编码,编译并保存
检查代码可以检查出哪些项没有用到,同时这个加密矩阵是可以手动编辑的,手动加入这些项以及符号。
导出源码就是导出MDK工程,编译保存反而是同步到PW200,按钮命名“编译并保存”有点不太容易让人直白的理解按键功能。
这个导出的工程,实际是不能直接使用的
生成的模板里的启动文件是F1芯片,但是打开生成的文件里面又是正确的F4芯片,工程里包含的也是F1,所以需要自己新建工程。
这里还有一个问题,就是密钥地址,如果按照用户手册写的
这个地址是会根据目标芯片而改变的,实际测试,确实一直保持不变的
打开cortex_chipid_binding.c,可以看到刚才生成的加密矩阵,默认使用的不是直接生成的加密矩阵,二是加入了花指令的矩阵,增加破译难度。
手动新建一个工程,工程只保留基本的串口打印功能,测试通过后,在工程中加入m_serial_number的定义,主要是验证下实际地址和map文件的一致性。
map文件中的地址0x080015AC,打开PowerWriter,添加刚刚生成的固件,查看0x080015AC的数据
数据确实是我们定义的“5A A5 A5 5A”
再将生成的两个加密文件,cortex_chipid_binding.c和cortex_chipid_binding.h添加到工程中,
在主函数中添加验证和相应的执行信息,根据打印信息可以知道密码验证是否通过。
编译、下载后,打开串口助手
根据串口打印信息,可以知道,密码验证没过
反复测试检查多次,依旧失败,最后才发现,这个"智能自动编程"
原本以为这个和“自动编程”的区别只是擦除的flash范围不一样,结果却是差的不是一点点,智能自动编程会下载所有的内容,包括包括 SN和 Matrix 绑定数据。之前一直失败的原因就是在这,用“智能自动编程”后,程序验证通过
最后来看下两个读回来的密钥区内容对比
可以看到通过PowerWriter授权后,读取的flash内容已经改变了。是不是这个读取回来的文件已经包含离线授权呢?那就来测试下,先把授权通过的芯片读取回的文件保存,为了排除影响,关闭PowerWriter、写入其他Matrix编码、再往芯片里烧写个未经授权的文件、串口提示密钥验证失败,说明一起都排除了,再次烧录经过授权的文件,程序验证通过
又测试几次,效果依旧
所以说这个UID离线授权加密只要经过一次PowerWriter授权后就失去保护作用了么,或者说我就没有理解这个UID离线授权加密的意义
|