榜首环:
ID–>F1(ID) -----》IDX,
将ID经过自定义的一个算法F1,转换为一个整数IDX , F1为不行逆运算,也不能被简略剖析,这个实际上是简略完成的。
然后,将IDX保存到EEPROM或FLASH的任何当地,咱们经过编一个函数 GET_IDX()能够读出这个数即可。
第二环:
再编一个函数:
int getmy_1(){
return F1(ID)-GET_IDX()+1;
}
int getmy_0(){
return F1(ID)-GET_IDX();
}
还有一些其他自定义的函数内:都能够直接运用(F1(ID)-GET_IDX()) 来替代0; 直接用(F1(ID)-GET_IDX()+1)来替代1;
第三环:
在程序任何需求运用到1的当地,都能够考虑运用getmy_1()替代。
或即便本不运用1,也能够来用上一下:
如: x=(x+1-getmy_1())*getmy_1();
或把 for(i=0;i<=count-1;i++)
改为: for(i=getmy_0();i<=count-getmy_1();i++)
抑或是:
指针 p++;能够改为: p=p+getmy_1();
或许:给函数传递变量时,传递方在 变量上+F1(ID), 被调用的函数在 变量上--GET_IDX():
比方原本是
void f1(){
int i,j;
….
j=f2(i);
}
int f2(i){
return i*2;
}
修正为:
void f1(){
int i;
….
j=f2(i+F1(ID));
}
int f2(i){
return (i-GET_IDX())*2;
}
如程序被不合法仿制:从ID无法得到IDX,那么IDX和F1(ID)不相等,
那么getmy_0不再是0,getmy_1不再是1,
程序将呈现什么作用,谁都无法意料了。
---------------------------------------------------------
特色: 由于整个程序的加密,采用了“运算加密”的思路, 而非判别加密, 又没有用到任何一行 if判别,让解密者去想破脑袋吧。
即便猜测到有可能是这种加密思路,但是程序并不是依据if判别跳转,加密的作用天然散布在程序的各个当地,怎样去改,也很伤脑筋了。
直接修正getmy_1和getmy_0,这个首要是得剖分出加密思路时才干作出的。
别的修正getmy_1和getmy_0仅仅干掉简略的部分。
还有一些是很难干掉的:
给函数传递变量时,传递方在 变量上+F1(ID), 被调用的函数在 变量上--GET_IDX():
比方原本是
void f1(){
int i,j;
….
j=f2(i);
}
int f2(i){
return i*2;
}
修正为:
void f1(){
int i;
….
j=f2(i+F1(ID));
}
int f2(i){
return (i-GET_IDX())*2;
}
别的,包括一些全局部变量的处理,能够在一些函数里面加上F1(ID);
在;别的一些当地进行-GET_IDX()的操作,并不会将代码简略会集放到一点的。
当然,假如精准的理解了整个程序的加密思路来说,这个也能够花时间干掉,不过这种加密办法自身现在是很少有人用的。
总归这种加密强度远高于简略的if比较办法。这个是一个新的基本思路,我举的比方仅仅一些简略的比方,彻底能够自己做得愈加灵敏。
F1当然是相同的啊。仅仅ID不同。
趁便回复上楼,我有个条件: 只需单片机具有真实仅有ID,这个意思包括: 单片的ID不行以仿制。
你说那个当地仅仅怎样去复制程序出来, 假如单片机具有真实仅有ID, 复制程序是没有用的。
我们先别拍砖头,思路很不错。从杂乱度上现已添加到了必定程度。
主张做成强制in-line,不然对破解人来说太显着……由于很多的逻辑都指向某一个或某两个函数……
别轻视干这行的智商——所谓没有金刚钻,不揽瓷器活。别的,用减法做比较也是业界知识……其它还有用异或作用是否为0……这些都是常见的特征……
对, inline!好思路, 有必要的!
代码尺度就上去了哦~ 履行功率也随之受到影响……不过假如有内部的什么1~4个周期的硬件CRC之类,就能够
处理功率问题,而且彻底把算法躲藏好……问题是……这个CRC硬件最好是不揭露的才行……有一些芯片还有一些特别矩阵转置(permutation)外设——也都没有对外揭露……
躲藏加密算法的加密使用规模受到影响,由于用的人多了,天然就揭露了,揭露加密算法,没有密钥但仍然很难解密的才有生命力,楼主这种思路是能够添加破解的困难,不过只能给盗版者加工资。当然有些小产品,赢利和商场原本不大,盗版的本钱太高也的确能维护不幸的程序员
一切的单机程序都是能够破解的,真实要维护自己的作用其实并不是经过加密,而是经过网络服务,这就像杀毒软件,只需联上网,主动权永久把握在自己手中,这样的软件底子就永不着加密。就像微软的WINXP,再怎样加密也会被破解,但是只需联网,就能够黑你屏,就像单机游戏,今日做出来,明日就被破解,但是网络游戏,你见过破解的吗?除非侵略服务器,只需一侵略就被发现。所以单片机要想彻底维护产权,就要供给网络化服务。
首要不要忙着拍砖,我来收拾一下思路。使用全球仅有ID(每颗MCU都有一个仅有ID)的加密精华在于避免程序简略读出的景象,乃至HEX ROM底子无需加密,和破解读出HEX code的难易程度没有关系。实际上只需求两步:
1.自己想一个以为非常好的算法,使用MCU的GUID生成别的一个ID(可变长),再自己规划一个下载器(加密算法也在里面)烧录到EEPROM或Program ROM里面。保管好烧录器,不要外泄。你的烧录器便是一个加密东西!
2.在你的程序傍边散布式的对用烧录器烧进去的加密后ID解密。这个比较重要,由于解密代码写的过于会集便于反汇编剖析。比方不要解密后不正确不要进入死循环,不要马上封杀所以功用,假如是盗版你成心给他几个丧命BUG,让他抄袭后出产退货,丢失更大。加密的作用便是烧录到每个MCU的HEXCODE是不相同的,即便读出了一个MCU的HEXCODE,烧到别的的MCU是不能经过解密算法验证的。仅有的解密的办法是去剖析你得HEXCODE,剖分出加密算法,破解者再规划出和你相同的烧录器!总归,这个办法只能比照较大的Program ROM有作用,假如是小的MCU,比方只需1KB ROM就很难做好,究竟代码少,简略剖析。说实话,假如有这样的功底的工程师去反汇编你的代码,说不定他就正向规划来得更快!这仅仅防盗防火防小人罢了。
用simlator去盯梢程序。然后找到GUID。替换掉即可。
STM32的UID有一部分是阐明这个片子在晶圆的XY坐标方位的,一个晶圆上面一切的片子UID都不相同,至于不同晶圆的UID怎么完成不同我就不知道了。。在晶圆上完成个仅有ID又难了?激光几闪,随机切断96个硅片的导线就获得了96bit的仅有ID了————————
楼主这个加密办法的确不错,不过条件是inline的办法,不然频频调用某个函数很快就会被发现,别的加密后的IDX最好在启动时就读取到RAM中,不然频频读取某个FLASH或EEPROM方位也很简略被发现,最终,还需求选用解密本钱较高的单片机,如最近一个朋友想解密一款NEC的单片机,读出ROM的费用就需求近20万。
别的楼上说这个办法简略的,仅仅由于你现已看到了楼主的加密思路,假如现在是先给个用这种办法加密的固件出来,我想就不会有人简略下结论了。假如是inline函数并上去的话,那么有个小问题便是代码量会超大。
楼首要研讨软件的加密算法,主张先去学习一下现在windows下一般使用软件加壳的各种原理,仅有ID在这个范畴是彻底不新鲜的一个东西,最常见的便是软件依据CPU、硬盘或网卡的MAC来生成一个所谓硬件ID让用户注册。
而算法加密更是形形色色,除了加密条件判别外,还有代码的动态解码,便是用正确的KEY来解密函数A的代码,再跳过去履行,下次解码函数B时又会掩盖函数A的空间等等。
还有虚拟机加密,把一段x86代码转换为MIPS代码,在虚拟机中运转,这样假如破解不知道虚拟机模仿的是哪种汇编指令的话,反编译就会很累,价值便是运转速度下降。
合适有很大rom的mcu 能够参加一些废物代码。读取硬件id或软件id的这两个点是爆炸的首要当地。例如固件全体验证的便是硬件id, 就算自己编写编程器改换固件内的其它key方位等, 整个算法验证的仍是当时的mcu的硬件id是不是与这个固件匹配只需找到读取这个id的当地补丁一下就完了。这个其实就相似与pc机上绑定机器的软件的加密时相同的。
你的办法有必要确保你读仅有ID的行为不被破解者看出。像STM32的独立ID在某个固定地址,那么只需找出拜访那个地址的句子就能够了。
现在有不少量产编程器都支撑依据仅有ID改换一些数据写入指定地址,乃至支撑自己编写改换插件,每个单片机的程序都不相同是彻底能够做到的。
你算法规划的越杂乱,假如不是用来直接维护你自己的利益,那么便是为他们谋福利了。
什么坚不行摧。专业的加密芯片都能够摆平。况且这玩意儿?