打印
[应用相关]

程序如何保护不被别人**读出

[复制链接]
1795|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两只袜子|  楼主 | 2021-1-5 09:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教各位大侠,小弟最近在弄一个产品,已接近尾声了。前段时间去客户那里调试,无意思间发现该客户超强,他们居然拿着别人的产品直接去**,得到二进制码,硬件直接照猫画虎,烧进二进制码,可用。所以小弟我就想到,我们的产品不会到时候也这么被**了。小弟的产品用的是STM3210XXX系列的MCU,下面是我想问的几个问题:
1.烧写时选上secure chip后被**的可能性有多大
2.除了选上secure chip外,如果在程序里穿插一段FLASH_ReadOutProtection函数,对前面地址的代码进行保护,会不会影响代码的正确运行
3, 其它的还有什么可行的简洁方法,保证代码不被读出,或者即使读出也不可用。
谢谢

使用特权

评论回复
沙发
奋斗小范| | 2021-1-5 10:11 | 只看该作者
增加一个激活步骤,提示一下,每个芯片的UID是唯一的

使用特权

评论回复
板凳
meijc119| | 2021-1-5 10:55 | 只看该作者
利用id做软件加密
1,如果板子上有外部存储器,可以先编写一个程序,利用算法把id计算得到一些值存入外部存储器,然后再烧写真正的程序,真正的程序去校验外部存储器的数据是否合法即可

2,利用板子上按键组合,或是上电按住某些键,程序在这个时候利用算法把id计算得到一些值存入程序区(stm8为EE区),程序运行时去验证程序区数据是否正确

3,轩微编程器有软件加密的功能,编程器会读芯片id,根据算法直接改写缓冲区,达到软件加密的作用

4,读出的id通过一定算法,例如异或加上一个数,得到的数据存入flash(只运行一次,运行后标志位也存入flash),下次读到这个标志位,就不运行这个程序。//Q9272078

四、做软件加密时注意
1,不要在程序中直接出现id地址,例如STM32:1FFFF7E8 1FFFF7EC 1FFFF7F0   STM8: 0x4865~0x4870
2, 利用校验和或是crc对程序区进行校验,防止改程序

使用特权

评论回复
地板
e21| | 2021-1-5 16:33 | 只看该作者
用ID加密,写完第一次启动的时候利用算法把id计算得到一些值,然后擦除这一段(stm32需要放在单独的块),存入结果和程序类似CRC的值.
以后运行某个时间再校验写入的结果,不要开始就做.可以多处进行.

使用特权

评论回复
5
dog_xin| | 2021-1-6 08:53 | 只看该作者
我们用加密芯片,再也无需考虑程序的加密问题了。我们把应用数据存储在加密芯片中,得不到这个芯片,应用就有问题

使用特权

评论回复
6
pattywu| | 2021-1-6 09:40 | 只看该作者
程序 写得烂一点,比什么都强。

使用特权

评论回复
7
昨天| | 2021-1-6 11:31 | 只看该作者
    留点BUG   ,过几天同客户说那个程序还要更新才行,  

使用特权

评论回复
8
9pin| | 2021-1-30 07:49 | 只看该作者
什么方法这么容易得到二进制代码?

1 出厂产品封掉芯片JTAG,使能芯片读保护。
2 参考POS机,做三级密钥体系。
3 使用公私钥对,将一堆CPU ID,FLASH ID等信息进行密钥计算。
4 一机一密,出厂时用私钥在安全房对设备进行保护。
5 用来加密的电脑放在安全房。私钥保存在电脑上,除了老板,谁都拿不到。
6 将某段代码单独编译,加密后保存到FLash上,运行时解密拷贝到RAM执行。

其实,最简单的应该是,用新款IC,带trueZone的,按照芯片设计来设计其安全。

使用特权

评论回复
9
观海| | 2021-2-1 23:24 | 只看该作者
还木有做过软件加密啊

使用特权

评论回复
10
guanjiaer| | 2021-2-1 23:27 | 只看该作者
强大的解密工具 难以预防啊

使用特权

评论回复
11
heimaojingzhang| | 2021-2-1 23:29 | 只看该作者
哈哈哈  6楼道出了真意啊

使用特权

评论回复
12
keaibukelian| | 2021-2-1 23:31 | 只看该作者
使用何种加密方式呢

使用特权

