0%

ARM64 GOT Hook中对.rela.plt的处理

概述

AndroidGotHook项目中,对于ARM64架构,在重定位表中找不到目标符号,无法基于Segment进行GOT Hook

通过打印日志,与readelf -r的结果比对,最终发现,代码错误地解析了重定位表(将.rela.plt处理为了.rel.plt),导致偏移值查找失败。

查看git历史记录可知,Androidlinker5.0(API等级21)开始支持DT_RELA。使用宏USE_RELA控制。

linker_common_types.h#38

1
2
3
4
// Android uses RELA for LP64.
#if defined(__LP64__)
#define USE_RELA 1
#endif

解决方案:ARM64架构下使用elf64_rela数据结构。

PS:也可以通过DT_PLTREL来判断使用的是哪种重定位表。

相关数据结构

1
2
3
4
5
6
7
8
9
10
typedef struct elf64_rel {
Elf64_Addr r_offset;
Elf64_Xword r_info;
} Elf64_Rel;

typedef struct elf64_rela {
Elf64_Addr r_offset;
Elf64_Xword r_info;
Elf64_Sxword r_addend;
} Elf64_Rela;

修复

linker.cpp代码即可。

增加对DT_RELADT_RELASZ的处理,并使用宏定义进行条件判断,例如:

1
2
3
4
5
#if defined(__LP64__)
rela_plt = (ELFW(Rela) *) (moduleBase + dyn.d_un.d_ptr);
#else
rel_plt = (ELFW(Rel) *) (moduleBase + dyn.d_un.d_ptr);
#endif

完整代码见AndroidGotHook