搜索
bottom↓
楼主: flywater

绝对安全的单片机程序加密技术--如果你的程序再被盗请找我索陪!讨论热烈

  [复制链接]

出0入0汤圆

 楼主| 发表于 2010-3-22 20:26:30 | 显示全部楼层
楼上够狠...
这种至高境界确实早有耳闻,但它有个缺点,就是要存状态到EEP中,EEP是纯数据性东西,跟踪起来象找秃子头上的虱子一样容易。
要想发扬这种至高境界,只能与我所述方法配合才能使这种境界名符其实...

出0入0汤圆

发表于 2010-3-22 20:27:04 | 显示全部楼层
回复【99楼】flywater 落叶
-----------------------------------------------------------------------

在你提出软件加密的基础上再加上自宫程序,可以附带OSC校验加密,还可选用带PA后缀的芯片加密程度会更高,似乎我的想法有点天真^_^。

另请教:AVR是别想了,不用从板上取下,更根本不用开盖就拿HEX了。

我对破解过程不了解,能否公布一下不用从板上取下就能拿HEX的过程或思路,以提高大家对破解的认识?

出0入0汤圆

发表于 2010-3-22 20:36:55 | 显示全部楼层
多个物理不同地址的Hash函数;多个不同的Hash调用入口;多个不同功能,不同时使用的程序失效标记;互相交叉,全面覆盖关键代码区域的校验范围。这是目前LZ提出的方法。

无疑,交叉覆盖确实能很大程度上增加反向工程的难度,互相掩护的验证信息程序都必须被处理掉,否则总会有出现问题的部分。尤其出现问题的部分在于调整运算参数这类的东西。

即便拿CRC算一个代码段,算出来的结果是一个程序中用到的关键参数,在静态字符池中放调整数据这么干,这件事在软件仿真下,也是比较容易得到结果的一个事情。

亦即,LZ的方法大幅增加了反向的难度,当然,也增加了代码的复杂性,但是,“绝对安全”肯定称不上。

出0入0汤圆

发表于 2010-3-22 20:38:13 | 显示全部楼层
学习了,都是高手

出0入0汤圆

 楼主| 发表于 2010-3-22 20:38:32 | 显示全部楼层
回复【102楼】kevintang
-----------------------------------------------------------------------

具体做法是不能随意宣扬的,这可是有违道德规范....
我只能给你提一下AT系列老产品的不开盖解密方法:芯片擦除是要一定时间的,它先擦加密位再擦数据,只要你控制一下擦除时间即可,发送擦除指令后给它供的能量只够它擦加密位就行了,然后....这个片子就是你的了....
其实AT芯片都有这种僻好,只是方式稍有差异...
说得简单些,但实际做起来还是有点难度的,如果你想用手动开关去控制这个时间,哈哈....

出0入0汤圆

发表于 2010-3-22 20:43:01 | 显示全部楼层
回复【105楼】flywater 落叶
-----------------------------------------------------------------------

感谢楼主的耐心答复,我一直认为破解是要取下芯片开盖才能绕过加密位,现在才觉得是太天真,愿更多的高手站出来共同探讨加密的最高境界,向破解者发起大规模挑战。

出0入0汤圆

发表于 2010-3-22 20:52:59 | 显示全部楼层
回复【104楼】kk67696248
-----------------------------------------------------------------------

据我所知,除楼主外其他的高手都在沉默中,其他高手们的加密方法肯定还有一套我们没想到的,要不高手们早已进来拍砖了,大家的讨论也是希望能找出其他高手们的另一套加密方法,不知我猜测的对不?楼下请轻拍

出0入0汤圆

发表于 2010-3-22 21:07:46 | 显示全部楼层
观望中!!!

出0入0汤圆

发表于 2010-3-22 21:09:30 | 显示全部楼层
回复【99楼】flywater 落叶
-----------------------------------------------------------------------
说实在话,加密的方式真的很多很多,下架就自宫的确是一种很好的方式,它的难点在于不能宫了自己,万分之一的可能都不行...
但你说的这种方法不行,他完全按你的电路去做,你的这种方法是行不通的,你的程序这时不分敌我。
你的这种利用原电路上的上拉或下拉电阻自宫的方式只适合于硬件破解难度大,必须开盖的MCU,AVR是别想了,不用从板上取下,更根本不用开盖就拿HEX了。
自己把AVR在板子上用不到的引脚用细线连起来,程序上电检查决定是否自宫倒是可以的---他们抄板,也许你可以期望他们看不到你有几个脚中间用焊点连起来了,而是以为你的焊接失误,而只抄了你的PCB,自己焊上MCU后并不知道把某几个脚也连起来,进而一上电就......
-----------------------------------------------------------------------

当然不能宫了自己,最起码还得要加一个验证密码,减少宫了自己的可能性,以下是我的思路请指出不当之处,在调用自宫函数时传入一个密码,大家评价一下如果程序跑飞会不会被意外自宫?前提是在非正常调用这个函数时。


