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

[复制链接]
楼主: plc_avr
手机看帖
扫描二维码
随时随地手机跟帖
plc_avr|  楼主 | 2011-7-1 14:33 | 显示全部楼层
本帖最后由 plc_avr 于 2011-7-1 14:34 编辑

举个例子,现在假如在源码中写入版权信息。
1.jpg
在HEX文件地址:
2.jpg
打开软件计算版权信息的CRC16结果,存于XXXX处,在MCU中直接运算版权信息起始地址至存于XXXX处CRC值的地方,则CRC16结果为"0“,用CRC16的结果与其它变量异或如:
for (i=0;i<1024;i++)
    {
        para(i)= EEPROM_read(i)^CRC_DATA16;
    }
则参数的内容不会变,如果CRC结果不为0则参数内容会变,那么程序执行的结果必会出错。

使用特权

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


楼主就是为了防止修改代码(包括唯一的软件ID),提出一个即使知道方法也很难**的思路。
至于怎么去用这个功能,比如使用唯一ID和硬件ID去做校验,那是另外的事了。
如果会上位机软件,自己写这个程序,然后调用ISP程序或者内置ISP功能问题都不大。
楼主的思路方法才是最实用的,楼主的软件么,又不是你我给了钱定做的。。。不适合批量生产不关楼主的事。

使用特权

评论回复
plc_avr|  楼主 | 2011-7-1 14:40 | 显示全部楼层
楼上的62楼:heuyck:
谢谢!你说的正是我在做的,呵呵,软件本来是专用的,拿出来是给大家提供一种思路和方法。

使用特权

评论回复
plc_avr|  楼主 | 2011-7-1 14:42 | 显示全部楼层
60楼:zljzlj:
我写的软件不适合你用,但是肯定是满足我的要求的,要不然我画这么大精力搞这个做啥呢?
至于的表达能力有待提高,从你的说明书就可以看出来。----我小学没毕业,就凑合着看吧。嘿嘿。

使用特权

评论回复
hotpower| | 2011-7-1 14:49 | 显示全部楼层
53楼烈火描述的很好!
所谓“无缝隙”,就是无分支比较,那么你就不知道从何处下断点跟踪。
它的设计思想就是“放鬼子进村”,假定对手已拿到hex/bin文件。
它的思想同时不阻止任何非法程序的正常运行,但非法的程序不会得到正常的运行。
如同word软件,我们主要看的是文档。
那么我们只需拦截处理它的字符处理,为何软件序列码不对就不执行?
这不是告诉对手这里做了手脚吗???
所以应该继续执行,显示或打印乱字符!!!

所以,“无缝隙”是最关键的!

使用特权

评论回复
huangqi412| | 2011-7-1 14:56 | 显示全部楼层
老HOT讲的比较清楚,

使用特权

评论回复
plc_avr|  楼主 | 2011-7-1 15:07 | 显示全部楼层
哈哈,我的思路源于菜农的一手指点,过后闭门造车搞了几个月,终于可以交作业了。烈火在此谢谢菜农!

AVR玩的比较多,其它还是菜鸟,请各位多多指点.......

使用特权

评论回复
hotpower| | 2011-7-1 15:24 | 显示全部楼层
好些烈火同志的作业!
俺在二姨这里一直宣扬这个理念,就是没人搭理。
这次看到烈火用于实战,心里非常高兴!

呵呵,欢迎大家点击下面的老头,加入“共产儿童团”!
感谢烈火的生日礼物!

使用特权

评论回复
plc_avr|  楼主 | 2011-7-1 15:25 | 显示全部楼层
软件更新了一下,修正了一个随机数产生的BUG,有需要的请去楼主位下载.

使用特权

评论回复
龙紫枫| | 2011-7-1 15:26 | 显示全部楼层
支持LZ的共享精神

使用特权

评论回复
hotpower| | 2011-7-1 15:34 | 显示全部楼层
哈哈,今天是90岁的生日,大家的生日!

使用特权

评论回复
abin0415| | 2011-7-1 15:57 | 显示全部楼层
我对这个行业还不是很了解,弱弱的问一句。为什么要解密别人的产品,解密别人的产品所花费的时间与精力足以够自己去做产品的了。

使用特权

