hook种类
- GOT表hook,通过更改GOT表offset来实现hook
inline hook,即内部跳转hook,替换函数开始处的地址为跳转指令,跳转到hook函数
比较而言,
1.GOT表对于本so文件中不经过GOT表
2.dlsym来调用的函数不经过GOT表
android inline hook
难点
- ARM模式和Thumb存在区别,不像x86,需要区分处理.
- 跳转指令如何构造
- 替换函数的逻辑
- 指令修改之后如何修正
ARM和thumb的区别
ARM在V4之前没有THUMB指令,V4时无法切换,到V5开始可通过BX和BLX进行切换,而V6版本增加了THUMB2指令. THUMB使用2个字节,而THUMB2指令使用4个字节,ARM指令也是使用4个字节.
跳转指令构造
- 通过跳转指令进行跳转,比如有B,BL,BX和BLX
- 通过改写PC寄存器进行跳转
ARM的B和BL指令格式
B格式:
31——–28|27——–24|23———————————-0
—-条件—–|1–0—1—-0|———— 24位立即数
BL格式:
31———28|27——–24|23———————————0
—-条件——|1–0—1—-0|———— 24位立即数
1.由于ARM指令4位对齐,低两位为0,再除去符号位,所以可表示的跳转地址为2^(24+2-1) = 土32M 范围.
2,imm24_offset = ((destAddr - (curAddr + 8) >> 2)) & 0x00ffffff