void __attribute__((section(".DelSec")))Format_All(uint32 iPIN)
{
        unsigned long n;  
        if((iPIN^0x84830420)!=0)return;
           for(n=0;n<FLASHEND;n+=SPM_PAGESIZE)  
         {
                while(boot_rww_busy())
                {
                        boot_rww_enable();
                        wdt_reset();
                }
                if((iPIN^0x84830420)!=0)return;
                boot_page_erase(n);
        }  
}

出0入0汤圆

 楼主| 发表于 2010-3-22 21:09:43 | 显示全部楼层
嗯,103楼分析得很透彻,一看就是高手,在此非常感谢您抽时间看了全部贴子。

直至目前,我所提出的方法也仅是增加了反向工程的难度,这一点毫无疑问,至于这个难度提高了多少,根据不同人的理解,也会有不同的答案,用在高手笔下,可能是呈多个数量级概念,但我肯定还是会承认,只用这种方法想实现绝对安全,是天方夜潭...

回复【107楼】kevintang
加密是内家功夫,一般高手们自创的加密方式都会藏着自己享受,这也是没办法的事。

出0入0汤圆

 楼主| 发表于 2010-3-22 21:19:12 | 显示全部楼层
回复【109楼】kevintang
-----------------------------------------------------------------------

加个参数后的这段程序把自己宫掉的可能性小得多了,除非你的参数 iPIN 正好未被初始化或随机跳上个正确值。
我那段文字除了说不要宫到自己,主要是说用电路上现有的上拉或下拉电阻去检测是靠不住的。

出0入0汤圆

发表于 2010-3-22 21:25:50 | 显示全部楼层
庆祝本贴在24小时达到112回帖,点击量到达2289,其中我滥竽充数回复了10贴,挣几个积分^_^

出0入0汤圆

发表于 2010-3-22 21:34:58 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-3-22 21:36:27 | 显示全部楼层
这个讨论非常好,支持楼主!
AVR的加密确实是个短板,
如果能通过这个讨论,
使得大家的反盗版能力得以提高,
那么楼主是真功德无量啊

出0入0汤圆

发表于 2010-3-22 21:37:25 | 显示全部楼层
有时间看,目前在盗版别人呵呵

出0入0汤圆

发表于 2010-3-22 21:39:15 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-3-22 22:00:39 | 显示全部楼层
睡前顶一顶

出0入0汤圆

发表于 2010-3-22 22:07:07 | 显示全部楼层
mck

出0入0汤圆

发表于 2010-3-22 22:28:13 | 显示全部楼层
关注

出10入95汤圆

发表于 2010-3-22 22:56:51 | 显示全部楼层
刚才写得不见了

现在,搞编程的人越来越多了,工具多了方便了,很多东西,入门门槛也低了,
以前的电子产品能卖得很贵,利益很大,也是这样,有些过热,有时我们这样,
都在相互竞争,把价格做低.

现在的产品,只是刚出来的时候,能卖点价格,也就过一年两年,价格不下来,
当然,有些地方,你的产品做的好,价格做的地,也不一定有人用你的,民品除
外.

我觉的,应该把有限的精力,花在以下三点:

1.更加了解客户,把服务搞好,把关系做好;

2.把质量做好,让客户觉得与你的合作,是明智选择;

3.不要把价格卖得太高。

出0入0汤圆

发表于 2010-3-23 00:33:28 | 显示全部楼层
受教

出0入0汤圆

发表于 2010-3-23 00:35:16 | 显示全部楼层
回复【64楼】l456789
反汇编不是我的强项,不过用IDA反汇编出来后,加到开发编译环境里仿真调试下,你就知道哪里是代码,哪里是数据了.
-----------------------------------------------------------------------

你试试我的吧,反汇编后发现就那个壳是可执行部分,其余的代码全部变成数据了.

出0入0汤圆

发表于 2010-3-23 00:41:48 | 显示全部楼层
回复【97楼】dr2001
回复【62楼】kangar0065  冒牌袋鼠
-----------------------------------------------------------------------
对于没有动态修改指令的代码,可以类比于烧在Flash中,运行中固定不变,不会被动态修改的代码。如果完整得到正确的代码本身,比如原始HEX文件,这种东西是没有办法逃过IDA Pro这种静态代码分析软件或者软件仿真环境的。
花代码,只是造成“按照内存地址顺序”顺序反汇编的反向工程工具 直接 反向输出的结果错误。如果你使用IDA Pro这样的工具进行逐条指令跟踪操作,花代码不会造成任何困扰。对于软件仿真环境来说,一样,物理CPU怎么执行操作,就怎么执行,没有影响。
即,花代码使得反向工程时,干扰了反向工程工具的函数调用关系分析。迫使反向工程人员从函数级的分析,局部的陷入指令级分析,大大增加了反向分析......
-----------------------------------------------------------------------

确实是那么回事情.等他反汇编出来,基本上64K全都看过了一遍.确实要蛮牛的人才行

出0入0汤圆

