概述
在AndroidGotHook项目中,对于ARM64
架构,在重定位表中找不到目标符号,无法基于Segment
进行GOT Hook
。
通过打印日志,与readelf -r
的结果比对,最终发现,代码错误地解析了重定位表(将.rela.plt
处理为了.rel.plt
),导致偏移值查找失败。
查看git历史记录可知,Android
的linker
从5.0
(API等级21)开始支持DT_RELA
。使用宏USE_RELA
控制。
1 | // Android uses RELA for LP64. |
解决方案:ARM64
架构下使用elf64_rela
数据结构。
PS:也可以通过DT_PLTREL
来判断使用的是哪种重定位表。
相关数据结构
1 | typedef struct elf64_rel { |
修复
抄linker.cpp代码即可。
增加对DT_RELA
和DT_RELASZ
的处理,并使用宏定义进行条件判断,例如:
1 |
|
完整代码见AndroidGotHook