如何修补二进制文件并保存?

逆向工程 拆卸 修补 二进制编辑
2021-06-27 11:43:45

我有一个 ARM 可执行二进制文件,我想在精确的虚拟地址上修补它。是否有任何安全(和自动化)的方法来执行此任务?

欢迎使用任何脚本或工具!

1个回答

如果你在 Linux 上使用一组简单的命令作为readelfprintf()并且dd可以完成这项工作。

例如,如果您有MyBinELF 格式的二进制文件,并且想要修补0x418966内存中的以下条件

jnz     loc_418706 ; 0x418966: 0f 85 9a fd ff ff

首先,您必须找到有关.text二进制文件部分的信息

$ readelf --wide -S MyBin | grep '.text\|Name\|Off'
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [13] .text             PROGBITS        0000000000414670 014670 0dfa82 00  AX  0   0 16

这里:

  • .text部分在二进制文件中开始0x014670
  • .text部分加载到内存中0x414670

然后您必须计算二进制文件中相对于该.text部分的指令偏移量

0x418966 - 0x414670 = 0x0042f6
0x014670 + 0x0042f6 = 0x018966

或使用外壳单衬:

$ text_addr=0000000000414670; inst_addr=418966; text_off=014670; \
  python -c 'print(0x'$inst_addr' - 0x'$text_addr' + 0x'$text_off')'
100710

此处修补指令位于0x18966二进制文件中。

最后,我用 nop 和近跳转 ( jmp e9 [cd])修补二进制文件

printf '\x90\xe9' | dd of=MyBin bs=1 seek=100710 count=3 conv=notrunc