打印
[STM32F1]

你辛苦做出来的id软件加密就这么轻松被改了

[复制链接]
5953|109
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
开发人员一般设计软件加密方法:读id---复杂算法计算---对比之前存储的对应数据(与id相关)---判断芯片是否合法。由于读id时很多人直接用id起始地址,例如0x1FFFF7E8,**的人只要把这个数据改成0x8000020,并且0x8000020程序区域填上母片的id,不管你的算法有多复杂,这时你的程序就被**了,改这种软件加密一分钟就改好了。所以千万注意程序里面不要出现id起始地址。
//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);//和算法结果不正确,进行错误分支
        }
}
//QQ9272078

使用特权

评论回复
沙发
nstel| | 2019-11-5 09:08 | 只看该作者
用ID码和时钟校准,联合加密,决对不可**的。

使用特权

评论回复
评论
nstel 2019-11-5 12:13 回复TA
@meijc119 :那就只有1/200的合格率,没有实用价值了。 
meijc119 2019-11-5 09:10 回复TA
把你母片的id码和时钟校准都读出来,再放入程序里面呢 
板凳
nstel| | 2019-11-5 12:16 | 只看该作者
ARM 的CORTEX-M系列,设计之初,就实考虑到了加密问题的。采用不等字长指令,反汇编基本无可能。应该说,这是专门为中国而变的。

使用特权

评论回复
评论
nstel 2019-11-6 12:55 回复TA
@yjmwxwx :你在说梦话。我试了很多次了。不能对ARM反汇编的。 
yjmwxwx 2019-11-5 17:15 回复TA
@nstel :用库函数可以被软件自动识别出函数名,而且即使识别不出来看位置也很容易看出来,现在那些破解的好像根本不看汇编,都是看IDA PRO反出来伪C,我以前研究过一段时间反汇编,我说我看汇编人家专业的都笑话我,我写STM32都是用汇编,纯汇编写的也一样被反成C,要想不被反汇编要做手脚,不知道那些反汇编软件是什么算法,不用库自己写别人也没那么容易读懂 
nstel 2019-11-5 16:58 回复TA
@yjmwxwx :如果用汇编语言写的呢?怎么反过来?如果库函数中间夹杂汇编语言的语句,反出来的库函数就是面目全非了。ARM给你提供了一个加密的基础了,但是,你自己不动动脑子,那就不能加密成功了。 
yjmwxwx 2019-11-5 13:34 回复TA
那些搞破解的,改改汇编直接放到KEIL里面重新编译,只要会正向用过库函数很容易看懂别人的程序,这东西没什么门槛。 
戈卫东 2019-11-5 13:01 回复TA
醒过来! 
地板
meijc119|  楼主 | 2019-11-5 13:14 | 只看该作者
本帖最后由 meijc119 于 2019-11-5 13:15 编辑

只要把0x1FFFF7E8改成0x8000020,并且0x8000020程序区域填上母片的id,不管你的算法有多复杂,这时你的程序就被**了,这样改一下,连反汇编都不需要,1分钟搞定

使用特权

评论回复
5
yjmwxwx| | 2019-11-5 13:31 | 只看该作者
连接上JLINK调试器,应该能跟踪到哪里读的ID码。

**了有啥用,比如一个仪表的校准方法不公开,就是被仿制了也测不准。

使用特权

评论回复
评论
yjmwxwx 2019-11-5 17:01 回复TA
@meijc119 :这种计算的方法最好加长延时读ID,输入序列号后不马上和正确的比较也不显示正确错误,即使输入错误也能正常运行许多天,这样可能不会被短时间内破解,还有少用库函数最好所有函数都自己写,最主要的那些搞破解的不出来说他们的方法,要是知道他们用什么方法才能想更好的办法预防。 
meijc119 2019-11-5 13:42 回复TA
仿真需要反汇编,还要跟踪,这些都要不少时间,也不定能找到,但上面那种做法,1分钟就破解了 
6
nstel| | 2019-11-5 17:01 | 只看该作者
yjmwxwx 发表于 2019-11-5 13:31
连接上JLINK调试器,应该能跟踪到哪里读的ID码。

**了有啥用,比如一个仪表的校准方法不公开,就是被仿 ...

不等字长的二进制码,反汇编出来的,就不是原来的语句了。完全是谁都看不懂的天书,怎么去修改?

使用特权

