amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
楼主: flywater

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

  [复制链接]
发表于 2011-1-3 16:37:53 | 显示全部楼层
回复【29楼】flywater 落叶
-----------------------------------------------------------------------

。。。。叹服!

呵呵,你的方法,用用。有机会请你吃饭。
发表于 2011-1-3 18:29:26 | 显示全部楼层
太强了,下回有需要找你!
 楼主| 发表于 2011-1-4 14:18:40 | 显示全部楼层
回复【400楼】fickle
回复【29楼】flywater 落叶
-----------------------------------------------------------------------
。。。。叹服!
呵呵,你的方法,用用。有机会请你吃饭。
-----------------------------------------------------------------------

  谢谢你的回复!虽然不一定能吃上你请的饭,但听到这句话,心里就挺舒服...
  不可否认,此方法已很多人在用了,前几天一个QQ网友还发来一个BIN,是解密某XX知名品牌的产品(后来得知的,恕不告知大家XX为何物...),实在搞不定,让帮忙处理。反编后一眼看上去就是用了这种加密方法,不过还很原始,基本是照我本贴的例程抄了一遍,当然,结果就很显然了...
  通过各种渠道转到我手下的BIN(在此声名,我只是稍擅长加密,再有解密的事请不要找我...)已有4个产品是使用了这种加密方法了。世面上肯定还有更多,
  此种加密方法的绝妙之处是在于:给出HEX,并告知解密者我是怎样加密等前提下,也是极难成功盗版你的产品。你的程序对所有人都要达到这种效果,对此贴的作者来说也应该是。
  请仔细看完本贴,并仔细研究一下贴中的一些建议,将加密方法修改出自己的性格来,
  如果使用此方法前你曾经历过产品屡次被盗的恶梦,那么也请你关照一下现在仍处在恶梦中的同僚们,到此分享一下你的经验...
发表于 2011-1-4 15:11:56 | 显示全部楼层
好长 好累  标记一下
发表于 2011-1-4 17:24:43 | 显示全部楼层
mark
发表于 2011-1-4 18:01:27 | 显示全部楼层
MARK
发表于 2011-1-4 18:34:54 | 显示全部楼层
后排马克
发表于 2011-1-4 19:31:57 | 显示全部楼层
mark
发表于 2011-1-10 13:53:42 | 显示全部楼层
mark.......
发表于 2011-1-10 14:42:57 | 显示全部楼层
好文~~~~
发表于 2011-1-10 21:41:17 | 显示全部楼层
mark
发表于 2011-1-22 19:12:48 | 显示全部楼层
补充一点,不用直接把序列号与保存到内部存储体内容进行比较,这样很容易被人找到。

应该对保存到内部存储体的内容加密,通过解密程序恢复成序列号。

总结一下:就是2步
1.对序列号通过加密算法,得到加密后的序列SS,将SS写入单片机,一般写到EEPROM。
2.对整个程序空间做校验,将检验值保存到程序存储器或者EEPROM。

单片机工作时:
1.先判断整个程序空间的校验值是否正确,以防止程序被修改。
2.然后再对SS解密,解密后与内部序列号对比。
以上两步判断,都不要立即罢工,这样太明显了。最好是置一个全局变量的标记。在关键的时候再发作,发作方式多样:
1.判断这个标记,然后发作。
2.直接把这个标记用到你的软件中,比如,正常情况下,这个标记是0,在某函数调用时,你都把调用地址加上这个0。
这样,一旦标记非0,就会出现乱调用。
发表于 2011-1-22 21:09:19 | 显示全部楼层
上楼的好像不适合量产
 楼主| 发表于 2011-1-23 18:36:22 | 显示全部楼层
回复【411楼】zhonghua_li 蓝色天空
-----------------------------------------------------------------------
原理是一样的,其实经过加密存在EEP中和存在FLASH中没什么区别,特别是能IAP的单片机,

回复【412楼】qd118118
上楼的好像不适合量产
-----------------------------------------------------------------------

  其实无论是哪种加密方式,都会给量产带来一定的不便因素,即使是只做序列号比对,也是每个产品内FLASH相互不通用或要二次重写EEP,所以每种加密方式都不利于量产--包括烧断引脚的方式。
  但好在我们这种加密方式可以通过电脑程序对FLASH或EEP的BIN文件做批量修改,使其在写入MCU前生成与此MCU的序列号相匹配BIN文件,只是在量产时你需要多点一个按键即可解决的问题。
  也即是说解决量产问题很简单,只需读取BIN文件,并按你程序中设定的加密方式修改之后写入MCU即可--在程序空白区写入随机代码也不过分,无论用WIN程序或用单片机都能轻松实现,
