你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 6805|回复: 7

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

[复制链接]

1

主题

8

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2012-12-9 17:28:17 | 显示全部楼层 |阅读模式
请教各位大侠,小弟最近在弄一个产品,已接近尾声了。前段时间去客户那里调试,无意思间发现该客户超强,他们居然拿着别人的产品直接去破解,得到二进制码,硬件直接照猫画虎,烧进二进制码,可用。所以小弟我就想到,我们的产品不会到时候也这么被破解了。小弟的产品用的是STM3210XXX系列的MCU,下面是我想问的几个问题:
1.烧写时选上secure chip后被破解的可能性有多大
2.除了选上secure chip外,如果在程序里穿插一段FLASH_ReadOutProtection函数,对前面地址的代码进行保护,会不会影响代码的正确运行
3, 其它的还有什么可行的简洁方法,保证代码不被读出,或者即使读出也不可用。
谢谢
<
回复

使用道具 举报

24

主题

591

回帖

0

蝴蝶豆

中级会员

最后登录
2020-12-2
发表于 2012-12-9 20:22:24 | 显示全部楼层

RE:程序如何保护不被别人破解读出

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

使用道具 举报

1

主题

32

回帖

0

蝴蝶豆

中级会员

最后登录
2020-10-29
发表于 2019-9-6 10:13:45 | 显示全部楼层
//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);//和算法结果不正确,进行错误分支
        }
}
回复 支持 反对

使用道具 举报

2

主题

68

回帖

0

蝴蝶豆

中级会员

最后登录
2020-7-2
发表于 2019-9-6 16:22:45 | 显示全部楼层
meifan119 发表于 2019-9-6 10:13
//STM32F10X软加密方法及实例代码

#define ID_ENCRYPT_EOR_RESULT_ADDRESS (0x0800F000)

跨越7年的回复啊,赞
回复 支持 反对

使用道具 举报

0

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
2020-6-8
发表于 2020-3-24 23:42:27 来自手机 | 显示全部楼层
赞太棒了,学习学习,谢谢分享!
回复 支持 反对

使用道具 举报

0

主题

10

回帖

0

蝴蝶豆

新手上路

最后登录
2020-4-7
发表于 2020-3-28 16:37:46 | 显示全部楼层
学习了,我也要考虑加密的问题呀
回复 支持 反对

使用道具 举报

0

主题

1

回帖

0

蝴蝶豆

新手上路

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

使用道具 举报

1

主题

32

回帖

0

蝴蝶豆

中级会员

最后登录
2020-10-29
发表于 2020-10-29 11:32:53 | 显示全部楼层
estack 发表于 2020-8-14 14:46
我想给你泼一瓢凉水。楼主根本不了解解密行业,不要用你写程序的思路去推断破解的人的思路,他们是不会被你 ...

所以最最关键的就是不要让破解的人看出你读id的地方。
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版