打印

CRC16 HEX文件自动修改生成器,让盗版者头痛去吧。

[复制链接]
楼主: plc_avr
手机看帖
扫描二维码
随时随地手机跟帖
41
plc_avr|  楼主 | 2011-7-1 11:08 | 只看该作者 回帖奖励 |倒序浏览
36楼: 批量烧写的时候,你的HEX,只要准备一种?还是怎么个烧法。
-----------------------------------------
批量烧写的时候只要一个HEX做为输入文件,软件可以自动生成和硬件配对的HEX,直接将这个新HEX烧到芯片上去就好了。

使用特权

评论回复
42
linqing171| | 2011-7-1 11:23 | 只看该作者
还有CRC结果也可以随意设定,也存入随机数中,完了过后每个HEX文件是多处的大片的不一样,处理起来也是相当有难度的,当然象菜农这样的高手除外,哈哈。 ...
plc_avr 发表于 2011-7-1 07:47

你的做法,唯一能提高难度的,其实就是这个大片,其实“大片”只是一个量的难度,本身不存在质的难度。
楼上这些烧写的,我的所有用过的单片机,不管AVR还是51还是ARM,都用自制的烧写器。即使你不能自制烧写器,自制bootloader的水平总是有吧?

使用特权

评论回复
43
heuyck| | 2011-7-1 11:36 | 只看该作者
本帖最后由 heuyck 于 2011-7-1 11:37 编辑

我理解了一下,请看看对不对:
1.先将一段随机区刷成随机值。
2.把唯一ID写到该随机区。
2.再把随机区+程序,算出一个或两个或三个CRC。
3.最后把这几个CRC存到随机区。
ps:唯一ID可以和MCU的硬件ID有个对应关系。

如果要**,得先猜出有一堆随机值的加密区里,哪几个值是唯一ID,改成新MCU的硬件ID。
因为改了唯一ID就会影响某个CRC,所以得猜出加密区里哪个是受修改ID影响了的CRC,再把CRC改了,才能得出这个新MCU能用的固件。
如果加密区比较大,唯一ID和CRC就非常难找,然后CRC算法和起始结束地址又很难猜到。。。即使知道是这样做的,也很难**。

现在主要是楼主能不能把唯一ID做得长一点,可以自定义长度,15字节好像不够用哎。如果能加上某个可自定义的算法能从MCU硬件ID自动计算出唯一ID填入就更好了。

使用特权

评论回复
44
zzz1367| | 2011-7-1 11:55 | 只看该作者
顶!

使用特权

评论回复
45
huangqi412| | 2011-7-1 12:06 | 只看该作者
怀疑能否运行的童鞋,LZ准备放自己东西的一段地址显然是不放代码的,比如指定这段地址定义FLASH型数组。编译成BIN后,随便你怎么乱改定义成FLASH型数组的部分,并没有破坏代码。
LZ这个因为烧写时候需要换一个IC就生成一次HEX,如果大批量生产,只能将这个软件跟烧写器软件捆绑一起配合使用了甚至直接合成一个软件,不然人工操作两个软件要累死人。

使用特权

评论回复
46
huangqi412| | 2011-7-1 12:14 | 只看该作者
比如像STM32,就可以这么干。。。
代码里搞几个定义在FLASH里的数组,并且指定数组地址。
自己写一个串口ISP软件,包含LZ软件的功能。打开待烧写HEX,进行必要设置----主要是地址,这个可不能随便指定。
每烧一片,只需要点击一次“自动”,甚至连点击“自动"都不需要-------串口一直不断搜索芯片是否存在。
软件会先读回唯一ID。对序列号,CRC权值,填充块等都按软件设置的每烧一片就变,地址也能在指定数组范围内适当变化,计算CRC等修改HEX成一个临时数组,烧进去。      不断循环这个就可以了。

使用特权

评论回复
47
teddeng| | 2011-7-1 12:25 | 只看该作者
楼主,你这个方法需要在单片机应用代码里加入CRC校验代码吧?这段代码还要菜农大叔的“无缝”技巧吧?

使用特权

评论回复
48
plc_avr|  楼主 | 2011-7-1 12:38 | 只看该作者
42楼:linqing171:都用自制的烧写器。即使你不能自制烧写器,自制bootloader的水平总是有吧?
-----------------------------------------------
自制烧写器与仿真器 BOOTLOAD,AVR系列的我几年前就做出来了,呵呵。其它的片子不懂,菜鸟一个。。。。。

使用特权

评论回复
49
plc_avr|  楼主 | 2011-7-1 12:46 | 只看该作者
43楼:heuyck:
你的想法是完全正确的。唯一ID做得长一点,可以自定义长度,15字节好像不够用哎。这个可以根据需要改的,呵呵。

使用特权

评论回复
50
plc_avr|  楼主 | 2011-7-1 12:55 | 只看该作者
46楼:huangqi412:最好的方法确实如你所说,将此功能集成到下载软件中,不生成HEX文件都行。直接完成上述功能并直接烧写目标单片机,这样省去在两个软件中切换。软件共享的目的就是,为各位多提供一种方法,再加上你们自已的创意,为各位所用。

使用特权

评论回复
51
plc_avr|  楼主 | 2011-7-1 12:57 | 只看该作者
47楼:teddeng:
防止改写HEX,要在单片机中加入CRC校验代码,这段代码还要用菜农大叔的“无缝”处理,
----------------------------------------
是的,如你所说,软件生成的HEX与MCU中的验证代码相互配合才能发挥最佳效果。

使用特权