发表于 2011-1-23 22:29:56 | 显示全部楼层
如果HEX不能被反汇编的话就好了, 好比cpld的jed文件, 不知道能否通过jed恢复设计者的逻辑 ?
如果cpld内置序列号之类, 同时设计逻辑和序列号有关, 但是又不能通过修改jed修改,
那么使用不同序列号的cpld使用相同的jed, 逻辑将不能正常工作.

有这样的cpld吗 ?
发表于 2011-1-24 22:29:17 | 显示全部楼层
mark
发表于 2011-2-6 22:15:59 | 显示全部楼层
cool,mark,
发表于 2011-2-6 22:31:00 | 显示全部楼层
MARK
发表于 2011-2-7 07:32:35 | 显示全部楼层
关注一下
发表于 2011-2-7 09:16:55 | 显示全部楼层
加密思路 标记
发表于 2011-2-7 20:44:44 | 显示全部楼层
有外加智能卡芯片的方法,智能芯片中放置关键算法,MCU调用智能芯片得到结果
智能卡芯片的加密级别跟MCU不是一个档次的
发表于 2011-2-11 14:37:16 | 显示全部楼层
请楼主重点介绍一下“从头至尾重要函数均不可改,1B都不行,而且各入口地址亦不能改。 ”具体怎么实现?谢谢!~
发表于 2011-2-23 13:27:23 | 显示全部楼层
记号
发表于 2011-3-13 22:53:38 | 显示全部楼层
几号、、、、、、、
发表于 2011-3-13 23:29:02 | 显示全部楼层
楼主辛苦了,标记一下
发表于 2011-3-14 00:15:18 | 显示全部楼层
我原来做的防盗程序就是可以设定时间发作的
比如过一个月才发作,你盗版者不会做一个月的测试吧?
到时候出问题,什么都砸了。
发表于 2011-3-14 12:35:51 | 显示全部楼层
mark
发表于 2011-3-14 14:36:56 | 显示全部楼层
楼主精神可嘉呀,必须顶,好好学习一番!感谢!!
发表于 2011-3-15 15:50:58 | 显示全部楼层
mark!!!
发表于 2011-3-15 18:35:19 | 显示全部楼层
mark
发表于 2011-3-15 21:56:46 | 显示全部楼层
MARK
发表于 2011-3-16 15:24:52 | 显示全部楼层
茅和盾发来贺电
发表于 2011-3-16 16:22:00 | 显示全部楼层
mark
发表于 2011-3-16 16:32:54 | 显示全部楼层
增加一片HCS301
发表于 2011-3-16 16:57:40 | 显示全部楼层
顶了!
发表于 2011-3-16 17:16:25 | 显示全部楼层
mark
发表于 2011-3-16 19:56:25 | 显示全部楼层
MARK,好东西,学习下
发表于 2011-3-17 10:22:39 | 显示全部楼层
回复【411楼】zhonghua_li  蓝色天空
-----------------------------------------------------------------------

你牛,不马上发作这点够狠,最好是写一些莫名其妙的代码,让它默默,莫名其妙的工作
发表于 2011-3-17 10:24:57 | 显示全部楼层
回复【414楼】shangdawei  
-----------------------------------------------------------------------

有,actel的就是,开发者可以把jed交给你,但是你却不能拿他来量产,只能用来升级你在他那里买的产品
发表于 2011-3-29 11:38:34 | 显示全部楼层
mark
发表于 2011-3-29 14:54:50 | 显示全部楼层
NB
学习下
以后用得着
发表于 2011-3-29 16:49:20 | 显示全部楼层
很好,很强大
发表于 2011-3-29 21:31:57 | 显示全部楼层
mark
发表于 2011-3-29 21:45:31 | 显示全部楼层
mark
发表于 2011-4-17 12:15:57 | 显示全部楼层
回复【28楼】flywater 落叶
-----------------------------------------------------------------------

lz,我看了许久,还是不懂。这个加密过程究竟是怎么实现的啊!从你的仿真电路中又如何看到你加密的思想,电路中的那些LED,LCD又是用来干嘛的?我是刚开始学习电子的,对你的这个课题很感兴趣,但不知道如何下手,如果我想要实现你的这个课题,该具备哪些方面的基础知识呢?希望你能指教指教,谢谢!!!
发表于 2011-4-18 11:17:06 | 显示全部楼层
顶,量产?
发表于 2011-4-18 11:27:29 | 显示全部楼层
此帖得慢慢看。搬个板凳先。
 楼主| 发表于 2011-4-19 22:56:07 | 显示全部楼层
