如何重命名arm elf .so文件中的动态符号?

问题描述 投票:0回答:3

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

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

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

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

我被困了三天了,请帮助我,非常感谢!

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

android arm reverse-engineering elf apk
3个回答
4
投票

看看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

1
投票

10年更新:

请参阅下面的

patchelf
答案


2013年的原始答案:

我被困了三天了,请帮助我,

您想要实现的目标是有效地不可能实现的。

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. 写出新的章节内容

在copy_section中:排除重写的部分被复制。

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

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

当然,你可以再花 2 周的时间来了解作者做了什么,然后再花 3 周的时间来修复剩余的碎片。之后,您可能会得到有时有效的东西。

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


1
投票

Patchelf 中添加了更改共享库中名称的功能:https://github.com/NixOS/patchelf/commit/da035d6acee1e5a608aafe5f6572a67609b0198a

应该会在下一个版本(0.17.2 之后)中提供。同时,您可以按照 https://github.com/NixOS/patchelf#compiling-and-testing

中的说明构建该工具

要使用它,请创建一个每行具有两个名称(旧的和新的)的映射文件,并使用以下命令调用 Patchelf:

$ patchelf --output libPatched.so --rename-dynamic-symbols map_file libOriginal.so

如果发现问题,请提供反馈。谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.