【问题标题】:How to rename dynamic symbols in arm elf .so file?如何重命名 arm elf .so 文件中的动态符号?
【发布时间】:2013-12-27 20:05:55
【问题描述】:

我需要在 Android APK 中修改一个 so。 任务是重命名so侧的动态符号(即函数名)。

例如,从 Java_com_example_abc_.... 更改为 Java_com_yahoo_zzz_....

我尝试用WinHex直接搜索替换文本单词,apk启动出错。 似乎 .hash 部分也需要更新,但我不知道如何更新 .hash 部分。

我的问题是重命名动态符号的正确或可取的方法是什么?

我已经卡了3天了,请帮帮我,非常感谢!

发现一个帖子可能相关,但他没有给出替代解决方案。 https://sourceware.org/ml/binutils/2006-03/msg00266.html

【问题讨论】:

  • 唯一的办法是更新你的.so lib的源代码并再次编译
  • @pskink 嗯,我现在迷路了。我要修改的so文件来自另一个文件,该文件已经从原始so中修改过。所以我很确定这是可行的,但不知道如何。顺便说一句,只需要更新函数名(符号)。
  • 你怎么知道.so已经被别人修改了?
  • @pskink 我从官方包中提取了.so,也从修改后的包中提取了.so。然后使用超越比较来比较十六进制值。我已经上传了diff的截图,请查收。linki40.tinypic.com/2a8qgxw.jpg
  • @artlessnoise objcopy --redefine-syms ?没有效果,网上搜索有人说只是重新定义了序数符号而不是动态符号。

标签: android arm reverse-engineering elf apk


【解决方案1】:

我被困了3天,请帮帮我,

你想要达到的目标实际上是不可能的。

ELF 文件的内部结构复杂,你要做的事情需要你把它分解并重新组装。一个类比是将 Intel CPU 分解成晶体管,然后用它们重新组装 AMD CPU。

发现一篇可能相关的帖子

相关的。引用:

基本上它做了以下事情:

  1. 循环 .dynsym 并重新创建 .dynstr
  2. 从头开始重新创建 .hash 表
  3. 计算新的 lma/vma、新的内存布局(.dynstr 大小已更改!)
  4. 根据新布局修复 .dynamic 的内容
  5. 修复.rel.dyn
  6. 修复.rel.plt
  7. 再次修复 .dynsym
  8. 写出新的部分内容

in copy_section:不复制重写的部分。

目前它似乎创建了一个语法有效的 ELF 文件,但作为 .plt 和 .got 之间的距离变化,相对寻址 .plt 坏了。此外,必须再次修复 .got。

因此,作者设法将一些看起来像 AMD CPU 但不起作用的东西粘合在一起。

当然,您可以再花 2 周时间来了解作者的所作所为,然后再花 3 周时间来修复剩余的碎片。在那之后,您可能会得到一些有时有效的东西。

您的时间可能花在其他地方会更好。

【讨论】:

  • 相关帖子是一个试图将符号重命名为不同长度的补丁。如果您不需要更改长度,那么大部分工作都应该是不必要的。
【解决方案2】:

看看LIEF,但尽量保持它们相同的长度

native_lib = 'my_native_lib.so'
lib = lief.parse(native_lib)
for x in lib.exported_symbols:
    if x.name == 'Java_com_example_abc':
        x.name = 'Java_com_foobarr_zzz'
lib.write(native_lib)  # overwrite

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-29
    • 2011-10-29
    • 2015-12-20
    • 2016-12-09
    • 2020-01-11
    • 2010-09-07
    • 2020-12-22
    • 2013-06-20
    相关资源
    最近更新 更多