回复【446楼】10041719
回复【28楼】flywater 落叶
-----------------------------------------------------------------------
lz,我看了许久,还是不懂。这个加密过程究竟是怎么实现的啊!从你的仿真电路中又如何看到你加密的思想,电路中的那些led,lcd又是用来干嘛的?我是刚开始学习电子的,对你的这个课题很感兴趣,但不知道如何下手,如果我想要实现你的这个课题,该具备哪些方面的基础知识呢?希望你能指教指教,谢谢!!!
-----------------------------------------------------------------------

报歉,我也不知道从何说起,因为好象是楼顶开始解释,直到几百楼仍有好多人不太明白,也有人不太认同,如果再从头解释一遍,只会再浪费一次大家的宝贵时间,所以建议还是再从头看一遍吧...

图中LED只是用来演示,代表你的工程中的一个功能(如烤箱加热使能),另一个LED代表另一项功能(如温度到设定后停止加热)....
LED?  我没看到呀,那个串口虚拟设备吧,调试用的....如查看序列号、返回程序被人强制修改程度 之类的...
发表于 2011-4-20 00:25:15 | 显示全部楼层
回复【425楼】play_boy
我原来做的防盗程序就是可以设定时间发作的
比如过一个月才发作,你盗版者不会做一个月的测试吧?
到时候出问题,什么都砸了。
-----------------------------------------------------------------------

425楼可否把你的方法传授一下啊,小弟学习一下
呵呵
发表于 2011-4-20 00:37:10 | 显示全部楼层
学习
发表于 2011-7-14 23:24:55 | 显示全部楼层
这思路能增加不少破_解难度
发表于 2011-7-30 23:06:25 | 显示全部楼层
mark
发表于 2011-7-31 00:08:17 | 显示全部楼层
单片机加密 MARK!
发表于 2011-7-31 14:16:13 | 显示全部楼层
记录下
发表于 2011-7-31 17:04:51 | 显示全部楼层
mark
发表于 2011-7-31 17:12:55 | 显示全部楼层
我们的产品,即使给盗版商成套的烧录文件、PCB、料单也没用。

每个传感器、每个运放、每个电阻都有离散型。这些偏差累积在一起……呵呵……没有修正的仪表,能卖的出去?

防破_解,其实最关键的是产品生产工艺以及配套的测试设备与测试软件。仅仅凭HEX中的代码,神仙也猜不出你的生产测试工艺,修正算法。

如果生产测试不仅仅是一步,各步骤数据之间有相互联系……呵呵……

上述方法一直在用,很有效……

不过也有局限性,产品中必须有比较复杂的模拟电路。
发表于 2011-7-31 17:40:10 | 显示全部楼层
仔细读读
发表于 2011-7-31 18:24:05 | 显示全部楼层
mark, 加密
发表于 2011-7-31 18:30:51 | 显示全部楼层
这么牛!
发表于 2011-7-31 19:02:12 | 显示全部楼层
马克
发表于 2011-8-1 10:13:13 | 显示全部楼层
首先声明我只是个菜鸟,发发我的愚见,拍砖的时候请轻一点 ,别一砖头把我拍死。

很多楼的兄弟没有了解lz的良苦用心,总是从别的角度考虑。
lz的意思是,如果有人拿到了我的hex,我怎么放破_解。神马下架自宫,一个月以后瞎跑这都是,人家解了你hex以后的事情,与本主题无关

如果我没猜错,lz用的是“二次加密”将单片机里的代码拆成几份,用箱子锁住。
PS:stc的id估计很容易破掉,我进入程序先跳到远远地地方把id改成你母片的id。。。。

1:将代码用箱子锁住,由于代码使连续的,也就意味着箱子是透明的,你根本不知到箱子在哪,有几个。当然,钥匙你也不知道在哪
2:lz将代码拆开后用几个透明的箱子锁住,然后将钥匙随便(貌似)一放,你就找吧,累死你不偿命。lz心潮来血,再将钥匙加加密,你就更无奈了。
3:估计lz有一个专门的上位机软件,能直接修改bin,自动批量计算修改校验和,比那个直接贴个链接的小伙厉害多了。lz试着共享一下您的软件(应该是我的奢望)

如果lz能看到我的回复,以下是与您和明白的网友讨论的内容

一 基于加密方式解密的讨论

