我需要在Android APK中修改一个。 任务是将动态符号重命名为so(即函数名称)。
例如,从Java_com_example_abc _....更改为Java_com_yahoo_zzz _....
我尝试使用WinHex直接搜索并替换文本单词,apk启动错误。 似乎.hash部分也需要更新,但我不知道如何更新.hash部分。
我的问题是重命名动态符号的正确或可取的方法是什么?
我被困了3天,请帮助我,非常感谢你!
发现帖子可能有关系,但他没有给出替代解决方案。 https://sourceware.org/ml/binutils/2006-03/msg00266.html
答案 0 :(得分:1)
看看LIEF,但尽量让它们保持相同的长度
native_lib = 'my_native_lib.so'
lib = lief.parse(native_lib)
for x in lib.exported_symbols:
if 'Java' in x.name:
x.name = x.name.replace('Java_com_example_abc', 'Java_com_antani_zzz')
lib.write(native_lib) # overwrite
答案 1 :(得分:0)
我被困了3天,请帮助我,
您要实现的目标有效不可能。
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周时间来修复剩下的碎片。在那之后,你可能获得某种有时有用的东西。
你的时间可能更好地花在其他地方。