发表于 2010-3-23 00:49:38 | 显示全部楼层
这个 【62楼】 kangar0065 冒牌袋鼠 不厚道啊,发的程序占用FLASH空间35KB多。。。

(我看了下我承认我解不了,因为太长了。虽然我第一次看别人的HEX代码,我从来就没写过这么长的。)


(原文件名:asm.PNG)

出0入0汤圆

发表于 2010-3-23 11:24:49 | 显示全部楼层
jih

出0入0汤圆

发表于 2010-3-23 11:45:36 | 显示全部楼层
强帖留名。。。

出0入0汤圆

发表于 2010-3-23 11:47:06 | 显示全部楼层
mark
有空再来看

出0入0汤圆

发表于 2010-3-23 12:49:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-23 13:15:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-23 13:35:15 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-3-23 13:45:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-23 14:21:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-23 14:24:40 | 显示全部楼层
得承要学习的东西太多了。

出0入296汤圆

发表于 2010-3-23 14:59:26 | 显示全部楼层
其实我想说……只要你有if无论你比较几次……如何的交叉比较……
拿你if的地方开刀就OK了……

我如果破解,拿到HEX以后,第一件事情,全文搜索spm或者elpm,替换成nop,然后再根据spm和elpm的位置找出函数的开头,
然后根据这个函数的位置,全文搜索相关的call或者jmp……别以为没有这样的工具,即便写一个也不过是1天时间……

然后根据这些call和jmp的位置,搜索条件跳转的汇编……顺藤摸瓜……别以为工作量很大,没有多少的……甚至可以全自动……

因为大部分人不会对函数指针进行加碱计算,因此所有的call或者xcall或者rjmp语句都是常量的……
写一个简单的小模拟器,全文检索跳转关系,最后从elpm和lpm位置,反看,看看哪些“路径”最终落入elpm和lpm,然后……
把这些路径掐断……nop掉……就OK了……

所以,对于校验如果用函数你就天真了……别人直接把这个call改为nop就……
用内联才是王道……

出0入0汤圆

发表于 2010-3-23 15:27:59 | 显示全部楼层
景仰下

出0入0汤圆

发表于 2010-3-23 15:41:09 | 显示全部楼层
敬仰一下

出0入0汤圆

发表于 2010-3-23 17:02:32 | 显示全部楼层
菜鸟飘过

出0入0汤圆

发表于 2010-3-23 17:32:01 | 显示全部楼层
矛 与 盾

一般来说,一个产品能用最新的ic顶个2~3年就可以了。

出0入0汤圆

发表于 2010-3-23 19:22:32 | 显示全部楼层
首先我要说下,我不是搞破解的,在单片上面还没赚到过一分钱,只是爱好。

我只看自己写的C,然后反汇编研究。

【62楼】 kangar0065 冒牌袋鼠 的HEX拿去直接反汇确实是不行的哈。

但对于有点基础的人是没用的。我昨天看了下代码,没办法用机器生程ASM文件

可能是软件太傻了。我要跟大家说的是这个程序里面的防反汇编的秘密:

这个程序在第一次跳转后暴露了秘密

第一个:

用先将要跳转的数写入指针,然后压入堆栈,然后用中断返回指令,实现跳转

实际上就是将指针的值送给PC

MOV     DPTR,#7593H
PUSH    DPL
PUSH    DPH
RETI
这几条语句等于LJMP 7593H


第二个:
在跳转指令后面插入一个数据误导反汇编软件。

我想原形应该是这样的:
        CLR        A
        JZ        L1
        DB        12H
     L1:NOP
        ....

前面有一个CLR  A 配合下面的

JZ   7596H看似没问题实际上很有学问

JZ   7596H这条指令对应的是7593H这个地址,而跳转到的是7596H

减去本身占的两个字节,还有一个7595H是空的,这个就被用来动手脚了。

这里面的7595H 实际上是插入了一个数据12H 用指令DB  12H实现(重点在这)

但是反汇编软件没有记算指令运行的实际情况就是把这个12H加后面的内容组成一个指令。

12H 00H 90H 组成的是一条LCALL 0090H的指令(错误的指令)

而实际上跳到的位置是7596H对应的数据00H是一个NOP,运行后PC+1

到了7597H 对应的是 90H跟后面75A1组成了一个MOV     DPTR,#75A1H

下面对应的又是:
PUSH    DPL
PUSH    DPH
RETI

也就是跳转指令LJMP 75A1H

出0入0汤圆

发表于 2010-3-23 19:39:12 | 显示全部楼层
记录下!!!
呵呵!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
不过我公司的从来都没有没有加密的!!!!!!!!!!!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2010-3-23 19:49:06 | 显示全部楼层
终于又见高手们来拍砖了

回复【135楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------

个人认为傻孩子的建议非常好,只要拿到HEX文件反汇编对破解高手来说根本不及一提,虽然本人不懂。
如果采用下架自毁的方式就可以防止拿到HEX,既然AVR芯片不需要取下芯片就可以破解,那么我们可以在量产的时候禁用在线烧录和调试功能,改用BOOTLOAD升级,迫使破解者非取下芯片才能解密,当破解者上电读取时就可以自毁,各位高手对此有何见解?

