我需要修改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
看看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
10年更新:
请参阅下面的
patchelf
答案。
2013年的原始答案:
我被困了三天了,请帮助我,
您想要实现的目标是有效地不可能实现的。
ELF文件的内部结构很复杂,你想要做的事情需要你将其分解并重新组装各个部分。打个比方,将 Intel CPU 分解成晶体管,然后用它们重新组装 AMD CPU。
发现一个可能相关的帖子
它相关。引用:
基本上它会执行以下操作:
- 循环 .dynsym 并重新创建 .dynstr
- 从头开始重新创建 .hash 表
- 计算新的 lma/vma,新的内存布局(.dynstr 大小已更改!)
- 根据新布局修复.dynamic的内容
- 修复.rel.dyn
- 修复.rel.plt
- 再次修复.dynsym
- 写出新的章节内容
在copy_section中:排除重写的部分被复制。
目前它似乎创建了一个语法上有效的 ELF 文件,但作为 .plt 和 .got 之间的距离发生变化,相对寻址 .plt 已损坏。此外,.got 必须再次修复。
因此作者设法将一些看起来像 AMD CPU 的东西粘合在一起,但它不起作用。
当然,你可以再花 2 周的时间来了解作者做了什么,然后再花 3 周的时间来修复剩余的碎片。之后,您可能会得到有时有效的东西。
您的时间可能花在其他地方会更好。
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
如果发现问题,请提供反馈。谢谢!