首页
社区
课程
招聘
[原创]浅析Frida Hook Android时的数据类型
发表于: 2020-7-30 21:49 16483

[原创]浅析Frida Hook Android时的数据类型

2020-7-30 21:49
16483

frida被常用于android应用测试中,很多时候要对应用中的java代码进行hook,此时,常用的对象就是内置的Java对象,各种操作离不开这个内置对象,但是,除了官方网站的javascript API外,关于它的文档并不多。

该对象实质对应的代码在这个项目中:https://github.com/frida/frida-java-bridge/

在对java对象进行操作时,我们可以直接使用javascript中的数据类型,这方便了不少工作。然而有人会好奇,这是怎么实现的呢?

本文将对frida-java-bridge的数据类型封装进行简单的分析。

frida-java-bridge中对于对象类型的处理位于type.js

type来完成对象实例和js对象的转换,有两个函数:fromJnitoJni,负责将对象在内存中的值和js中的值进行转换。在对对象进行操作,或者涉及函数调用的参数和返回值等时,转换会被调用。

比如说在hook到方法调用,转交给设置的implementation时,会这么处理

再比如说在主动调用某个方法时,会这么处理

我们再来看type中进行的对象转换,举个例子:

再看一些基本类型:

可见frida-java-bridge在调用前后对于javascript对象进行了双向的处理,以便符合JNI调用的格式。

另外,一个方法的各类信息被保存在它的_p属性中,如果要获取某个方法的参数类型和返回值类型,那么可以使用以下代码:

如果要获取某个指定Class的类型来做转换,那么可以通过Java._getType(typeName)来获得

一般情况下,这些数据类型转换的封装极大的方便了代码的编写,但是在一些容易被忽略的角落里,这些数据类型与Java中的数据类型并不一致,这就带来了一些诡异的坑。

比如,我们知道在java中,对象数组也被认为是java.lang.Object对象。然而,在frida-java-bridge中并不是。当你尝试去做类型转换,并把对象数组塞到一个接受Object类型的函数中去时,你会发现,类型转换居然失败了。

因为java.lang.Object的type是这样的:

而一个js数组对象是没有.$h的,于是你会得到莫名其妙的报错。而Java.cast时会检查isCompatible,结果还是因为同样的原因,报错,没有办法进行转换。坑,frida认为对象数组不是对象……

所以……怎么做呢,只有找到对象数组对应的type,做一次toJni,然后再用目标类型的type,做一次fromJni,比如说我在XposedFridaBridge中做的:


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 8
支持
分享
最新回复 (9)
雪    币: 144
活跃值: (335)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢分享
2020-7-31 19:03
0
雪    币: 3907
活跃值: (5817)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
3
env.js与jni也并不一致,康康源码自己比对下就好。
https://github.com/frida/frida-java-bridge/blob/master/lib/env.js
2020-8-2 13:43
0
雪    币: 482
活跃值: (1007)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
感谢大佬,调试frida的时候经常会遇到.$h的问题,.$h这个指的是什么呢?
2020-8-3 11:18
0
雪    币: 634
活跃值: (1503)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
Lateautumn4 感谢大佬,调试frida的时候经常会遇到.$h的问题,.$h这个指的是什么呢?
应该是对象在内存里的值,非基本对象的话是个对象ref的指针。
不知道这么说是否正确,我是这么理解的。
2020-8-3 11:50
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看不懂 fromJni 和toJni做了啥 返回值是啥呀
2020-12-4 14:55
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7

在用frida hook方法时,argTypes 怎么获取的呢,可以告知一下吗?

最后于 2022-1-23 22:17 被玖漏魚编辑 ,原因:
2022-1-23 22:16
0
雪    币: 8
活跃值: (519)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
真牛逼,3年前的文章解决了我的问题
2023-4-21 15:28
0
雪    币: 10
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
想问下楼主frida怎么把不同的线程的堆栈接起来呢
2024-1-7 20:55
0
雪    币: 357
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
wx_星星_234 在用frida hook方法时,argTypes 怎么获取的呢,可以告知一下吗?
大佬,解决了,我也想知道,该怎么获取argstype的类型
2024-4-4 13:53
0
游客
登录 | 注册 方可回帖
返回
//