出0入0汤圆

发表于 2010-3-23 20:20:23 | 显示全部楼层
回复【140楼】hsztc  
-----------------------------------------------------------------------

花指令就是这样的。

其实花指令本身限制很大,简单总结如下。

----
花指令使用要求非常明确:

- 指令集不等长;长度范围越大越好。典型为CISC的MCU,比如51,X86的指令集非常符合这点。这是最基础的要求。定长指令集,RISC内核,就不要想什么花指令了。ARM的Thumb-2是不定长的,不过应用很有限。

- 长指令,在扣掉其指令前缀后,后续数据可以是有效指令。比如字节序列ABC,若A是指令前缀,B/C/BC之一必须也是有效指令。这是花指令实现的核心,就是利用跳转,跳转到长指令中间继续执行,达成混淆的目的。

- 指令集字节编码是完善的,即变长指令集的各字节,0x00-0xFF都有有效的编码含义。这是花指令达成连续混淆的基础。如果不能连续混淆,过两个指令因为指令编码错误,就会被反汇编软件纠正。
  不幸的是,51正好满足这个苛刻条件:首字节基本上把自己的事儿搞定了;多余的字节不是内存地址就是立即数。其它的体系不一定或很难满足这点。
  略微解释一下,对于字节化指令流ABCDEFG:A是跳转,跳转到C;BCD构成花指令,即执行顺序A-C-DE-FG;因为花指令引发的混淆,反汇编顺序A-BCD-EF-G。这是有可能出现的情况。但是,观察指令序列,发现了E,在正确的指令流中不是前缀,如果指令集前缀不完善,那么很有可能这个就是一个非法指令前缀,反汇编可能就会跳过。反向工程工具给出一个可能的报告,后边正常,很容易处理。

不一定很全面,但花指令理论上的分析,估计也就是这些了。


----
花指令的效果:

- 静态反汇编输出工具:产生连续混淆,基本没法用。

- 静态反向分析工具:产生大量错误调用关系,需要大量人工介入,分析者局部陷入指令级分析。但当花指令部分被合理处理后,分析功能回复。

- 软件仿真环境:无效。51的代码直接丢进Keil,断点单步功能再强一点,还是比较爽的。如果再有Trace。。。我相信有这样的工具,尽管我不知道。

- 代码编写者:手工进行编写,相对痛苦,代码较难维护。应该可以自动生成花指令。。


----
花指令局限非常大,我觉得没什么太大讨论的必要。有需求反向工程学习的,自己弄弄就好了。

仅供参考。

出0入0汤圆

发表于 2010-3-23 20:53:16 | 显示全部楼层
回复【135楼】Gorgon Meducer  傻孩子
-----------------------------------------------------------------------

静态调用关系是容易被搞定的。尤其是特定体系结构上的特定指令。

异步动态的相对分析就会麻烦一些,比如用队列向某个函数集发送操作指令包,函数集的一部分是计算CRC。相对增加分析难度。

出0入0汤圆

发表于 2010-3-23 21:19:56 | 显示全部楼层
mark了学习

出0入0汤圆

发表于 2010-3-23 21:51:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-23 22:16:15 | 显示全部楼层
回复【140楼】hsztc
首先我要说下,我不是搞破解的,在单片上面还没赚到过一分钱,只是爱好。
我只看自己写的C,然后反汇编研究。
【62楼】 kangar0065 冒牌袋鼠 的HEX拿去直接反汇确实是不行的哈。
但对于有点基础的人是没用的。我昨天看了下代码,没办法用机器生程ASM文件
可能是软件太傻了。我要跟大家说的是这个程序里面的防反汇编的秘密:
这个程序在第一次跳转后暴露了秘密
第一个:
用先将要跳转的数写入指针,然后压入堆栈,然后用中断返回指令,实现跳转
实际上就是将指针的值送给PC
MOV     DPTR,#7593H
PUSH    DPL
PUSH    DPH
RETI
这几条语句等于LJMP 7593H
第二个:
在跳转指令后面插入一个数据误导反汇编软件。
我想原形应该是这样的:
        CLR A
        JZ L1
        DB ......
-----------------------------------------------------------------------

第一层是开了,后面还有呢.......版权部分

出0入0汤圆

发表于 2010-3-23 22:20:34 | 显示全部楼层
大部分破解只需要hex就可以生产。有破解需求的boss一般不会要求分析-改进的。涸泽而渔的人怎么会懂得那么多呢。搞坏了这个行业,他再去选择另外一个行业就是了。
我接触的国外产品基本不做加密--打磨、加密位等等都没有的。因为没有人敢买破解的东西,代价很高。
我想,这样才是根本吧。

出0入0汤圆

发表于 2010-3-23 22:26:25 | 显示全部楼层
MArk

出0入0汤圆

发表于 2010-3-23 22:30:34 | 显示全部楼层
【147楼】 kangar0065 冒牌袋鼠