既然,知道了你的加密方法,破_解起来就是反向你的加密就行了,找到每个钥匙,打开每个锁。(其中工作量不考虑)如果我能拿到很多母片,能取出很多hex的话(我不知道取出一个hex需要多少钱),这也好找了,互相对比就行了。

如果让我做产品,我会视母片的价格来定义加密方式,如果产品很便宜,我就弄很多的锁很多的钥匙,并且,使钥匙重复率极高,达到50%你拿到我的两个片子,发现其中有10个字节不同,你拿到我5个片子,发现其中有50个字节不同,我让你郁闷去。如果产品很贵,我就尽量减少钥匙数量,但我会把它做的很大,很乱,就是这20个B不一样,你就不知道他怎么改。

二 基于加密方式加密的讨论

我想对你的加密方式进行修改
1:既然有了箱子与钥匙的概念,也就知道,箱子与钥匙是分不开的,但箱子里很乱,有数据有程序,箱子外也很乱。所以,我认为,你既然用箱子了,那你咋不把第一个箱子的钥匙锁在第二个箱子里呢?然后第二个锁在第三个箱子里,然后依次类推........会挨骂的想法。

2.很自然地,我为什么不把最后一个箱子的钥匙放在第一个箱子里呢?原因很简单,很复杂。我编不出这样的上位机软件来....

3.箱子是透明的,箱子之间没有界限,我完全可以把第一个箱子放在第二个箱子内,然后依照1依次类推,这样,实现起来就相对简单了。

4.当年高斯(好像是他吧),一下子算出来从1加到100,我们完全可以盗用他的想法,将第一个箱子的钥匙放在最后一个箱子里,最后一个放在第一个中...(只是个想法,与加密等级无关)


下面讨论加密等级问题,cpu占用率明显升高

  依照3的想法,如果你能做出循环加密(将crc的值循环校验,有点乱,本来crc就是循环校验,你还循环)宏观来讲就是将上次的crc带到下次,然后最后一次的校验值在第一次中有用到。也就是。你改一个bit,我整个系统崩溃。但这是个大工夫,我需要加几个(有可能很多)值作为调整,使其能达到一个环形校验,这得要求你比crc他妈还认识他,上位机还“刚刚的”

  如果上面的问题的到了解决,我就放开手脚,大干一场
  我每个箱子上两把锁,我把钥匙与箱子以星型拓扑结构来放置,甚至我可以做到三维,我把每个箱子作为一个正方体的顶点,钥匙分别放置,惹毛了我,我给他弄个哥德堡七桥。你愿意弄成金刚石的结构没人管你  

  每一次校验意味着资源的消耗,拓扑结构的升级意味着资源消耗的指数增长,加密等级与你的代码价值,与蛋疼程度,和cpu牛B程度有关,不行就再看一遍“一 基于加密方式解密的讨论”

  洋洋洒洒写了一堆,很多人不一定能看懂,我的表达能力也是实在有限,人们都说我表达能力不好,见谅吧。

不写了,再写就会遭雷劈了
发表于 2011-8-1 17:42:58 | 显示全部楼层
马克学习
发表于 2011-8-1 17:46:35 | 显示全部楼层
这个必须学习,感谢。
发表于 2011-8-1 17:50:59 | 显示全部楼层
马克备用。
 楼主| 发表于 2011-8-1 18:22:41 | 显示全部楼层
回复【462楼】electron_love
-----------------------------------------------------------------------

  这么久了还被挖出来,看来很多人还的确是为产品加密犯愁过....
  首先感谢462楼激_情洋溢的长篇回复。
  其实你提的箱子和钥匙理论,基本上可以这样去理解。至于钥匙放到另一个箱子内,文中确实也提到过,有一个全局校验码检测,如果加密的地方被人改动过或未进入某段代码而修改了变量想瞒天过海,也是要触发机关的,这也是对钥匙的一种监督。
  其实这种方法后期改动BIN很麻烦,因为要量产,所以不得不借助上位机辅助改动程序BIN,至于改动方法就五花八门了,但要与你单片机编译及变量定义位置紧密结合。
  以下代码为早期一个4K代码量的小产品对BIN进行加密的一段上位机代码,程序先将HEX转换成BIN文件,再用指定方式对BIN文件进行修改,由于此单片机代码量较小,思路比较简单。从简单程序开始更容易理解些....
  上位机软件为BCB,你也可以稍加修改使用VC或VB编程。你再和下载软件关联起来,整个过程就只需你点一个键而已。