评论回复
52
plc_avr|  楼主 | 2011-7-1 13:15 | 只看该作者
否则光生成随机数及CRC结果放在那个地方也没有什么用。与其不共享软件及思路,先说MCU加密方法,有多么复杂,有多么可靠,操作太复杂批量生产肯定是不行的,所以我想办法整出了这个上位机小玩具,在一定程度上减轻了自已的麻烦。  先放出软件再反过来讨论MCU运算,呵呵,就好理解了。其实就是矛与盾,加密与解密,不论你的源码有多复杂,总归有高人能解开的。但是在一定程度上增加了牛人的脑力劳动。也在一定程度上保护了HEX不被改写。因为不是人人都是牛人,呵呵。
本来软件专用于我的一个项目上,想了想还是搞出来大家一起共享比较好。集思广益,欢迎大家一起交流。。。。。

使用特权

评论回复
53
huangqi412| | 2011-7-1 13:19 | 只看该作者
50# plc_avr
对于无真实硬件唯一ID,无联网的场合,只生成一个HEX,防止别人修改版权信息就可以了吧。每个都生成不同HEX似乎也无其他益处。
对有硬件唯一ID,或者能联网的场合,每个生成一个HEX,不仅能防止修改版权信息,还能阻止正常运行。

LZ能否给大伙个简单示例演示一番,  特别是对
菜农指出最关键的是“无缝隙”概念:就是不要直接将CRC结果比较,那样必须会有if(A==B)或变种,这样别人找到分支,可以用NOP替代就完了。而是直接将CRC段的结果再与设定的CRC结果再运算一次结果必为0,不为0那就是HEX被修改。再用结果0与其它变量异或运算,则其它变量值并不会改。若改动一个字节,则结果不为0,那么CRC结果的结果再与其它变量异或,那么变量的值结果肯定会变,而且是不预知的......代码肯定不会好好运行的。比如定时原先1分钟,现在就可能变成随机数.....哈哈,目的达到了!

使用特权

评论回复
54
xwj| | 2011-7-1 13:29 | 只看该作者
哈哈,还是小黄聪明。

所谓的“无缝隙”概念,
可以把版权信息、把CRC结果加入赋值、加入程序运行中的状态机状态等,这样,程序只要有一点变化,那么运行就乱套了,而你想跟踪的话是很难找出到底哪里出了问题的。

这只是举个例子,你也可以自由发挥

使用特权

评论回复
55
huangqi412| | 2011-7-1 13:32 | 只看该作者
谢谢LZ,,加密思路有了,但如果你这个无法跟烧写配合,虽然比修改源码数组再编译提高了一个档次,但依然是个累死烧写人的活儿。        
1 可以将这个做到PC烧写软件中
2 可以将这个做到脱机烧写器,或者联机烧写器下位机中
3 可以做到IAP中,下载完HEX后甚至可以将IAP自身删除掉。需要的多余FLASH就比较多了,至少除了正常程序外还得能放下IAP.

还是对LZ的单片机程序比较感兴趣,对单片机判断部分,求LZ给个演示,
菜农指出最关键的是“无缝隙”概念:就是不要直接将CRC结果比较,那样必须会有if(A==B)或变种,这样别人找到分支,可以用NOP替代就完了。而是直接将CRC段的结果再与设定的CRC结果再运算一次结果必为0,不为0那就是HEX被修改。再用结果0与其它变量异或运算,则其它变量值并不会改。若改动一个字节,则结果不为0,那么CRC结果的结果再与其它变量异或,那么变量的值结果肯定会变,而且是不预知的......代码肯定不会好好运行的。比如定时原先1分钟,现在就可能变成随机数.....哈哈,目的达到了!

使用特权

评论回复
56
huangqi412| | 2011-7-1 13:36 | 只看该作者
叉哥,我会害羞滴:$

使用特权

评论回复
57
bnyuli| | 2011-7-1 13:43 | 只看该作者
能配合的角度会有几种

使用特权

评论回复
58
xxmmtt| | 2011-7-1 14:01 | 只看该作者
支持一下,有时间学习一下

使用特权

评论回复
59
plc_avr|  楼主 | 2011-7-1 14:17 | 只看该作者
55楼:huangqi412:
谢谢LZ,,加密思路有了,但如果你这个无法跟烧写配合,虽然比修改源码数组再编译提高了一个档次,但依然是个累死烧写人的活儿。        
1 可以将这个做到PC烧写软件中
2 可以将这个做到脱机烧写器,或者联机烧写器下位机中
3 可以做到IAP中,下载完HEX后甚至可以将IAP自身删除掉。需要的多余FLASH就比较多了,至少除了正常程序外还得能放下IAP.
---------------------------------------------------------------------------------
这些都不是问题,呵呵,关键是给大家提供思路,找到一种适合自己的。我项目中的上位机源码肯定还要做其它处理,呵呵。
    现在成功运用于AVR ATMEGA32上面。我的IAP还有其它用处,所以直接用软件修改HEX啦。改一个字,FLASH空间代码上电全部擦除或者过了N天全部擦除或者功能不正常等,其它想法任由发挥。

使用特权

评论回复
60
zljzlj| | 2011-7-1 14:25 | 只看该作者
看了半天,才读出点眉目,lz的表达能力有待提高,从你的说明书就可以看出来。
加密hex ? 挂钩唯一硬件ID ? 防止在hex 文件直接修改代码功能?增加量产IC 烧录工的工作量
这个东东嘛~   就不评价了。

使用特权

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

本版积分规则