前面说了,程序太大了,怕怕,不想搞。

出0入0汤圆

发表于 2010-3-23 22:43:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-23 23:15:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-23 23:44:53 | 显示全部楼层
牛人也!

出0入0汤圆

发表于 2010-3-24 00:01:03 | 显示全部楼层
看来各位DX都极为重视版权问题,^_^,再顶

出0入16汤圆

发表于 2010-3-24 00:15:29 | 显示全部楼层
先睡觉,mark坐等高人讨论

出0入0汤圆

发表于 2010-3-24 00:37:09 | 显示全部楼层
不错,不能彻底加密,至少极大的增加接密难度了

出0入0汤圆

 楼主| 发表于 2010-3-24 10:36:15 | 显示全部楼层
很报歉,最近比较忙,没空上来和大家探讨....
不过,能看到大家对这个话题讨论的热情,这是令我很开心的.

出0入0汤圆

 楼主| 发表于 2010-3-24 10:51:25 | 显示全部楼层
回复【135楼】Gorgon Meducer 傻孩子
其实我想说……只要你有if无论你比较几次……如何的交叉比较……
拿你if的地方开刀就OK了……
我如果破解,拿到HEX以后,第一件事情,全文搜索spm或者elpm,替换成nop,然后再根据spm和elpm的位置找出函数的开头,
然后根据这个函数的位置,全文搜索相关的call或者jmp……别以为没有这样的工具,即便写一个也不过是1天时间……
然后根据这些call和jmp的位置,搜索条件跳转的汇编……顺藤摸瓜……别以为工作量很大,没有多少的……甚至可以全自动……
因为大部分人不会对函数指针进行加碱计算,因此所有的call或者xcall或者rjmp语句都是常量的……
写一个简单的小模拟器,全文检索跳转关系,最后从elpm和lpm位置,反看,看看哪些“路径”最终落入elpm和lpm,然后……
把这些路径掐断……nop掉……就OK了……
所以,对于校验如果用函数你就天真了……别人直接......
-----------------------------------------------------------------------

其实我是建议少用IF语句的,switch(case:)会更有利于增加跟踪难度,虽然不符合正常人的使用习惯,----想得到疯子的效果,就得有点疯子的举动。
至于靠spm或者elpm顺藤摸瓜,那要看你全文其它地方用没用这些指令了,如果正常功能大用了大量的spm或者elpm,还怎么摸呢?恐怕还没摸到就扎到手了咯...
我一般用查表方式算CRC(要用到FLASH数据),而且校验用CRC,程序中通信及存EEP中的所有记录数据都要有CRC校验,当然用到FLASH的地方远不止这些,还有产品序列号,标识号等等至少30多处TAB表,这些地方都是碰不得了,改后正常功能就会受损,而且这些表数据要算校验码,在程序中又要取出来自己用,我不觉得有任何高手能轻松跟踪到它并能区分你是这次取表是校验的还是要程序中用的...
再则,我也不觉得用了NOP填充后就能把每处CRC正好凑得和填充前的完全一至,如果这样想,估计CRC的设计者的头脑是简单了些...
如果想靠修改某个函数而绕开校验,这个可能性不大,我的最基本理论就是防止做改动或转开不执行某函数,要想绕开,除非你先搞定这海量的数据与FLASH根本无法区分开的代码,
至于提出的用函数校验很天真,这一点我还算认同,因为这样大家好理解些,我的用法有点疯,但不一定让大家都跟着疯...如果掌握这种方法,即便是用函数校验,你的产品加密程序也会成数量级的增加,如果你是高手,我相信你会认同搞定这些海量数据的难度比自己开发一套功能相同的设备要大得多...

出0入0汤圆

发表于 2010-3-24 11:12:50 | 显示全部楼层
也来听听楼主的高招

出0入296汤圆

发表于 2010-3-24 11:35:29 | 显示全部楼层
to 【158楼】 flywater 落叶
    无论你用if还是switch case,汇编指令里面只有那么几个跳转,抓的是那几个
汇编指令,而不是C语言的代码。正常功能中大量使用elpm和lpm的情况确实稍微棘手
一点,但是相比不能破解,分析这几个elpm和lpm的功能所需要的实践还是比较简单的。
我说得elpm和lpm处理主要是防止系统自毁。首先无条件替换了再说。至于你说得校验
手段,我觉得还是用处不大,因为最终还是要落到那几个跳转指令上……
    千万不要小看破解者的耐心。也许我说“破解简单”有点夸张了,但是可以在接受
的时间范围内破解还是不难得。

    比较实在的方法,我觉得是,让产品成本尽可能的低……当然,这个就跑题了。

出675入8汤圆

发表于 2010-3-24 11:45:23 | 显示全部楼层
mark 晚上好好看看

出0入296汤圆

发表于 2010-3-24 11:56:29 | 显示全部楼层
如果你真的想把自己的代码写得爹妈都不认识,推荐一个自创方法:

1、将所有功能都用状态机来写,一个状态就是一个函数。函数原型如下:
   typedef void TASK_FUNCTION(void *pArg);