HEX转为BIN文件函数内容;注:未处理校验码
---------flywater
void HexToBin()
{
    String sDataStr,sTemp;
    int nMemLines=0;    //HEX文件总段数;
    int nByteLen=0;     //有效数据字节数;
    int nDataAddr=0;    //偏移地址;
    int nDataType=0;    //类型:00 -数据记录,01-文件结束记录,02-扩展段地址记录,04-扩展线性地址记录
    unsigned char sBuffer[100];
    int iFileHandle;
    Memo4->Lines->Clear();
    Memo4->Lines->LoadFromFile(current_dir+"\\Hub.hex");
    //读入后转换成BIN格式;
    nMemLines=Memo4->Lines->Count;
    //创建BIN文件(flash)
    if(FileExists(current_dir+"\\FlashOk.bin"))
    {
        try
        {
            DeleteFile(current_dir+"\\FlashOk.bin");
        }
        catch(...)
        {

        }
        iFileHandle = FileCreate(current_dir+"\\FlashOk.bin");
    }
    else
    {
        iFileHandle = FileCreate(current_dir+"\\FlashOk.bin");
    }
    for (int i=0;i<nMemLines;i++)   //逐行处理;
    {
        sDataStr=Memo4->Lines->Strings;
        sTemp=sDataStr.SubString(1,1);
        if(sTemp!=":")    //此行的开始;
        {
            FileClose(iFileHandle);
            Application->MessageBoxA("HEX文件格式有误,请检查!","提示",64);
            return;
        }
        sDataStr=sDataStr.Delete(1,1);
        sTemp=sDataStr.SubString(1,2);
        sTemp="0x"+sTemp.Trim();   //取出有效字节个数;
        try
        {
            nByteLen=StrToInt(sTemp);
        }
        catch(...)
        {
            //数据错误,
            FileClose(iFileHandle);
            Application->MessageBoxA("数据错误,请检查!","提示",64);
            return;
        }
        //取出偏移量;
        sDataStr=sDataStr.Delete(1,2);
        sTemp=sDataStr.SubString(1,4);
        sTemp="0x"+sTemp.Trim();
        try
        {
            nDataAddr=StrToInt(sTemp);
        }
        catch(...)
        {
            //数据错误,
            FileClose(iFileHandle);
            Application->MessageBoxA("数据错误,请检查!","提示",64);
            return;
        }
        //取出数据类型;
        sDataStr=sDataStr.Delete(1,4);
        sTemp=sDataStr.SubString(1,2);
        try
        {
            nDataType=sTemp.ToInt();
        }
        catch(...)
        {
            nDataType=0;
        }
        //把数据转换后入到文件缓冲中;
        memset(sBuffer,0,sizeof(sBuffer));
        for(int i=0;i<nByteLen;i++)
        {
            sDataStr=sDataStr.Delete(1,2);
            sTemp=sDataStr.SubString(1,2);
            sTemp="0x"+sTemp.Trim();   //取出有效字节个数;
            try
            {
                sBuffer=(unsigned char)StrToInt(sTemp);
            }
            catch(...)
            {

            }
        }
        //FileSeek(iFileHandle,0,0);
        FileSeek(iFileHandle,nDataAddr,0);
        FileWrite(iFileHandle, sBuffer, nByteLen);

    }
    FileClose(iFileHandle);
}

