打印

苦思冥想了一天的ID加密防**方法,安全性如何?

[复制链接]
1608|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wwwajjlcn|  楼主 | 2016-12-27 09:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是STM8芯片,为了加大程序被破解的难度,我想出了个程序方案,希望各位高手给我挑挑刺

我的ROM空间是32KB,已经使用了29KB,打算用剩下的空间来写加密代码

打算设计一个解释执行引擎,就是一个函数,给这个函数传入一个数组,他就会按照这个数组中的内容来执行,引擎内有个A寄存器,可以读入、读出变量到任何指针,功能有加减乘除、各种逻辑运算、可以调用外部函数指针。

这个引擎在CPU空余的时候才运转,时不时运行一次ID校验,ID不符合就给全局变量捣乱,空闲的时候就等待新任务的到来,并且一直运行一些无用操作,让引擎函数内的所有逻辑功能都使用到,无死角,让破解方想下个断点都难,烦死他。

在程序中的一些关键函数中,时不时就利用这个引擎来执行一些数据复制、乘除法的操作,来代替简单的明文代码,不让破解方轻易看懂里面的操作,让他想摘除这个引擎都不行,程序必须依靠引擎才能正常运行。

为了不让破解方那么容易知道引擎内部在运行什么东西,我就在ROM上申请2KB的专用空间,存放脚本代码,然后给编个WINDOWS小程序,把小体积的脚本代码加壳,一层套一层,脚本里面又套一个脚本,把ID加密的钥匙也深藏进去,反正是解释执行的,堆栈很容易设计,硬是把这2KB空间全部填满,不足的部分就添加随机数,随机指令,扰乱视听

每个单片机烧录之前,先下载个小固件去读出ID,然后在电脑上与正式的固件文件混合,替换掉脚本代码里面的钥匙,脚本加好壳,程序四处填充随机数,让每个固件都是独一无二的



我写个引擎都要费这么多功夫了,破解的话,怕是要费更多的事吧?它要解开这10层壳最少都要写个专门的引擎模拟器吧,还必须先吃透我的引擎功能,要是遇上我的脚本要读内存一个地方呢,他这个模拟器从哪儿给他读数值?




我写完了,求挑刺。。。。或者有没有更好的建议

相关帖子

沙发
wwwajjlcn|  楼主 | 2016-12-27 17:07 | 只看该作者
本帖最后由 wwwajjlcn 于 2016-12-27 17:14 编辑

总体的中心思路是,既然**的人很懂MCU硬件,硬件与明文代码是他的强项,那我就把战场转向软件,自己设计一个“软件版CPU”,自己设计指令代码,自己设计“汇编”规则,在我的软件世界里就容不得他来撒野

既然他的单片机模拟器很强悍,懂得利用软件来分析反汇编,那我也要用软件来对抗,自己设计个WINDOWS软件来把我自创的“汇编代码”复杂化,让他的人工分析变成不可能的任务


突然又想出个更好的小方法,就是把我的引擎加上一个滚码功能,脚本指令的第一个BYTE就是个初始种子,逻辑关系详解如下:

种子 = *脚本p++;
while(1){
    正确指令 = *脚本p + 种子;
    种子 = 种子 + 正确指令
    执行指令();
    脚本p++;
}



这样做了之后,脚本指令就有很强的上下文关系,私自增加、删除、修改其中一个指令都会导致脚本断链,后续代码全部不正常

使用特权

评论回复
板凳
changle11sdo5| | 2016-12-27 19:06 | 只看该作者
原来29kb是这样出来的

使用特权

评论回复
地板
mcuisp| | 2016-12-28 00:54 | 只看该作者
技术水平相同的话,**实际上是比加密要容易的

使用特权

评论回复
5
上官梦舞| | 2016-12-28 08:54 | 只看该作者
想法不错。我只是做了一个简单的,芯片上电只初始化一个串口,不做任何事情。当然是需要有串口的片子。不输出任何东西。这个时候只有在串口输入特定的一个指令(这指令只有我知道),单片机串口输出芯片的ID.其它指令芯片没反应。然后把这个ID加上一个特定的开头指令,通过串口输入(即作为激活码输入)。激活码存放在EEPROM,好了,芯片功能激活了。

使用特权

评论回复
6
PIGYONG801| | 2016-12-28 09:15 | 只看该作者
小弄的MCU简单加下密就可以了,如果真心想**,没有做不到的,防君子不防小人。我们基本上把功夫用在如何做好产品上

使用特权

评论回复
7
anjf163| | 2016-12-28 10:31 | 只看该作者
简单加密就行了,如果是高手,根本没必要**,自己写程序就行了。

再说STM8的芯片做的产品能有多高难度?

话有些直白,莫介意。

使用特权

评论回复
8
ningling_21| | 2016-12-28 10:40 | 只看该作者
或许写个程序比**还更快一些

使用特权

评论回复
9
xinxi| | 2016-12-28 12:49 | 只看该作者
好比一栋房子,如果大门、围墙很坚固,里面即便随地堆满金山 也是不会被盗的。如果大门被破,即便里面放着3层嵌套的保险箱 也是迟早被破。

我个人觉得 如果读出hex文件了,id加密很容易**,反汇编 找到读id的程序,把读id地址指针改一下,然后把母片的id写到这个地址对应的flash即可,做到这些只是时间问题。

我倒是有个 程序防盗的好方法,即便是把产品单片机的hex文件给你,没有开发者的参与 也是没法用的,不过这个方法还不想这么大面积的公开。

使用特权

评论回复
10
wwwajjlcn|  楼主 | 2016-12-28 18:42 | 只看该作者
xinxi 发表于 2016-12-28 12:49
好比一栋房子,如果大门、围墙很坚固,里面即便随地堆满金山 也是不会被盗的。如果大门被破,即便里面放着3 ...

谢谢各位热心回复

我也是类似的做法,单片机不能锁门,因为需要随时升级HEX

给HEX不能用是很简单的,难就难在增加软件的反向分析难度

使用特权

评论回复
11
wwwajjlcn|  楼主 | 2016-12-29 23:02 | 只看该作者
本帖最后由 wwwajjlcn 于 2016-12-29 23:05 编辑

已结贴。。


这个引擎已经开始运作了,运行在main线程的空闲死循环处,性能测试了下有点捉急,看来已经不适合用在大数据计算了,就让它做点最简单又必不可少的操作吧,比如复制变量。

壳我套了两层,表层是0.1ms执行一条指令,表层就是一直不停地一条条执行里层脚本,里层速度是1ms执行一条指令,里层脚本就是ID校验和关键变量复制,执行一圈需要100ms左右

调试引擎的时候已经明显感到困难了,不能随意下断点,在C语言层面找个BUG都要费一番功夫,防止反向分析的效果已经出来了,而且还没开启滚码功能,可以直接明文看到当前的指令位置与寄存器内容。
要是把滚码开启,内存也开启滚码,汇编分析起来估计要疯


看来,这种引擎很适合做偷摸校验类的事情,如果我想,完全可以在脚本里层再加一层,里面速度已经慢到每100ms执行一条指令了,可以用它来慢慢校验整个ROM是否被修改,哪怕是几小时运算出结果,也不要紧,不过我懒得搞了,就这样吧

使用特权

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

本版积分规则

1

主题

4

帖子

1

粉丝