首页
社区
课程
招聘
[原创] friposed —— Write java hook with frida
发表于: 2020-6-7 17:37 7969

[原创] friposed —— Write java hook with frida

2020-6-7 17:37
7969

friposed = frida + xposed,字面意思,本来想借助 frida 实现一套完整的 xposed 支持,但由于代价实在太高,于是只能写一套简单的实现。

在 frida 可用时,使用 java 写 hook。

在2017年初,刚接触 frida 时,我就一直在吐槽 frida hook java 的反人类设计,并不是说 frida 项目不好,而是用 js 这种弱类型语言去描述和操作强类型的 java,在 js 里写 java hook 体验很差,本身就是不优雅的。(而且我那台手机用 frida 经常 crash。)

0202年已经过去一半了,不怎么使用 frida。看身边小伙伴在用 frida 而不是 xposed,感觉自己落伍了,不够 fashion,于是突发奇想写了这个项目,使用 frida 作为桥梁,提供在 java 里写 hook 的能力,从而让像我这样“半截入土”的 xposed 开发者仍然可以苟活在 frida 的环境里

并且对于仅拥有root、未拥有xposed的环境,提供了使用java hook的办法。

demo就是 friposed.apk 本身,实现对自己的 hook,可阅读配置文件来理解它assets/friposed.json

打开本项目里的安卓工程 com.leadroyal.friposed ,按需修改 assets/friposed.json,并且创建对应实现了 com.leadroyal.friposed.IHook的类。

开发自定义的 Hook(一定要实现 IHook这个接口)。提供基础功能:在beforeHookafterHook 对 arguments 进行读写,对 result 进行读写,从而实现XC_MethodHook,使用 setResult 实现 XC_MethodReplacement

使用 frida-cli 进行 attach 后,加载 com.leadoryal.friposed 这个 apk,访问内部的 assets/friposed.json 配置文件,寻找对应的 class 和 method进行 hook,依次执行这几步操作:

不安装 APP 来加载 friposed

friposed 会先访问 /data/local/tmp/friposed.apk,将 apk 文件放到该位置即可,也可以修js改代码的LOCAL_APK_PATH使用其他位置的 apk。

使用其他包名

修改 js 代码的FRIPOSED_PKGNAME使用其他包名作为 friposed 的入口,但一定要保证下面三个文件还存在,建议将friposed-api这个 gradle 项目打包带走:

这真的只是个小项目,是我第一个 frida 项目也应该是最后一个 frida 项目,因此请不要对它抱有过高的期望,有 bug 和需求请提出来。

https://github.com/LeadroyaL/friposed

 
 
package com.leadroyal.friposed;

import android.util.Log;

public class SimpleHook implements IHook {
    private static final String TAG = "SimpleHook";

    @Override
    public void beforeHook(ParamObj paramObj) {
        for (int i = 0; i < paramObj.args.length; i++) {
            if (paramObj.args[i] == null)
                Log.e(TAG, "args[" + i + "]=" + "null@null");
            else
                Log.e(TAG, "args[" + i + "]=" + paramObj.args[i] + "@" + paramObj.args[i].getClass());
        }
    }

    @Override
    public void afterHook(ParamObj paramObj) {
        Log.e(TAG, "return " + paramObj.getResult());
    }
}
> frida
[Redmi 8A::com.leadroyal.friposed]-> before invoked: func
original invoked: func
after invoked: func

> logcat
SimpleHook: args[0]=Click Me!@class java.lang.String
SimpleHook: args[1]=123@class java.lang.Integer
MainActivity: Click Me!    123
SimpleHook: return null
 [
   {
     "enable": true,
     "targetPackage": "com.leadroyal.friposed",
     "targetClassName": "com.leadroyal.friposed.MainActivity",
     "targetMethodSig": "func(java.lang.String,int)",
     "hookClassName": "com.leadroyal.friposed.SimpleHook"
   }
 ]
  • 不安装 APP 来加载 friposed

    friposed 会先访问 /data/local/tmp/friposed.apk,将 apk 文件放到该位置即可,也可以修js改代码的LOCAL_APK_PATH使用其他位置的 apk。

  • 使用其他包名

    修改 js 代码的FRIPOSED_PKGNAME使用其他包名作为 friposed 的入口,但一定要保证下面三个文件还存在,建议将friposed-api这个 gradle 项目打包带走:

    • com.leadroyal.friposed.ParamObj
    • com.leadroyal.friposed.IHook
    • assets/friposed.json

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

收藏
免费 2
支持
分享
最新回复 (4)
雪    币: 35
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
看了一下,js-java bridge是通过frida主动调用apk里的before hook和after hook实现的。

不过这样的话就感觉实用性不强啊。大家可能更需要在PC端写Java,然后自动注入到app里,而不是还得每次改hook代码都得打包个APK
2020-6-8 09:51
0
雪    币: 634
活跃值: (1503)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
半截入土+1
2020-6-8 10:19
0
雪    币: 4752
活跃值: (2923)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
winkar 看了一下,js-java bridge是通过frida主动调用apk里的before hook和after hook实现的。 不过这样的话就感觉实用性不强啊。大家可能更需要在PC端写Java,然 ...

你说的对,我设计的过于繁琐了。我这样做的原因是想模拟一下 xposed 的手感,思路被局限了。
直接用 Java 也是可以的,使用 javac 和 dx,然后用 adb push 或者 rpc 的方式做;目前能力有限,下一版就这样做哈,感谢建议!

最后于 2020-6-8 11:38 被LeadroyaL编辑 ,原因:
2020-6-8 11:35
0
雪    币: 634
活跃值: (1503)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
LeadroyaL winkar 看了一下,js-java bridge是通过frida主动调用apk里的before hook和after hook实现的。 不过这样的话就感 ...
你可以做个android studio模板来解决
2020-6-9 14:27
0
游客
登录 | 注册 方可回帖
返回
//