//BIN修改函数内容;
void CHGBinFile()
{
    int iFileHandle;            //文件句柄
    String sSerialString;
    String sTemp;
    byte sBuffer[0x2000];       //修改BIN暂存区
    byte sRandData[40];         //随机数;
    word nCrc16Temp=0;                //CRC码暂存
    //第一组校验变量;
    int nDataStart1;                //
    int nAddCrc1=0;
    //第二组校验变量;
    int nDataStart2;
    int nAddCrc2=0;             //CRC要存放的地址;
    //第三组校验变量;
    int nDataStart3;
    int nAddCrc3=0;
    //第四组校验变量;
    int nDataStart4;
    int nAddCrc4=0;
    //MCU ID号处理变量;
    int nAddCrc5=0;            //MCU ID号校验码存放位置;
    byte sSerialNo[10];
    byte sOkCrc[20];
    memset(sOkCrc,0,sizeof(sOkCrc));
    memset(sSerialNo,0,sizeof(sSerialNo));
    //产品序列号处理变量;
    int nProductNoAddr;
    int nProductNoCrcAddr;
    byte sProductNo[24];
    char chTemp;
    String sProductNoStr=Edit4->Text.Trim();
    //取出产品序列号;        //产品序列号,非MCU序列号
    memset(sProductNo,0,sizeof(sProductNo));
    for(int i=0;i<20;i++)
    {
        sTemp=sProductNoStr.SubString(1,1);
        memcpy(sProductNo+i,sTemp.c_str(),1) ;
        sProductNoStr=sProductNoStr.Delete(1,1);
    }
    //取出设定值:  把予设的各函数入口地址及校验码存放地址从EDIT中取出
    try
    {
        nDataStart1=Edit7->Text.ToInt();
        nDataStart2=Edit9->Text.ToInt();
        nDataStart3=Edit11->Text.ToInt();
        nDataStart4=Edit13->Text.ToInt();

        nAddCrc1=Edit5->Text.ToInt();
        nAddCrc2=Edit8->Text.ToInt();
        nAddCrc3=Edit10->Text.ToInt();
        nAddCrc4=Edit12->Text.ToInt();
        nAddCrc5=Edit15->Text.ToInt();
        nProductNoAddr=Edit16->Text.ToInt();
        nProductNoCrcAddr=Edit17->Text.ToInt();

    }
    catch(...)
    {

    }
    //取出序列号;此处为MCU的序列号
    sSerialString=Edit14->Text.Trim();
    if(sSerialString.Length()<7)    //序列号有误;
    {
        Application->MessageBoxA("序列号有误,请检查!","提示",64);
        return;
    }
    sTemp=sSerialString.SubString(1,2);
    sTemp="0x"+sTemp;
    sSerialString=sSerialString.Delete(1,2);
    for(int i=0;i<7;i++)
    {
        try
        {
            sSerialNo=(byte)sTemp.ToInt();
        }
        catch(...)
        {
            Application->MessageBoxA("序列号有误,请检查!","提示",64);
            return;
        }
        sTemp=sSerialString.SubString(1,2);
        sTemp="0x"+sTemp;
        sSerialString=sSerialString.Delete(1,2);
    }

    //打开BIN文件(flash)
    if(!FileExists(current_dir+"\\FlashOk.bin"))
    {
        Application->MessageBoxA("Bin文件不存在,无法进行操作!","提示",64);
        return;
    }
    iFileHandle = FileOpen(current_dir+"\\FlashOk.bin",fmOpenReadWrite);
    //处理第二个校验:一般从0开始,中断及主程序入口函数防改
    memset(sBuffer,0,sizeof(sBuffer));
    FileSeek(iFileHandle,nDataStart2,0);
    FileRead(iFileHandle,sBuffer,180);
    nCrc16Temp=CRC16Check(sBuffer,50);
    FileSeek(iFileHandle,nAddCrc2,0);
    memcpy(sBuffer+60,&nCrc16Temp,2);
    sBuffer[62]=sBuffer[61];
    sBuffer[63]=sBuffer[60];
    memcpy(sOkCrc+2,sBuffer+62,2);
    FileWrite(iFileHandle,sBuffer+62,2);
    //处理第三个校验:读取序列号函数防改
    memset(sBuffer,0,sizeof(sBuffer));
    FileSeek(iFileHandle,nDataStart3,0);
    FileRead(iFileHandle,sBuffer,50);
    nCrc16Temp=CRC16Check(sBuffer,50);
    FileSeek(iFileHandle,nAddCrc3,0);
    memcpy(sBuffer+60,&nCrc16Temp,2);
    sBuffer[62]=sBuffer[61];
    sBuffer[63]=sBuffer[60];
    memcpy(sOkCrc+4,sBuffer+62,2);
    FileWrite(iFileHandle,sBuffer+62,2);
    //处理第四个校验:     Mian 主函数防改
    memset(sBuffer,0,sizeof(sBuffer));
    FileSeek(iFileHandle,nDataStart4,0);
    FileRead(iFileHandle,sBuffer,170);
    nCrc16Temp=CRC16Check(sBuffer,170);
    FileSeek(iFileHandle,nAddCrc4,0);
    memcpy(sBuffer+60,&nCrc16Temp,2);
    sBuffer[62]=sBuffer[61];
    sBuffer[63]=sBuffer[60];
    memcpy(sOkCrc+6,sBuffer+62,2);
    FileWrite(iFileHandle,sBuffer+62,2);
    //写入序列号校验码;产品序列号及以上各校验码再校验一次进行存放;
    nCrc16Temp=CRC16Check(sProductNo,20);
    nCrc16Temp=nCrc16Temp+sProductNo[17];
    memcpy(sBuffer+60,&nCrc16Temp,2);
    sBuffer[62]=sBuffer[61];
    sBuffer[63]=sBuffer[60];
    FileSeek(iFileHandle,nProductNoCrcAddr,0);
    FileWrite(iFileHandle,sBuffer+62,2);
    //随机数;将BIN内一些地方写上随机数,要从单片机编译器中将这些地方定义为空,此范例只写了一处,可根据您的情况,搞上10处!如果FLASH空余较多,每处写上几百字节或者从其它程序中搞些代码过来也可---淡定,注意程序稳定性,结束最好加上02 00 00;
    FileSeek(iFileHandle,4080,0);
    randomize();
    for(int i=0; i<500; i++)
    {
        sRandData=rand() % 0xff;
    }
    FileWrite(iFileHandle,sRandData,16);
    //处理序列号:
    FileSeek(iFileHandle,nProductNoAddr,0);
    FileWrite(iFileHandle,sProductNo,20);

    //处理ID号;
    memcpy(sOkCrc+8,sSerialNo,7);
    nCrc16Temp=CRC16Check(sOkCrc,15);
    FileSeek(iFileHandle,nAddCrc5,0);
    memcpy(sBuffer+60,&nCrc16Temp,2);
    sBuffer[62]=sBuffer[61];
    sBuffer[63]=sBuffer[60];
    FileWrite(iFileHandle,sBuffer+62,2);
    //在程序的最后写上02 00 00
    /*
    FileSeek(iFileHandle,4092,0);
    sBuffer[62]=2;
    FileWrite(iFileHandle,sBuffer+62,1);
    */
    //处理全局XOR校验;要入在最后,等全部校验码及所有无效数据全写入后再进行全局校验;
    memset(sBuffer,0,sizeof(sBuffer));
    FileSeek(iFileHandle,0,0);
    FileRead(iFileHandle,sBuffer,4095);
    sBuffer[60]=XorCheckSum(sBuffer,4089);
    FileSeek(iFileHandle,0xffc,0);              //写在4092处
    FileWrite(iFileHandle,sBuffer+60,2);

    FileClose(iFileHandle);
}
 楼主| 发表于 2011-8-1 18:35:32 | 显示全部楼层
