关闭

实现Android ARM64平台下Inline Hook框架

49143人阅读 评论(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。

0
0
查看评论

Android 中arm64-v8a、armeabi-v7a、armeabi、x86简介~

LZ是一名96年Android小生,从14年9月培训出来到现在,差不多俩年多的时间,由于一些原因,没能好好把技术提升一下,实乃不该啊。 了解起因昨天师傅问,你知道这俩个是什么么?有什么作用么?(如下图所示) 现在还记得我那一脸蒙比的样子,诺诺的回答不晓得。师傅说这个是为了兼容一些手机,(此处省略滔...
  • u012400885
  • u012400885
  • 2016-10-25 16:19
  • 7782

arm指令集 - 从汇编开始

特点:Load / Store结构(存储器操作仅包括load和store,所有其他操作在寄存器中完成)32位固定指令宽度3地址指令格式(即两个源操作数和结果寄存器都独立指定)每条指令都条件执行可在单周期执行的单条指令内同时完成一项普通以为操作和一项普通ALU操作自动变址功能寄存器模型用户模式下R1-...
  • qqbeifeng
  • qqbeifeng
  • 2009-09-08 12:04
  • 8321

ARM指令集 和 条件执行 详解

算术和逻辑指令 ADC : 带进位的加法 (Addition with Carry) ADC{条件}{S} , , dest = op_1 + op_2 + carry ADC 将把两个操作数加起来,并把结果放置到目的寄存...
  • pipisorry
  • pipisorry
  • 2014-04-07 10:57
  • 2233

ARM指令集 和 条件执行 详解

<br />ARM指令集详解(超详细!带实例!) 算术和逻辑指令ADC : 带进位的加法<br />(Addition with Carry)ADC{条件}{S} <dest>, <op 1>, <op 2> ...
  • HumorRat
  • HumorRat
  • 2010-11-28 16:35
  • 7047

Android平台arm64 ptrace hook bridge_code debug

参考文档: http://blog.chinaunix.net/uid-20361370-id-1962528.html 共享库注入–injectso实例 http://www.aiuxian.com/article/p-1295924.html Android平台的 Ptrace, 注入,...
  • azfa123
  • azfa123
  • 2016-03-04 17:09
  • 933

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

一、 Android Hook框架adbi源码中inline Hook实现部分的代码结构 Android Hook框架adbi源码中inline Hook部分的实现代码结构示意图如下所示,hijack代码部分是前面的博客中提到的root下Android跨进程注入so的注入工具,instrumen...
  • QQ1084283172
  • QQ1084283172
  • 2017-07-09 12:16
  • 1889

ARM指令CMP详解

1、加减指令     add  r1, r2, #1    /*r1 = r2 + 1 */     sub  r1, r2, #1    /*r1 = r2 - 1 */ 2、adr指...
  • zhouqt
  • zhouqt
  • 2017-10-07 22:49
  • 621

ARM指令集详解(超详细!带实例!)

算术和逻辑指令 ADC : 带进位的加法 (Addition with Carry) ADC{条件}{S}  , ,              ...
  • dddxxxx
  • dddxxxx
  • 2015-07-29 17:02
  • 16049

Android Inline Hook

0x00 Android Inline Hook    Inline Hook即内部跳转Hook,通过替换函数开始处的指令为跳转指令,使得原函数跳转到自己的函数,通常还会保留原函数的调用接口。与GOT表Hook相比,Inline Hook具有更广泛的适用性,几乎可以Hook任何函...
  • jltxgcy
  • jltxgcy
  • 2016-08-13 17:58
  • 2273

Android6.0 X86 ARM64位可用的注入Inject

最近在网上搜索Android的Inject与Hook,发现很多都因为时间久远而失效了,试了很多方案,最终找到了一个,特地来转载分享一下,本人的三星S6 6.0.1系统测试可用,另外4.2 4.4也都测试通过。 另外加上了注释便于大家理解。 转自 http://blog.csdn.net...
  • ganyao939543405
  • ganyao939543405
  • 2016-09-19 12:05
  • 3108
    联系作者
    通过QQ与我联系(全天候7*24小时基本不在线)
    最新评论
    免责声明
    如果转载的文章侵犯了您的版权,请务必告知,我将立刻删除;
    博客所有文章允许转载,原创类不要求注明出处,随意就好;
    如果是转载的文章,建议直接转载原始来源,因为原作者极可能有更新