评论回复
lxyppc| | 2011-7-1 16:01 | 显示全部楼层
和我之前用的一个加密方式很像。
由于Flash可以由1变成0,而不能由0变成1。在写代码的时候在一些地方放上0xff之类的。
然后烧写的代码是两部分组成的。一部分是正常功能代码,里面填有0xff这些东西。一部分是“加密”代码,他知道这些0xff的位置。程序在第一次运行的时候会执行“加密”代码。“加密”代码根据一定的算法将这些0xff改成数据。改完后加密程序自毀。芯片中只“残留”了正常执行的程序。
正常执行的程序会时不时的去计算这些填好的0xff和部分程序内容,作为结果输出。如果没有修改,那一切正常。如果有修改,结果会时不时的出现错误。

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
McuPlayer + 4 “时不时的出现错误”比“直接导致错误”破 ...
McuPlayer| | 2011-7-1 16:07 | 显示全部楼层
楼主的方法,我称之为二次CRC或者多次CRC,使**的复杂度直接double了
CRC本身的**是很难的,所以**必然要走另外的路子
楼主的方法如果不用CRC,比如用最简单的累加和,采用二次累加和的方式,估计**难度差不了多少。

找到2个样本或者更多,把hex数据差异部分,标识出来,作为重点监控。
然后抓其中一个hex文件,到虚拟机里运行,把对“重点监控”区域的读写访问记录下来。
仔细分析判断分支的地方(这就是找分支的重点步骤了,也是最大工作量的地方),在判断点改代码
其实,我不喜欢用NOP替换分支指令,我更喜欢把JE改成JNE类似的方式

好了,怎么提高**复杂度,应该很多人心里有底了吧。

使用特权

评论回复
plc_avr|  楼主 | 2011-7-1 16:16 | 显示全部楼层
关键是有的有分支,有的没有分支,哈哈。

使用特权

评论回复
McuPlayer| | 2011-7-1 16:18 | 显示全部楼层
如果有PC软件**经历的人,肯定喜欢试探的方式找分支点。

我以前**入门的第一个软件是ACDSee看图,就是找到了判读SN是否正确的点。
太简单了,因为它只有一个点。

第二个**的软件,是一个同事用BCB做的小软件,那哥们一直认为BCB的编译器可以自动产生校验程序完整性就可高枕无忧了。
最后找到了程序入口处的,那段代码,被我把JE改成了JNE。

第三个打算破,但最后失败的软件是UltraEdit
输入SN,找判断点,然后改分支逻辑。然后重启看是否已经注册成功,实验了N多次,最后我这个**的初级选手彻底栽了。
其高明之处,就在于,他并不是当即立刻判断你的SN是否正确,你必须重启软件,判断点的个数的数量级立刻递增了。

这些PC上的做法,其实MCU上一样可用:
1、多点判断,大幅提高**者的工作量
2、判断后不立刻行动,随机的出现报告非法的问题
3、交叉判断,比如有3个判断点,互相检测对方是否正常

使用特权

评论回复
McuPlayer| | 2011-7-1 16:26 | 显示全部楼层
本帖最后由 McuPlayer 于 2011-7-1 16:27 编辑
关键是有的有分支,有的没有分支,哈哈。
plc_avr 发表于 2011-7-1 16:16


看来你还没理解到老Hot的精华

上了虚拟机,你那些假指令都是神马,因为你修改hex动的只是Data部分
如果你能动态修改汇编指令,俗称花代码,就是说指令运行前是加密的,运行时才解密到RAM中,运行完再销毁,这样复杂度就又提高了一个数量级,因为加密的密钥是跟一大堆数据相关联的

使用特权

评论回复
plc_avr|  楼主 | 2011-7-1 16:28 | 显示全部楼层
McuPlayer:是行家!
现在软件上面只做了三个CRC,其实只要MCU还有资源,完全可以做个10次8次的,层层相扣,牵一发而动全身.......

使用特权

评论回复
huangqi412| | 2011-7-1 16:39 | 显示全部楼层
MP,LZ的根本不能在RAM中运行的AVR,     要是ARM,能把代码读到RAM中,再运行,那倒是加密程度非常高。

使用特权

评论回复
ahgao| | 2011-7-1 17:55 | 显示全部楼层
看了这么终于好像明白了一点。但是对解秘的难度还是有疑问。如果通过芯片硬**并读出了全部代码,反汇编后一句句看下来,不还是被人**了?

使用特权

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

本版积分规则