type
status
date
slug
summary
tags
category
icon
password
😀
前言: 让GirlHook支持RPC
想要调用静态方法,很简单,和hook完成后传入参数一样,构造好args去invoke artmethod即可。但非静态方法需要this指针,这个很棘手。这里有三种方法:
  1. hook一次拿到this,缓存后用来RPC(不优雅 放弃)
  1. JVMTI获取全部实例(好用,aosp12+也能用,frida的方法,简单。但必定被检测)
  1. 遍历heap(本文重点)
通过研究frida的代码得知,frida在aosp12之前,直接使用visitobjects函数进行遍历。但是这一函数在高版本被内联了,所以不能直接调用了。

JVMTI

首先介绍一下jvmti,话不多说直接贴代码。获取jnienv之后,添加打标签的能力,遍历调用回调函数,给我们需要的实例打上标签。遍历完成后再取出。
缺点就是,只能在debug模式下用,release用不了。而我们通常都是注入别人的进程。参考这篇文章给出了解决方式,调用一些art的方法可以开启权限。据说抽取壳用不了,想必这种方法动静太大,也不适合我们做轻量hook框架的初衷——隐藏。

手动遍历

手动遍历art的数据结构,尝试找到所有实例。我们需要看一下visitobjects是怎么实现的。代码在runtime / gc / heap-visit-objects-inl.h
我们只需要关心VisitObjectsInternal的实现。可见它遍历了三个位置,分别是GetLiveBitmap(),allocation_stack_,和bump_pointer_space_
无论要做什么都要读取heap这个类其中的字段,先来想一想怎么快速拿到偏移。

1. 解析heap结构

从我们需要的字段附近入手
notion image
发现这里有一个const。它初始化的过程如下,经计算得出应为0x200000。
所以拿到偏移0x300,接下来一切在它附近进行操作即可。
notion image
后面还要操作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,直接拿到。
tersafe写一个Android Hook小框架
Loading...
Lynnette177
Lynnette177
建议开着梯子访问站点。图片是直接从Notion获取的,不开梯子容易看不见图片。
Latest posts
tersafe
2025-8-13
iOS典型反调反越狱app分析
2025-7-28
RPC:遍历android的所有java实例
2025-7-17
写一个Android Hook小框架
2025-6-23
一些macos常用软件破解记录
2025-6-22
iOS网易新闻登录算法逆向
2025-6-22
Announcement
🎉2024.6.9 上线🎉