OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3241|回复: 2

IoT Hot Patch的实现和应用

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2020-8-27
在线时间
2 小时
发表于 2020-8-27 10:16:54 | 显示全部楼层 |阅读模式
1金钱
想知道有没有人利用stm32的In-Application-Programming的固件更新方式来实现热修复,例如:先将patch加载到flash的一个0x08xx的未使用的地址,然后利用inline-hook将有漏洞的函数跳转到后面patch的函数。再或者有没有人利用:Flash Patch and Breakpoint Unit (FPB) 来进行固件的热更新。

有没有成熟的固件热修复方案?例如遇到漏洞不想整个升级固件,而是先临时加载一个patch把漏洞函数修复了。

最佳答案

查看完整内容[请看2#楼]

这个难度比较大,估计很少有成熟的方案。因为程序已经变成了二进制,函数存储的地方前后肯定有别的内容。如果只是修改一个函数,而且修改的大小比原来的小或者等于,直接改还行。如果大的话,会影响后面的函数。导致升级不成功。你可以先研究研究,说不定你就可以成为牛逼的大神了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-8-27 10:16:55 | 显示全部楼层
这个难度比较大,估计很少有成熟的方案。因为程序已经变成了二进制,函数存储的地方前后肯定有别的内容。如果只是修改一个函数,而且修改的大小比原来的小或者等于,直接改还行。如果大的话,会影响后面的函数。导致升级不成功。你可以先研究研究,说不定你就可以成为牛逼的大神了。
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2020-8-27
在线时间
2 小时
 楼主| 发表于 2020-8-27 20:00:26 | 显示全部楼层
三叶草 发表于 2020-8-27 12:55
这个难度比较大,估计很少有成熟的方案。因为程序已经变成了二进制,函数存储的地方前后肯定有别的内容。如 ...

方案一,是利用inline hook,将漏洞函数的第一条指令改成jump,跳转到修复函数。目前我卡在修改漏洞函数第一条指令这里,我用HAL_FLASH_Program竟然无法修改0x08000196这种地址,在keli的memory视图可以修改。
  1. void my_hello() {
  2.     printf("hello origin\n");
  3. }

  4. void my_hook() {
  5.     printf("hello hook\n");
  6. }

  7. void doHook(void *func, void *newAddr) {
  8.     char *f = (char *)func;
  9.     *(long *)&f[0] = 0xe51ff004; // ldr pc, addr
  10.     *(long *)&f[4] = (long)newAddr;
  11. }
复制代码



方案二:
https://www.jianshu.com/p/78891ee1611b
直接覆盖漏洞指令,让有漏洞的位置变成跳转,跳转到修复块,执行完再跳转回来。

这两个方案不是直接原地覆盖漏洞函数, 应该不会遇到修改大小不一致的问题(因为只是将一条现有的指令改成跳转)。但我遇到的问题是,是否0x08000xxxx代码段的地址都可以修改?如何绕开stm32保护机制。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 20:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表