评论回复
评论
nstel 2019-11-6 23:24 回复TA
@yjmwxwx :程序不是原来的程序了,你怎么去跟踪? 
yjmwxwx 2019-11-6 23:17 回复TA
@nstel :jlink命令行设置观察点,就算通过计算,只要用ldr指令读计算后的地址,也会被跟踪到。 
nstel 2019-11-6 10:14 回复TA
@yjmwxwx :无法跟踪的。 
meijc119 2019-11-6 08:41 回复TA
@nstel :就是直接改bin文件,很容易改,所以id地址一定要算出来,不要直接出现地址 
yjmwxwx 2019-11-6 07:58 回复TA
@nstel :插上JLINK一下就被跟踪到了 
nstel 2019-11-6 07:03 回复TA
@yjmwxwx :主贴不是说了吗?让你搜索不到,你怎么改? 
yjmwxwx 2019-11-5 19:41 回复TA
@nstel :他就改个唯一ID的地址,只要把文字池里面的ID地址改成他想要的地址就可以了,不用反汇编直接16进制编辑器搜索编辑就可以了。 
nstel 2019-11-5 19:08 回复TA
@meijc119 :怎么改?直接改二进制码?你牛啊! 
meijc119 2019-11-5 17:41 回复TA
大部份做的软件加密。不需要反汇编就能改 
7
nstel| | 2019-11-5 17:03 | 只看该作者
怎么加密。方法我都提供得很祥细了,还是看不懂得话,那就怪你笨了。那你开发得软件根本就没有**的价值了!

使用特权

评论回复
8
yjmwxwx| | 2019-11-5 17:20 | 只看该作者
nstel 发表于 2019-11-5 17:01
不等字长的二进制码,反汇编出来的,就不是原来的语句了。完全是谁都看不懂的天书,怎么去修改? ...

你自己下载个IDA PRO反汇编软件试验下不就知道了,大多数指令都能识别出来的

使用特权

评论回复
9
nstel| | 2019-11-5 19:07 | 只看该作者
yjmwxwx 发表于 2019-11-5 17:20
你自己下载个IDA PRO反汇编软件试验下不就知道了,大多数指令都能识别出来的 ...

大多数有什么用?不等字长的二进制码,只要有一句识别错了,反汇编出来的就是面目全非!根本不是原来的程序了。

使用特权

评论回复
评论
yjmwxwx 2019-11-6 07:22 回复TA
@nstel :有ARM选项的 
nstel 2019-11-6 07:02 回复TA
@yjmwxwx :我试了一下,根本就不能反汇编ARM指令。处理器选项里,只有X86系列的。没有ARM系列的。强行反汇编,出来的指令是X86系列的指令,当然乱套了!怎么去修改? 
yjmwxwx 2019-11-5 19:39 回复TA
那软件算法好像是一小段一小段的反汇编,识别错了只影响一小段,你试验下就知道了 
10
YDCMAN| | 2019-11-5 21:42 | 只看该作者
先MARK,有时间再研究

使用特权

评论回复
11
yjmwxwx| | 2019-11-6 07:22 | 只看该作者
nstel 发表于 2019-11-5 19:07
大多数有什么用?不等字长的二进制码,只要有一句识别错了,反汇编出来的就是面目全非!根本不是原来的程 ...



选ARM,然后点set

使用特权

评论回复
12
zeshoufx| | 2019-11-6 08:56 | 只看该作者
谢谢分享,,,,,,,

使用特权

评论回复
13
lcdi| | 2019-11-6 09:02 | 只看该作者
程序做一个完整性校验,crc,这样就不怕了吧

使用特权

评论回复
14
e21| | 2019-11-6 10:52 | 只看该作者
软件运行时不知道什么地方什么时候会用什么方法去读ID,你都不知道有ID加密,更不用说去跟踪了.抄了之后,机器出去一段时间,才出现问题,问你咋办?

使用特权

评论回复
15
xxdcq| | 2019-11-6 12:15 | 只看该作者
本帖最后由 xxdcq 于 2019-11-6 12:17 编辑

加密的人会在程序N多处设陷阱,即使解出来暂时可用,不定什么时候遇到什么特定情况就会爆发
解密的人等着去赔家底吧,即使不爆发,知道将来可能爆发这种心理压力比等死还难受

使用特权

评论回复
16
nstel| | 2019-11-6 12:53 | 只看该作者
yjmwxwx 发表于 2019-11-6 07:22
选ARM,然后点set

我试了很多次。打开BIN文件,没有ARM选项,打开HEX文件,没有ARM选项,打开AXF文件,有ARM选项,并且100%正确反汇编。这有什么意义呢?AXF文件本身就带有汇编格式,你把它显示出来了。就是说,这个软件默认是不对ARM芯片反汇编的。

使用特权

评论回复
17
icecut| | 2019-11-6 13:25 | 只看该作者
哈哈,还用ida pro,我自己写个虚拟机,直接给你动态分析了...

使用特权