2、状态迁移不能用调用别的“状态函数”来实现,而是把要调用的目标
   函数的地址与自己函数的地址相减,存到一个结构体变量里面:
   typedef struct
   {
       int Delta;
       unsigned int Original;
       void *pArg;
   }SAFE_TASK;

   其中,Original保存当前的函数地址,Delta保存要调用的函数地址
   然后将这个结构体变量丢进一个系统任务队列
3、在主程序里面,写一个小函数,从系统任务队列里面取一个元素,
   使用Original+Delta获得目标函数地址,然后调用;如果队列为空
   则调用系统空闲任务——比如休眠,直到被唤醒
   伪代码如下:
   ...
   while(1)             //!传说中的系统超级循环
   {
       SAFE_TASK *pTask;
       if (!Get_System_Task_Queue(pTask))
       {
           sleep(SLEEP_MODE_POWER_DOWN);    //休眠
       }
       else
       {
           unsigned int dwTaskAddress = pTask->Original + pTask->Delta;
           if (0 != dwTaskAddress)  //! 鸵鸟式的指针检测
           {
               //! 调用函数
               ((TASK_FUNCTION *)dwTaskAddress)(pTask->pArg);
           }
       }
   }

4、使用此法,配合楼主的BT方法……嗯,开发人员自己估计都……嗯
   所以,状态图就成了最珍贵的文档,因为,我觉得,即便有源代码
   看起来都头疼……

5、解释一下这种方法的本质:
   每一个状态函数实际上都可以看作是一个 虚拟机的“指令”
   使用队列来处理实际上是实现了“多线程”+ “宏观乱序执行”
   使用函数Delta……实际上是状态机隐藏
   
   简单说来,就是我们做了一个多任务虚拟机,然后实际上把C源代码
   变成了 虚拟机的“汇编源代码”…… 而编译出来的HEX看起来
   就是一个 处理器“微指令”写得程序……如果你不知道我所说的意思
   请参考“计算机组成原理”注意,不是“微机原理”。

6、说下缺点:需要大量使用全局变量,状态之间无法共享局部变量,只能
   通过“堆分配变量”用pArg传递的方法来实现状态机的内部资源共享。
   还有,光有C代码很难看懂——特别是规模很大的时候。唯一的救星就是
   状态图……

7、说下优点:
   a、多任务
   b、全体 unblock 代码,系统实时性容易得到保证
   c、适合团队分模块开发
   d、适合模块化管理
   e、不易破解
   f、代码不是文档
   g、会被骂……

出0入0汤圆

发表于 2010-3-24 12:00:33 | 显示全部楼层
终于见到傻孩子出招了,看来ATMEL并不是希望大家的程序被破解,至少从傻孩子的回复中就可以看出

出0入296汤圆

发表于 2010-3-24 12:04:09 | 显示全部楼层
to 【164楼】 kevintang
   以上观点,是我自己的主意,别活生生的剥夺我的东西给ATMEL。
这是 傻孩子编码规范3.x 的核心思想

出0入0汤圆

 楼主| 发表于 2010-3-24 12:15:49 | 显示全部楼层
回复【163楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------

哈哈,高手终于出来说话了.....
if和SWITCH解释成汇编本质上是跳转,但一个是查表方法,从难度上去都能跟踪到它们,还是有差异的,多做几个反向工程你会知道这一点。
用任务高度其实只是实现了跟踪上的难度,但对现行的AVR的OSCCAL或STC这种解密方法无一点用处,无法阻止你改OSCCAL的值,对破解产品无任何改观,只是增加了修改功能的难度....

出0入0汤圆

 楼主| 发表于 2010-3-24 12:17:46 | 显示全部楼层
爹妈是不认识程序了,但能认出OSCCAL在哪....
UCOS或多任务,可能并不是每个用户或每个处理器都用....毕竟,它喝的是代码....

出0入296汤圆

发表于 2010-3-24 12:20:01 | 显示全部楼层
所以要配合你说得BT方法……增加追踪难度会比较有用

单纯的状态机系统只能在一定范围内增加别人“破解算法”的难度,比如肉眼解码
破解Touch算法。

个人认为OSCCAL方法实在是掩耳盗铃……
我曾经用过一个超级简单的算法,感觉稍微有用一点……

1、初始化的时候,拉高某几个引脚
2、硬件上,这几个引脚接地、悬浮
3、如果任意接地的引脚电平为高,直接擦除芯片
   如果悬浮的引脚为异常,也这么做
这种方法的好处是,简单,破解仍然算掩耳盗铃——不过还是有点作用。
4、适合小flash芯片……

出0入0汤圆

 楼主| 发表于 2010-3-24 12:22:47 | 显示全部楼层
嗯,这对多任务系统来说,无疑是更完善的方案,谢谢....

出0入0汤圆

 楼主| 发表于 2010-3-24 12:31:30 | 显示全部楼层
