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

时间:2013-12-10 10:40:53

标签: android arm reverse-engineering elf apk

我需要在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

2 个答案:

答案 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。

  

发现可能相关的帖子

相关。引用:

  

基本上它执行以下操作:

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

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

         

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

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

当然,您可以再花2周的时间来了解作者的所作所为,然后再花3周时间来修复剩下的碎片。在那之后,你可能获得某种有时有用的东西。

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