type
status
date
slug
summary
tags
category
icon
password
前言:
让GirlHook支持RPC
想要调用静态方法,很简单,和hook完成后传入参数一样,构造好args去invoke artmethod即可。但非静态方法需要this指针,这个很棘手。这里有三种方法:
- hook一次拿到this,缓存后用来RPC(不优雅 放弃)
- JVMTI获取全部实例(好用,aosp12+也能用,frida的方法,简单。但必定被检测)
- 遍历heap(本文重点)
通过研究frida的代码得知,frida在aosp12之前,直接使用visitobjects函数进行遍历。但是这一函数在高版本被内联了,所以不能直接调用了。
JVMTI
首先介绍一下jvmti,话不多说直接贴代码。获取jnienv之后,添加打标签的能力,遍历调用回调函数,给我们需要的实例打上标签。遍历完成后再取出。
缺点就是,只能在debug模式下用,release用不了。而我们通常都是注入别人的进程。参考这篇文章给出了解决方式,调用一些art的方法可以开启权限。据说抽取壳用不了,想必这种方法动静太大,也不适合我们做轻量hook框架的初衷——隐藏。
手动遍历
我们只需要关心VisitObjectsInternal的实现。可见它遍历了三个位置,分别是GetLiveBitmap(),allocation_stack_,和bump_pointer_space_
无论要做什么都要读取heap这个类其中的字段,先来想一想怎么快速拿到偏移。
1. 解析heap结构
从我们需要的字段附近入手

发现这里有一个const。它初始化的过程如下,经计算得出应为0x200000。
所以拿到偏移0x300,接下来一切在它附近进行操作即可。

后面还要操作gc,gc相关的字段乱七八糟的内容太多了,不一一解析了,直接复制出啦一个pad类,把region往后的都给覆盖就行了。前面的我就懒得搞了。
1. bitmap遍历
完成这一段,再来遍历object。先看livebitmap,这是最简单的一个。
直接读取字段即可。这两个bitmap的类型是这个
进一步获取ContinuousSpaceBitmap和LargeObjectBitmap类,都是spacebitmap用了不同模板
把spacebitmap类和里面的memmap都扣下来,魔改一下visit函数,把结果都压进vector就行
验证是否补对了,直接下断看其中的std::string都是不是对的就行了。然后把拿到的bitmap遍历一下。
遍历完了发现只有系统库类实例,没有我们需要的app的,还得接着看其他结构。
2. allocation stack
allocation stack和live stack结构都是一样的,可以一样进行遍历。属于是
accounting::AtomicStack
类型。也是魔改一下visit函数,直接遍历,每次增加4字节,也就是stackRefrence<mirror::object*>的大小。这里不引入这个结构。因为我们知道这是32位压缩指针。直接这么用就完事了。 不过依旧是没有app的类实例,看来还得接着看最后一个。
3. bump pointer space
这也是最难搞的一个,数据结构太复杂了。经过我慢慢的扣了很久,最终还是扣好了。特别要注意其中的虚函数,必须弄个假的让它产生一个虚函数表的位置,才能直接应用指针。如果多重继承,就是俩虚函数表,这个搞错了直接后面都乱了,我验证的方法还是看字符串。并且我这里把walk函数也修好了,但后续我发现完全可以不用walk函数。
如果不用walk,只需要自己遍历其中的bitmap即可。反正我们这样套结构体可以把字段都改成public,直接取出两个bitmap,和之前的bitmap一样遍历就行了。因为Walk我们没有它的mirror::object验证,用起来比较麻烦。
事实证明基本上只有mark里面有东西,但并不是一直有。只有活过GC的,才会出现在这里。那我们必须启动app等一次GC,才能找实例,这实在是不太好。所以强制触发一次GC。
RequestConcurrentGC被内联了,所以我们这里退而求其次用RequestConcurrentGCAndSaveObjectFn。这里可以直接用completed当计数器,测试了一段时间是完全没问题的。而且要求,必须要GC执行完了才继续,这样就可以把实例直接全都移动到bitmap,直接拿到。
- Author:Lynnette177
- URL:https://note.lynnette.uk/article/rpc_heapheapheap
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts