在没有 elf.h 的 ELF 文件的 PLT 中枚举(名称、地址)

逆向工程 安卓 手臂 小精灵 反汇编者 血小板
2021-06-16 09:25:54

我想在反汇编项目中向用户显示给定 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_Relor的数组ElfXX_Rela该字段r_offset是 GOT 条目的偏移量。并且可以使用字段检索名称r_info它包含 的索引ElfXX_Sym您可能想使用外部库来做到这一点。