我想在反汇编程序项目中向用户显示这样的给定ELF文件的导入符号(#1)。(Android应用)

1d21a: f7fa e8e8 blx 173ec ; __android_log_print@plt ...


当前,我只能显示像这样(#2):

1d21a: f7fa e8e8 blx 173ec


要显示类似#1的数据,我听说我需要解析PLT或GOT或PLTGOT。但是我不知道如何使用它们显示函数名称。 (当然,我还不知道如何解析它)

我的理论方法是分解PLT并找到目标偏移量并执行一些操作。

示例;

     000173ec __android_log_print@plt:
     173ec:       e28fc600        add     ip, pc, #0, 12  ; ip!=pc?
     173f0:       e28cca11        add     ip, ip, #69632  ; addr of got? 
     173f4:       e5bcf9f4        ldr     pc, [ip, #2548]!; index=2548
         000173f8 sleep@plt:
     173f8:       e28fc600        add     ip, pc, #0, 12
     173fc:       e28cca11        add     ip, ip, #69632
     17400:       e5bcf9ec        ldr     pc, [ip, #2540]!
     ...


我认为我可以通过拆卸PLT来赚取#2548或#2540的价格,但没有信心。

有什么办法吗?解析PLT并在反汇编中显示类似#1的数据?

谢谢!

#1 楼

可从动态段PT_DYNAMIC获得此信息。这是结构ElfXX_Dyn的数组。您必须搜索DT_RELDT_RELA类型。
这是ElfXX_RelElfXX_Rela的数组。字段r_offset是GOT条目的偏移量。可以使用字段r_info检索名称。它包含ElfXX_Sym的索引。
您可能想使用外部库来执行此操作。