You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用IDA Pro、Ghidra修改ARM程序不同长度字符串的问题求助

ARM平台二进制程序跨长度字符串修改方案

问题根因

  • 直接在原字符串存储位置修改长度会破坏二进制结构:插入/删除字节会导致整个文件后续所有内容的偏移错位,程序头、段头存储的虚拟地址与文件偏移的映射关系完全失效,因此会出现IDA无法解析修改后文件的问题。
  • 原地改长字符串会覆盖原字符串后方的其他有效数据,可能是其他常量、跳转表、甚至代码指令,直接导致程序逻辑损坏。
  • 不少非C语言编写、或使用自定义字符串结构体的程序,会单独存储字符串的长度值,若仅修改字符串内容未同步修改对应长度字段,程序读取时会出现乱码或逻辑错误。

跨长度修改实现方法

字符串长度短于原长度

  1. 若为\0结尾的C风格字符串:直接将新字符串写入原位置,后续剩余空间全部补\0即可,通常无需额外修改。
  2. 若为显式长度的字符串:找到该字符串的所有交叉引用(XREF),排查访问逻辑中是否存在硬编码的长度立即数、或独立存储的长度全局变量,将对应值同步修改为新字符串的长度即可。

注意:需确认是否存在指向原字符串中间位置的引用,若有需要同步调整对应引用的偏移。


字符串长度长于原长度

禁止直接在原位置插入字节,按以下步骤操作即可:

  1. 查找二进制文件中的未使用空白区域:通常为各段(.rodata/.data段居多)末尾的0填充区域,可通过readelf -S(ELF格式)等工具计算段大小与实际占用的差值,确认空白区域的地址。
  2. 将完整的新字符串写入该空白区域,记录下新字符串的起始存储地址。
  3. 遍历原字符串的所有交叉引用,将所有指向原字符串地址的引用全部修改为新字符串的地址。
  4. 若为显式长度的字符串,同步将对应长度字段修改为新字符串的长度。

额外排查点

  • 若修改后程序无法正常运行,可排查是否存在固件校验逻辑:不少嵌入式ARM程序会对整个镜像做CRC/哈希校验,修改内容后需同步更新校验值。
  • 若修改的是存储在代码段的常量字符串,需确认修改后段的权限属性符合程序运行要求。

内容的提问来源于stack exchange,提问作者Dewagg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 02:15:09