回复【168楼】Gorgon Meducer 傻孩子
所以要配合你说得BT方法……增加追踪难度会比较有用
单纯的状态机系统只能在一定范围内增加别人“破解算法”的难度,比如肉眼解码
破解Touch算法。
个人认为OSCCAL方法实在是掩耳盗铃……
我曾经用过一个超级简单的算法,感觉稍微有用一点……
1、初始化的时候,拉高某几个引脚
2、硬件上,这几个引脚接地、悬浮
3、如果任意接地的引脚电平为高,直接擦除芯片
   如果悬浮的引脚为异常,也这么做
这种方法的好处是,简单,破解仍然算掩耳盗铃——不过还是有点作用。
4、适合小flash芯片……
-----------------------------------------------------------------------

别人抄的是你电路的原版,你的电路接地了,他抄出来也是接地呀。
同样都是接地的引脚,怎么区分是你接的地,还是盗版都接的地呢?
关键是现在AVR解密不用把片子焊下来.....

出0入0汤圆

发表于 2010-3-24 12:33:21 | 显示全部楼层
做到 使 破解者分析汇编难度高 是很容易的
其实破解唯一序列号加密是容易的

比如使用18B20作为唯一序列号
不管你程序是怎么乱 只要购买一个正版成品,然后把程序和EEPROM的数据全部拷贝出来,照原样烧写进去,使用一很小MCU模拟买来的的那个18B20的序列号,就搞定了,
不过预先需要知道是通过18B20加密的 这个分析比完全分析汇编代码轻松多了

如果使用MCU内部自带的唯一序列号,只要找到代码中有关读取此序列号的程序 使其读取的值都和买来正品的值一样就可以了
其他的都不用管的

出0入0汤圆

发表于 2010-3-24 12:35:41 | 显示全部楼层
回复【171楼】flywater 落叶
-----------------------------------------------------------------------

要迫使解密者将芯片从板上取下来

出0入0汤圆

发表于 2010-3-24 12:40:27 | 显示全部楼层
破解难度会增加,但是“绝对安全”自信了点。


另,开发者的思想和老板的思想不一样,老板宁愿花多于开发的时间去破解一成熟的产品。因为这种产品好卖。

自己开发的别人不一定会买。

出0入0汤圆

 楼主| 发表于 2010-3-24 12:50:35 | 显示全部楼层
回复【172楼】knight_avr
-----------------------------------------------------------------------
呵呵,你没看贴子内容,至少是没全看....

出0入296汤圆

发表于 2010-3-24 12:59:38 | 显示全部楼层
to 【171楼】 flywater 落叶
    所以说也不是太管用,属于“鸵鸟”加密

出0入0汤圆

发表于 2010-3-24 12:59:58 | 显示全部楼层
仰望中。。。

出0入296汤圆

发表于 2010-3-24 13:01:44 | 显示全部楼层
to 【178楼】 McDeggy 再见,列宁
    小心高空坠落物……看见没有,看见没有,有一个东西似乎越来越大……看见没有?

to 围观群众
    听见没有,听见没有? 那个响声……

出0入0汤圆

发表于 2010-3-24 13:20:03 | 显示全部楼层
mark,学习学习

出0入0汤圆

发表于 2010-3-24 13:33:27 | 显示全部楼层
说下我的经验:

1、首先,只用到一片 8bitAVR 的情况下,我没那闲工夫搞加密,本来就没什么技术含量的东西,劳心劳神折腾加密消耗的时间,够我再做俩仨项目了,何苦来着?

2、用到两片或更多 8bitAVR 的情况下,有那么一次使用的是将重要功能函数分散到双 MCU 中分别处理,然后函数算法中混杂离散量每片单独烧写(配合特制的烧写程序)的办法,反正没听说被破解过,不过自己折腾着都辛苦,后来也就懒得了……

3、用到 ARM7/CM3 的情况下,就很简单了,几个关键算法函数和关键配置数据用个外部的 SECEEPROM 存,加密密码通过采集板上离散量生成,需要用时临时加载入 RAM 来用,并且不同时刻使用的函数规划到同一片 RAM 区,随时冲抵……这里还有个小技巧,就是生成离散量的电路上,电容、晶体管之类尽量用一些允许焊接温度比较低的器件,这样,走趟回流炉基本上就都坏了,但又没全坏,这样就更难被抓出特性……

4、其实最好的办法,还是去做那种垄断性比较强的项目,这样,就算你一点加密都没有,别人一样戗不了你的……

出0入296汤圆

发表于 2010-3-24 13:35:43 | 显示全部楼层
to 【181楼】 watercat4  
    严重同意楼上意见

出0入0汤圆

发表于 2010-3-24 14:00:12 | 显示全部楼层
回复【181楼】watercat4
说下我的经验:
其实最好的办法,还是去做那种垄断性比较强的项目,这样,就算你一点加密都没有,别人一样戗不了你的…… -----------------------------------------------------------------------

这个严重同意~

出0入0汤圆