上位机写入内容地址是固定的,单片机内处理方法却是可以千变万化的,仅关于上位机写入的随机数,你就可以在单片机内做很多文章,如果对之不理不问,结果也是很不理想的。
  最好用操作系统(超循环除外),使代码与数据更难分离,如果硬件EMC做得好,也可以在随机代码中加入其它单片机的正常程序,以扰乱破_解者跟踪思路。
发表于 2011-8-1 18:52:08 | 显示全部楼层
好深奥啊,感觉,先mark下
 楼主| 发表于 2011-8-1 18:53:11 | 显示全部楼层
回复【462楼】electron_love
-----------------------------------------------------------------------

如果你的单片机资源允许,完全可以一环套一环的拓普下去,当然,一切从简单开始,前文中我只介绍了把前一次的校验数据最后再加强校验一次,就已经被认为是马其诺防线了,其它的也没必要再去摆活了。
思路决定出路,至少为大家提供了另一种思路,是否能各自找到自己的出路,还要看造化了!


改错字,
发表于 2011-8-1 22:30:57 | 显示全部楼层
LZ还是没把关键部分直接放出来,新手太难理解了.
发表于 2011-8-1 23:29:48 | 显示全部楼层
MARK
 楼主| 发表于 2011-8-2 09:23:54 | 显示全部楼层
回复【470楼】summarize
lz还是没把关键部分直接放出来,新手太难理解了.
-----------------------------------------------------------------------

不明白你说的什么是关键部分,单片机的程序和思路在前面,等于是一步步从0说起的,
当然,如果你是单片机新手,加密暂还没必要去深究,
发表于 2011-8-2 09:50:43 | 显示全部楼层
回复【470楼】summarize
lz还是没把关键部分直接放出来,新手太难理解了.
-----------------------------------------------------------------------

你出点钱,楼主直接帮你加密岂不更好!
发表于 2011-8-2 10:44:18 | 显示全部楼层
回复【281楼】operation  
   在你们没有经历过的情况下,不要枉下定论,楼主的意见我相当赞同.目前就遇到一个程序问题和楼主说的情况差不多,那就是反汇编后程序里边一个字节都不能动.改了就会出错.而且该程序是64k的,反汇编后有两万多行.问过n家做单片机解密的,听过的都没几家,更别说遇到过相同问题的了.稍微懂点的行家,听到就害怕了.都说做不了.如果有那位高手愿意挑战的话,可与我联系.qq41831431.(请注明单片机反汇编)