评论回复
13
labasi| | 2021-2-1 23:32 | 只看该作者
有没有专用的加密工具啊

使用特权

评论回复
14
classroom| | 2021-2-2 09:46 | 只看该作者
RE:程序如何保护不被别人**读出

世界上,原本就有矛和盾这两个东西的。没有绝对的安全,我建议你在外面加个加密芯片,这样他**了你的MCU的程序,也么有用,因为一般加密芯片的**就不是那么容易和便宜了的,这样比较经济适用。

使用特权

评论回复
15
laocuo1142| | 2021-2-2 09:46 | 只看该作者
//STM32F10X软加密方法及实例代码

#define ID_ENCRYPT_EOR_RESULT_ADDRESS (0x0800F000)
#define ID_ENCRYPT_ADD_RESULT_ADDRESS (0x0800F004)
volatile uint32 gU32IdAdressVar;//这里一定要定义此变量,否则会被优化器优化掉
void Stm32F10xEncryptDemo(void)
{
        uint32 *u32IdAddress;
  uint32 u32EorRslt, u32AddRslt;
        #IF 0
        //如果直接赋值0X1FFFF7E8,则程序编译结果里会有0X1FFFF7E8,这样**人员会很轻松
        //的找到这个内容,然后非常容易进行修改,去掉软加密
        u32IdAddress = (uint32*)0x1ffff7e8;
        #else
        //千万别显式的读取ID,即要把0X1FFFF7E8运算成隐式的,例如此例中0x1FFFF7E8 = (0x455873a * 4) + 0xEA9DB00;
        //这样,别人就算**出了你的程序,也查找不到0X1FFFF7E8,这样就不能轻易的软解密,这样处理后如果要软解密,
        //一定要反汇编出来进行复杂逆向分析,难度极大,代价极高,很难搞定软加密了,达到保护产品的目的。
        gU32IdAdressVar = 0x455873a;
        gU32IdAdressVar <<= 2;//0x11561CE8
        u32IdAddress = (uint32*)(gU32IdAdressVar + 0xEA9DB00);//0x1ffff7e8
        #endif
        //读取单片机的ID,并进行运算,具体算法可以自己定,这里只用到简单的异或及和运算
        u32EorRslt = (*u32IdAddress) ^ (*(u32IdAddress + 1)) ^ (*(u32IdAddress + 2));
        u32AddRslt = (*u32IdAddress) + (*(u32IdAddress + 1)) + (*(u32IdAddress + 2));
        //进行对比,如果运算结果与FLASH保存的结果不一样,说明非法,运行错误代码
        if(u32EorRslt != *((uint32*)ID_ENCRYPT_EOR_RESULT_ADDRESS))
        {
                while(1);//异或算法结果不正确,进行错误分支
        }
        if(u32AddRslt != *((uint32*)ID_ENCRYPT_ADD_RESULT_ADDRESS))
        {
                while(1);//和算法结果不正确,进行错误分支
        }
}

使用特权

评论回复
16
powerantone| | 2021-2-2 09:47 | 只看该作者
我想给你泼一瓢凉水。楼主根本不了解解密行业,不要用你写程序的思路去推断**的人的思路,他们是不会被你牵着鼻子走的。 这种小儿科的思路,在**者看来想笑,**根本就不管你前面怎么弄这个芯片id的地址,也不会去关心你的判断机制,只需要用跟踪工具找到你的主程序入口,直接汇编在代码最前两个字节改一个JNZ长跳转到你的正常程序,你那些东西全白费。如果你在程序过程中多处对比id或者用id做运算参数,那也好办,打个补丁,提取出你程序正常运行的这个片子的id,把你程序一开始就跳转到芯片没有用到的空间地址,**补丁把提取到的id写到你之前读取芯片id存放的内存地址。然后再绕过你这些读id之类的代码,你还是歇菜。

使用特权

评论回复
17
flycamelaaa| | 2021-2-2 09:47 | 只看该作者

学习了,我也要考虑加密的问题呀

使用特权

评论回复
18
stormwind123| | 2021-2-2 09:47 | 只看该作者

赞太棒了,学习学习,谢谢分享!

使用特权

评论回复
19
orient2022| | 2022-4-16 11:10 | 只看该作者
学习学习

使用特权

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

本版积分规则

2078

主题

7719

帖子

11

粉丝