发表于 2010-3-24 14:01:14 | 显示全部楼层
单片机解密:我不了解.我只知道,人家如果有hex文件,还要去看里面的干什么?吃S啊.又不是电脑软件.人家所有的器件都抄你的,内外EEPROM也抄,我想不出来那个 crc...等等有什么用.唯一一个有点靠谱的就是上回那个谁说的,把EEPROM的一个址址的数据写上几+W次,一个方案,但这个方案不方便生产和保证质量.再说人家真想抄,这个EEPROM,他也会去读写校验一下,就出来了,实际意义也不大.想要人家不破解唯一的方案只能是上人家得不到 hex 而这个和普通的程序员一点关系都没有.
我不知大家盖楼盖的这么高有什么意义.

出0入0汤圆

 楼主| 发表于 2010-3-24 14:03:03 | 显示全部楼层
呵呵,同意181楼.....
所以我前面所埋的另一个重磅炸_弹也无须再公布了....
如果只是防一般的盗版者,这些足够了,而且绰绰有余....
其实最近工程赶得很紧,抽空将以前的一些老经验,在此晒一下,希望在为大家提供方便的同时,其实也有一点自私的想法--想增强一下自己在此方面的经验,不过依目前情况看来两个目的均无法实现.....

出0入0汤圆

 楼主| 发表于 2010-3-24 14:03:47 | 显示全部楼层
回复【184楼】z4057
-----------------------------------------------------------------------

哈哈,想法太幼稚!

出0入296汤圆

发表于 2010-3-24 14:04:02 | 显示全部楼层
to 【184楼】 z4057
    意义在于,不讨论不明 + 灌水

出0入0汤圆

发表于 2010-3-24 14:08:01 | 显示全部楼层
其实个人觉得,楼主对 MCU 加密有点走火入魔了

你加密是为了不让别人解密解得太便宜,但如果你加密这事儿本身已经让你额外付出了比编写代码还多的时间代价、付出了比直接买个 SECEEPROM 更贵的器件成本(往已经接近饱和工作状态的 MCU 增加任何加密手段,都必然要以提升 MCU 的多方面性能为代价),那你做这种“绝对安全的”加密的意义又在哪里?

出0入0汤圆

 楼主| 发表于 2010-3-24 14:18:26 | 显示全部楼层
谢谢大家这几天来对本贴的支持,也是因为大家的支持,让我第一次...穿上裤子....
其实无所谓什么是入魔,如果爱迪生不对发明创造入魔,我想咱们还处于黑暗时代.....
大家都在入魔不同的事情而已,只是我们不能只入魔一件事情,但想能做成者,只能是入魔者。
希望这篇贴子没太浪费大家时间.....
如果真的浪费了你的时间,我在此表示歉意,当然,没看本贴第一句就回贴的“朋友”,不在此歉意之列......

出0入0汤圆

发表于 2010-3-24 15:04:53 | 显示全部楼层
占个楼

出0入0汤圆

发表于 2010-3-24 16:33:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-24 17:28:31 | 显示全部楼层
下了慢慢研究

出0入0汤圆

发表于 2010-3-24 18:07:46 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2010-3-24 18:22:08 | 显示全部楼层
【184楼】 z4057

像AVR单片机上有个OSCCAL,大约几十片才能找到两个一样的OSCCAL值,也就是说你什么都做一样了,并拿到了HEX,拿到EEPROM

如果不解密的话,你把这个HEX烧进去,几十片里面可能只有一两片是能用的。

出0入0汤圆

发表于 2010-3-24 18:23:56 | 显示全部楼层
如果片内有唯一ID的话,你不去解HEX,你永远也别想抄到。

出50入0汤圆

发表于 2010-3-24 18:32:14 | 显示全部楼层
补充一点 软件加密方法要硬件唯一序列号配合的 如果没有这个条件 单独在程序中加密没有任何意义

出0入0汤圆

发表于 2010-3-24 19:55:45 | 显示全部楼层
Mark!

出0入0汤圆

发表于 2010-3-24 20:17:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-24 23:09:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-24 23:17:30 | 显示全部楼层
晕倒!

出0入0汤圆

发表于 2010-3-24 23:25:42 | 显示全部楼层
回复【181楼】watercat4  
说下我的经验:

1、首先,只用到一片&#160;8bitAVR&#160;的情况下,我没那闲工夫搞加密,本来就没什么技术含量的东西,劳心劳神折腾加密消耗的时间,够我再做俩仨项目了,何苦来着?
-----------------------------------------------------------------------


做产品和做项目不同,一个小小的AVR在一个成熟的产品上,可以让你赚上百万也不一定,呵呵

出0入0汤圆

发表于 2010-3-24 23:27:24 | 显示全部楼层
最好的加密方法,快点做快点卖,推陈出新,盗版的就慢慢抄吧

出0入0汤圆

发表于 2010-3-24 23:35:31 | 显示全部楼层
天下武功,唯快不破。
同意ls!

出0入0汤圆

发表于 2010-3-24 23:38:09 | 显示全部楼层
只对楼主说一句,在你罢工的地方改成“复工”,一切都会太平的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 08:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表