首页
社区
课程
招聘
[原创]Frida实现okhttp3.Interceptor
发表于: 2019-6-21 23:25 34223

[原创]Frida实现okhttp3.Interceptor

2019-6-21 23:25
34223

https://bbs.pediy.com/thread-252100.htm
珍惜Any用xposed实现了okhttp3的Interceptor,我这里发一个frida实现okhttp3的Interceptor

用spawn方式启动app
frida -U --no-pause -f xxx -l hook.js

看看效果


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-7-4 23:12 被Imyang编辑 ,原因:
收藏
免费 10
支持
分享
最新回复 (23)
雪    币: 58
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
2019-6-24 14:21
0
雪    币: 386
活跃值: (1052)
能力值: ( LV9,RANK:145 )
在线值:
发帖
回帖
粉丝
3
java.lang.ClassNotFoundException: Didn\'t find class "okhttp3.MyInterceptor"
2019-7-1 18:22
0
雪    币: 6003
活跃值: (3490)
能力值: ( LV6,RANK:96 )
在线值:
发帖
回帖
粉丝
4
beimingyouyu java.lang.ClassNotFoundException: Didn\'t find class "okhttp3.MyInterceptor"
你用的frida是哪个版本,okhttp3.MyInterceptor是通过Java.registerClass注册的类,不是apk里面的
2019-7-2 11:11
0
雪    币: 2155
活跃值: (4532)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
测试没有效果 frida 最新的 12.6.9 版本
2019-7-3 09:54
0
雪    币: 386
活跃值: (1052)
能力值: ( LV9,RANK:145 )
在线值:
发帖
回帖
粉丝
6
发现是Android版本低的手机里frida会不能使用registerClass,不过换版本高点的手机试了之后同没效果
2019-7-4 15:42
0
雪    币: 6003
活跃值: (3490)
能力值: ( LV6,RANK:96 )
在线值:
发帖
回帖
粉丝
7
beimingyouyu 发现是Android版本低的手机里frida会不能使用registerClass,不过换版本高点的手机试了之后同没效果
我的手机系统是Android 8.1.0, 自己编译的AOSP。
用spawn方式启动app
frida -U --no-pause -f xxx -l hook.js
2019-7-4 23:11
0
雪    币: 24
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
大佬我想问一下为什么我用Java.cast进行数据类型转换都会报错,我本来是想把java.lang.Object转为[B但是失败了,然后我尝试string转为stirng也会报错,大佬这是什么情况啊
2019-7-27 15:57
0
雪    币: 6003
活跃值: (3490)
能力值: ( LV6,RANK:96 )
在线值:
发帖
回帖
粉丝
9
mb_gygeohyt 大佬我想问一下为什么我用Java.cast进行数据类型转换都会报错,我本来是想把java.lang.Object转为[B但是失败了,然后我尝试string转为stirng也会报错,大佬这是什么情况啊 ...
```
var ByteString = Java.use("com.android.okhttp.okio.ByteString");
ByteString.of(BufferObj.readByteArray()).hex()
```
如果你想打印byte[],可以使用ByteString转成hex的字符串
2019-7-29 09:32
0
雪    币: 204
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
大佬,为什么我执行注入hookjs成功了,但是没有回调消息的
2019-7-31 10:11
0
雪    币: 1110
活跃值: (281)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11

感谢大佬,在原来基础上略作修改,适配了多dex的情况

function hook_okhttp3(classLoader) {
    Java.perform(function () {
        var ByteString = classLoader.use("com.android.okhttp.okio.ByteString");
        var Buffer = classLoader.use("com.android.okhttp.okio.Buffer");
        var Interceptor = classLoader.use("okhttp3.Interceptor");
        var MyInterceptor = Java.registerClass({
            name: "okhttp3.MyInterceptor",
            implements: [Interceptor],
            methods: {
                intercept: function (chain) {
                    var request = chain.request();
                    try {
                        console.log("MyInterceptor.intercept onEnter:", request, "\nrequest headers:\n", request.headers());
                        var requestBody = request.body();
                        var contentLength = requestBody ? requestBody.contentLength() : 0;
                        if (contentLength > 0) {
                            var BufferObj = Buffer.$new();
                            requestBody.writeTo(BufferObj);
                            try {
                                console.log("\nrequest body String:\n", BufferObj.readString(), "\n");
                            } catch (error) {
                                try {
                                    console.log("\nrequest body ByteString:\n", ByteString.of(BufferObj.readByteArray()).hex(), "\n");
                                } catch (error) {
                                    console.log("error 1:", error);
                                }
                            }
                        }
                    } catch (error) {
                        console.log("error 2:", error);
                    }
                    var response = chain.proceed(request);
                    try {
                        console.log("MyInterceptor.intercept onLeave:", response, "\nresponse headers:\n", response.headers());
                        var responseBody = response.body();
                        var contentLength = responseBody ? responseBody.contentLength() : 0;
                        if (contentLength > 0) {
                            console.log("\nresponsecontentLength:", contentLength, "responseBody:", responseBody, "\n");

                            var ContentType = response.headers().get("Content-Type");
                            console.log("ContentType:", ContentType);
                            if (ContentType.indexOf("video") == -1) {
                                if (ContentType.indexOf("application") == 0) {
                                    var source = responseBody.source();
                                    if (ContentType.indexOf("application/zip") != 0) {
                                        try {
                                            console.log("\nresponse.body StringClass\n", source.readUtf8(), "\n");
                                        } catch (error) {
                                            try {
                                                console.log("\nresponse.body ByteString\n", source.readByteString().hex(), "\n");
                                            } catch (error) {
                                                console.log("error 4:", error);
                                            }
                                        }
                                    }
                                }

                            }

                        }

                    } catch (error) {
                        console.log("error 3:", error);
                    }
                    return response;
                }
            }
        });
        var ArrayList = classLoader.use("java.util.ArrayList");
        var OkHttpClient = classLoader.use("okhttp3.OkHttpClient");
        console.log(OkHttpClient);
        OkHttpClient.$init.overload('okhttp3.OkHttpClient$Builder').implementation = function (Builder) {
            console.log("OkHttpClient.$init:", this, Java.cast(Builder.interceptors(), ArrayList));
            this.$init(Builder);
        };

        var MyInterceptorObj = MyInterceptor.$new();
        var Builder = classLoader.use("okhttp3.OkHttpClient$Builder");
        console.log(Builder);
        Builder.build.implementation = function () {
            this.interceptors().clear();
            //var MyInterceptorObj = MyInterceptor.$new();
            this.interceptors().add(MyInterceptorObj);
            var result = this.build();
            return result;
        };

        Builder.addInterceptor.implementation = function (interceptor) {
            this.interceptors().clear();
            //var MyInterceptorObj = MyInterceptor.$new();
            this.interceptors().add(MyInterceptorObj);
            return this;
            //return this.addInterceptor(interceptor);
        };

        console.log("hook_okhttp3...");
    });
}

Java.perform(function() {
    var application = Java.use("android.app.Application");
    application.attach.overload('android.content.Context').implementation = function(context) {
        var result = this.attach(context); // 先执行原来的attach方法
        var classloader = context.getClassLoader(); // 获取classloader
        Java.classFactory.loader = classloader;
        hook_okhttp3(Java.classFactory);
    }

});
2019-9-24 16:04
2
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
hook okhttp的目的是把数据包 转移到其他地方进行管理嘛。这样 平常进行的协议分析就被简化了??
2019-10-14 11:05
0
雪    币: 54
活跃值: (705)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
Error: java.lang.ClassNotFoundException: Didn't find class "okhttp3.Interceptor" on path:
为啥会找不到interceptor呢
2019-11-15 15:58
0
雪    币: 445
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
fishso 感谢大佬,在原来基础上略作修改,适配了多dex的情况 ``` function hook_okhttp3(classLoader) { Java.perform(function () ...
使用你的这个版本确实可以多dex跑,但是writeTo(BufferObj)的 时候,Buffer和BufferSkin分到了不同的dex,获取request的body异常,怎么解决?我试着dexclassloder,但是一直失败,望帮一下
2020-3-7 16:55
0
雪    币: 5235
活跃值: (3260)
能力值: ( LV10,RANK:175 )
在线值:
发帖
回帖
粉丝
15
支持大佬 先mark一下
2020-3-8 09:45
0
雪    币: 114
活跃值: (601)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
IMZCF 使用你的这个版本确实可以多dex跑,但是writeTo(BufferObj)的 时候,Buffer和BufferSkin分到了不同的dex,获取request的body异常,怎么解决?我试着dexcl ...
console.log("\nrequest-a body String:\n", responseBody.string(), "\n");   request的body异常 这样解析
2020-7-6 21:10
0
雪    币: 319
活跃值: (626)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
支持大佬 先mark一下
2020-7-6 22:14
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
hook_okhttp3... 
然后就没了
2020-7-14 19:56
0
雪    币: 3212
活跃值: (753)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
error 2: Error: writeTo(): argument types do not match any of:
        .overload('okio.BufferedSink')
2020-8-1 18:29
0
雪    币: 1597
活跃值: (1099)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
20
万里星河 hook_okhttp3... 然后就没了
me too
2022-8-3 16:33
0
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21
支持大佬 先mark一下
2023-6-5 01:11
0
雪    币: 3114
活跃值: (30886)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
mark
2023-6-5 09:26
1
雪    币: 2467
活跃值: (1761)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
mark
2024-7-31 09:58
0
雪    币: 1390
活跃值: (2913)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
感谢分享
2024-7-31 10:34
0
游客
登录 | 注册 方可回帖
返回
//