实现Android ARM64平台下Inline Hook框架

53941人阅读 评论(1) 收藏 举报
分类:

        Android阵营新出机型的cpu基本都是64位了,虽然可以向下兼容armeabi-v7a,但是使用32位的so毕竟不能充分发挥64位cpu的潜力,所以以后arm64-v8a用的会越来越多。但是整个安卓生态圈似乎还没有开源发布的ARM64内联HOOK方案,所以自己动手写了个,姑且取名And64InlineHook吧,需要注意的是仍然是Alpha版。

        关于Inline Hook的背景知识这里不再阐述,我仅支持了相对简单的函数首指令改写方案,原则上也支持函数任意位置HOOK(需自行处理堆栈),不支持短函数,也暂不支持AArch32 state。

        由于arm64-v8a指令集都是固定的32位,指令地址也因而是4字节对齐,相比变长指令处理起来会相对容易,但是没办法直接操作PC寄存器,A64处理跳转起来会比A32和T32繁琐。

        首先是计算需要覆盖的指令数,我的方案是计算目标函数和转接函数的距离,然后决定是使用 B直接转跳 还是 BR寄存器绝对转跳,其中B只会影响一条指令,是比较优的路径,但是它的转跳范围不能超过0b00001111111111111111111111111100;BR需要占用4-5条指令(就我目前的方案而言,即把地址直接写在代码里),因为我们需要设法把地址加载到寄存器,这就需要类似下面的操作,然后为什么是5条指令?因为对于LOAD操作我们需要考虑内存对齐,于是可能需要一条额外的NOP指令来填充。

0x00000000  LDR X, #0x4
0x00000004  BR X
0x00000008  DCD ...
0x0000000C  DCD ...
        上面X是64位寄存器,显而易见这会造成寄存器污染,所以我们需要挑一个尽可能不被使用的寄存器,也就不需要去设法保护它,这里我选了X17,其实X16也行。

        接着就是重头戏指令修复。把覆盖掉的指令一条条复制到我们的跳板Trampoline里,并对所有含PC-relative address操作数的指令进行重定位。至于哪些指令需要被修复,你可以查阅armv8a指令手册(我上传了份从ARM官网下载的pdf,应该是最新修订的,http://download.csdn.net/download/rrrfff/9992241) 或者 在线文档http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.100069_0608_00_en/index.html

         大概有以下几类指令,分别由__fix_branch_imm、__fix_cond_comp_test_branch、__fix_loadlit、__fix_pcreladdr完成具体修复,具体可以去看源码,不过可能会比较乱,当然了这玩意后期基本不需要什么维护,也别想着以后ARM128还能用:

// branch_imm
b
bl
// compbranch
cbz
cbnz
// condbranch
b.c
// loadlit
ldr
ldr
ldrsw
prfm
// pcreladdr
adr
adrp
// testbranch
tbz
tbnz
// condbranch
beq
bne
bcs
bhs
bcc
blo
bmi
bpl
bvs
bvc
bhi
bls
bge
blt
bgt
ble
        其中值得一提的大概有几点,一是__fix_loadlit,因为涉及到LOAD操作,自然要考虑内存对齐,然而LOAD的目的寄存器可能是32、64甚至128位,所以需要考虑的情形就有3种;二是对于BL这种带链接跳转,如果转化成BR需要先把返回地址写到LR(X30)里;此外就是代码中引用的地址可能就在我们覆盖的范围内,这种情况很少,但是还是简单处理了下,对相应地址进行了修复,参考process_fix_map。

查看评论

Arm Inline hook的简易原理图

Arm架构下有arm指令和thumb指令之分,不同指令集的hook过程不一样。 假设我们要hook libc.so中的execv和read函数,android系统的库应该都加了-mthumb-inte...
  • beyond702
  • beyond702
  • 2016-05-16 16:55:52
  • 2546

Android Arm Inline Hook

什么是Inline Hook Inline Hook即内部跳转Hook,通过替换函数开始处的指令为跳转指令,使得原函数跳转到自己的函数,通常还会保留原函数的调用接口。与GOT表Hook相比,Inli...
  • hgl868
  • hgl868
  • 2017-04-27 09:04:57
  • 901

android inline hook 学习笔记

hook种类 GOT表hook,通过更改GOT表offset来实现hook inline hook,即内部跳转hook,替换函数开始处的地址为跳转指令,跳转到hook函数比较而言, 1.GOT表对于...
  • qq_29343201
  • qq_29343201
  • 2016-11-13 19:56:32
  • 1017

linux arm和x86 inline hook技术

Suterusu Rootkit: Inline Kernel Function Hooking on x86 and ARM Posted on January 7, 2013 Tabl...
  • fanlilei
  • fanlilei
  • 2015-11-18 16:43:01
  • 1375

实现Android ARM64平台下Inline Hook框架

Android阵营新出机型的cpu基本都是64位了,虽然可以向下兼容armeabi-v7a,但是使用32位的so毕竟不能充分发挥64位cpu的潜力,所以以后arm64-v8a用的会越来越多。但是整个安...
  • rrrfff
  • rrrfff
  • 2017-09-23 21:00:02
  • 53941

Android <em>Inline</em> <em>Hook</em>原理图

android <em>inline</em> <em>hook</em> 学习笔记 Android <em>Hook</em>框架adbi的分析(3)---编译和<em>inline</em> <em>Hook</em>实践 Android <em>Arm</em> <em>Inline</em> <em>Hook</em> 上传资源 jltxgcy 关注 积分721 查看全部...
  • 2018年04月18日 00:00

Android Hook框架adbi的分析(2)--- inline Hook的实现

一、 Android Hook框架adbi源码中inline Hook实现部分的代码结构 Android Hook框架adbi源码中inline Hook部分的实现代码结构示意图如下所示,hija...
  • QQ1084283172
  • QQ1084283172
  • 2017-07-09 12:16:04
  • 2193

Android Inline Hook原理图

  • 2016年08月13日 17:54
  • 2.12MB
  • 下载

Android Arm Inline Hook

http://ele7enxxh.com/Android-Arm-Inline-Hook.html 本文将结合本项目的源代码,详细阐述Android Arm Inline Hook的...
  • mergerly
  • mergerly
  • 2017-04-24 20:18:17
  • 473

完美支持64&32位InlineHook,C语言,C++类 都有

  • 2014年09月17日 13:57
  • 6KB
  • 下载
    最新评论