-----------------------------------------------------------------------

先看到这,必须mark了。真的有这种效果,看来楼主的加密方法值得学习了。
发表于 2011-8-2 10:48:59 | 显示全部楼层
回复【283楼】flywater  落叶
回复【281楼】operation
-----------------------------------------------------------------------
希望您不是在破_解我们的产品....
呵呵,我们的一个产品也是64k程序....如果是我们的,就只好建议你放弃了....
我们曾用4k程序的一个产品做过试验,当然,对结论很满意,远远比按照功能写一个的难度大,而且大的这个程度令人难以置信....
-----------------------------------------------------------------------

这是更值得mark的地方。
发表于 2011-8-2 11:03:35 | 显示全部楼层
mark
发表于 2011-8-2 11:21:23 | 显示全部楼层
mark
发表于 2011-8-2 11:23:18 | 显示全部楼层
回复【390楼】flywater  落叶
回复【387楼】zhxzhx 一丁
加密?正常功能都没有空间去写,还有地方去加密?
-----------------------------------------------------------------------
  其实这话我很爱听,因为我也经常用这逻辑,但我越来越不赞成它!----每当老婆嘟囔我要注意身体,要抽时间出去散心,我就这样回答:做工作的时间都不够,哪有时间出去游玩?
  现在渐渐明白:其实钱是永远挣不完的,只要能有自己的阵地,你就有本钱做任何事,当盗版者象癌症一样纠缠你的时候,你会体会到健康才是最重要,你会忏悔最初抽不出空间做加密其实和抽不出时间照顾自己的身体是一样的罪恶....
-----------------------------------------------------------------------

这个还得mark。
发表于 2011-8-2 11:24:44 | 显示全部楼层
mark
发表于 2011-8-2 11:45:16 | 显示全部楼层
曾经为加密头痛了很久,现在基本放弃了,总感觉想太多了。看来我需要吃过苦头才行。
发表于 2011-8-2 12:00:20 | 显示全部楼层
回复【480楼】b260123292 蓝冻
曾经为加密头痛了很久,现在基本放弃了,总感觉想太多了。看来我需要吃过苦头才行。
-----------------------------------------------------------------------

证明你那东西没加密的意义。
头像被屏蔽
发表于 2011-8-2 12:07:42 | 显示全部楼层
mark
发表于 2011-8-2 13:38:24 | 显示全部楼层
很好很强大,标记一下。
发表于 2011-8-2 20:56:50 | 显示全部楼层
哎,知识产权需要法律来保护,这种方式成本最低。
发表于 2011-8-13 10:52:54 | 显示全部楼层
非常好的理論,平宜有效果,和我想的一樣用驗id方法,其實重點只要做到有hex,也不可以直接用,加一個key時,寫一個更容易時,本人覺得己成功了.
发表于 2011-8-18 11:56:58 | 显示全部楼层
回复【29楼】flywater 落叶
-----------------------------------------------------------------------

定上去
发表于 2011-8-18 12:37:25 | 显示全部楼层
顶楼主
发表于 2011-8-18 12:54:24 | 显示全部楼层
发表于 2011-8-31 21:59:12 | 显示全部楼层
发现NI Labview的VI文件就是采用与楼主相同的方法防解密的。

VI文件0x00000090至0x0x0000009F存储的是密码的Hash值(Labview 7.1版本)。
直接修改替换无效
因0x000000A0至0x0x000000AF是文件头(含密文)的Hash值。
如单纯修改密码密文,校验必然失败。提示密码被篡改。
发表于 2011-9-17 18:25:39 | 显示全部楼层
顶楼主
发表于 2011-9-17 21:49:06 | 显示全部楼层
先顶下,再好好看
发表于 2011-9-17 23:16:52 | 显示全部楼层
ding lou zhu
发表于 2011-9-28 19:36:05 | 显示全部楼层
楼主必须酷!刚涉及加密!学习咯
发表于 2011-9-28 19:43:48 | 显示全部楼层
这个一定要学习一下滴。。。谢谢楼主!!
发表于 2011-9-28 23:20:44 | 显示全部楼层
LZ好人!第二次看了,又有新的收获,等过几个月再复习一下
发表于 2011-9-29 01:17:01 | 显示全部楼层
发表于 2011-9-29 08:26:10 | 显示全部楼层
精彩!精彩的讨论!
发表于 2011-9-29 08:48:10 | 显示全部楼层
mark
发表于 2011-9-29 09:01:20 | 显示全部楼层
mark
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2020-2-24 20:43

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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