评论回复
评论
icecut 2019-11-7 11:48 回复TA
@yjmwxwx :不会的,初学者不明白,还是拿着板子爽.哈哈哈 
yjmwxwx 2019-11-7 10:14 回复TA
@icecut :直接虚拟你是想抢那些卖开发板的生意吧,外设那么多,要写的能用也比较麻烦,没有多年软件开发经验写不了,不过这肯定是趋势,不用买硬件多爽。 
icecut 2019-11-7 09:38 回复TA
@yjmwxwx :就是看指令集多少,虚拟机用于破解很多东西都是不用完全真实的.也不用性能优化. 虚拟机是很成熟的技术了.书都能找到好多本 
yjmwxwx 2019-11-6 23:06 回复TA
@icecut :能写虚拟机很厉害 
icecut 2019-11-6 22:22 回复TA
@yjmwxwx :keil不能仿真外设. 我自己写的虚拟机可以虚拟外设. 
yjmwxwx 2019-11-6 15:32 回复TA
以前看那些搞逆向的都是用KEIL把反汇编后的代码重新编译仿真 
18
nstel| | 2019-11-6 14:10 | 只看该作者
icecut 发表于 2019-11-6 13:25
哈哈,还用ida pro,我自己写个虚拟机,直接给你动态分析了...

你比华为更能吹牛。

使用特权

评论回复
评论
yjmwxwx 2019-11-6 23:14 回复TA
@icecut :年初想学LINUX没钱买板子就用QEMU虚拟,但是不知道怎么用机器级调试器,GDB不能跟踪上电的第一条指令,后来100多块钱买了板子就不用QEMU了,再后来又去搞单片机,想学LINUX又被放下了,现在不知道是该继续学用单片机做东西还是把LINUX内核搞明白,前辈能给个建议吗? 
icecut 2019-11-6 21:56 回复TA
@yjmwxwx :a系列是没问题的. 
yjmwxwx 2019-11-6 14:57 回复TA
QEMU不知道能不能模拟CORTEX-M 
19
yjmwxwx| | 2019-11-6 15:23 | 只看该作者
nstel 发表于 2019-11-6 12:53
我试了很多次。打开BIN文件,没有ARM选项,打开HEX文件,没有ARM选项,打开AXF文件,有ARM选项,并且100% ...

这软件我也不熟悉,而且我不懂英文不知道怎么设置,只是很多年前研究过一段时间,觉得没意思也没什么用就没继续研究了。我也不知道怎么设置自动分析成汇编的代码,记得以前老版本的都是自动变成汇编了,没变成汇编的话用C快捷键可以转成汇编,D键转成数据,你懂英文应该很容易知道怎么设置。

我贴下我打开的方法,不知道对不对,很长时间没用这个软件了,你有兴趣自己慢慢研究吧。











下边这步不知道为啥没变成汇编,选中代码按了几下D键和C键。





使用特权

评论回复
20
nstel| | 2019-11-6 16:11 | 只看该作者
yjmwxwx 发表于 2019-11-6 15:23
这软件我也不熟悉,而且我不懂英文不知道怎么设置,只是很多年前研究过一段时间,觉得没意思也没什么用就 ...

你这个是旧版本,最新的7.2版,已经不能反汇编ARM了。应该是自知没法用,所以禁了这个功能。
我再说一次:不等字长的二进制码,神仙都不能反汇编的!你可以用51系列的试一下看看。51的反汇编软件大把的多,但是,没有一个真正能用的。CORTEX-M系列就更难反汇编了。51系列在设计时还没有考虑到反**,ARM的CORTX-M系列在设计时,就充份考虑了反**策略。

使用特权

评论回复
评论
nstel 2019-11-7 10:33 回复TA
@icecut :字节等长指令集,花指令是无效的。我就破解过MICROCHIP的花指令伪装。 
nstel 2019-11-7 10:32 回复TA
@icecut :字节等长指令集,花指令是无效的。我就破解过MICROCHIP的花指令伪装。 
icecut 2019-11-7 09:39 回复TA
你搜一下花指令. 比变长指令集复杂的多吧.... 
meijc119 2019-11-6 16:54 回复TA
@nstel :是两件事情,1,直接改bin文件就破解软件加密了。2,反汇编完全没问题,看懂是难,但不需要看懂 
nstel 2019-11-6 16:38 回复TA
@meijc119 :每个字节都一样。没有错。但是,谁能读懂呢?保正每个字节都一样,就是把单片机再破解一次!你花了两次钱,什么也没得到! 
meijc119 2019-11-6 16:34 回复TA
改这个软件加密不需要反汇编,另外51也是不等长的指令,stm32f反汇编淘宝上一堆做这个的,保证编译出来的文件与原文件每个字节都一样 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

115

帖子

1

粉丝