首页
社区
课程
招聘
[原创]Xposed callMethod 如何传入接口参数
2020-1-7 17:52 11279

[原创]Xposed callMethod 如何传入接口参数

2020-1-7 17:52
11279

看到论坛有人问如何hook接口类参数 我这里总结分享一下

 

Xposed有时候我们遇上方法调用方法需要传入接口作为参数,由于无法直接 newInstance 生成接口类。一般我们有两种方法

 

1.靠别人实现---查看是否有接口的实现类
2.靠自己实现---使用动态代理实现接口

代码示例

被 hook的app代码

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onResume() {
        super.onResume();
    }

    public void getData(okhttp3.Callback callback){
        Request.Builder builder = new Request.Builder();
        builder.url("https://www.baidu.com/");
        builder.get();
        ApiClient.getOkHttpClientInstance().newCall(builder.build()).enqueue(callback);
    }

    public static class OkCallBack implements Callback {

        @Override
        public void onFailure(Call call, IOException e) {

        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            LogXUtils.e(response.body().string());
        }
    }
}

hook代码

方案1

已有实现类 OkCallBack 直接使用

 Class cls = XposedHelpers.findClassIfExists("com.huruwo.app.MainActivity$OkCallBack", loadPackageParam.classLoader);
Object callback = XposedHelpers.newInstance(cls);
XposedHelpers.callMethod(activity,"getData", callback);

非常简单 但是有个缺点就是要得到数据 还要hook OkCallBack 的 onResponse 函数

 XposedHelpers.findAndHookMethod(cls, "onResponse", XposedHelpers.findClassIfExists("okhttp3.Callback", loadPackageParam.classLoader), XposedHelpers.findClassIfExists("okhttp3.onResponse", loadPackageParam.classLoader), new XC_MethodHook() {
                                   @Override
                                   protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                                       super.beforeHookedMethod(param);
                                           Object res = args[1];
                                           LogXUtils.e((String) XposedHelpers.callMethod(XposedHelpers.callMethod(res,"body"),"string"));
                                   }

                                   @Override
                                   protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                                       super.afterHookedMethod(param);
                                   }
                               });

方案2 动态代理自己实现接口

Class cls = XposedHelpers.findClassIfExists("okhttp3.Callback", loadPackageParam.classLoader);
                               Object callback =  Proxy.newProxyInstance(loadPackageParam.classLoader, new Class[]{cls}, new InvocationHandler() {
                                   @Override
                                   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                                       //如果不需要 没必要实现
                                       if(method.getName().equals("onResponse")){
                                           Object res = args[1];
                                           LogXUtils.e((String) XposedHelpers.callMethod(XposedHelpers.callMethod(res,"body"),"string"));
                                       }
                                       return null;
                                   }
                               });

                               XposedHelpers.callMethod(activity,"getData", callback);

总结

如果实现方法简单,我更倾向于第二种方案,调用流程清晰。


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞1
打赏
分享
最新回复 (9)
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
BGM 2020-1-7 20:21
2
0
没看太懂,我一般就是直接用反射加socket
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
linglonger 2020-4-4 03:18
3
0
111
雪    币: 239
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_落雪年华 2020-6-9 14:07
4
0

下面发个例子,楼主看下这种场景如何处理回调

最后于 2020-6-9 14:13 被wx_落雪年华编辑 ,原因: 贴上代码例子
雪    币: 239
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_落雪年华 2020-6-9 14:11
5
0
public abstract class Fox{
    public abstract void fetch();
    public abstract onResponse(Call call, Response response)

}

Object foxCallback = Proxy.newProxyInstance(classLoader, new Class[]{Fox.class}, h);

碰上回调类是抽象类的时候没办法动态代理实现接口呢,应该没办法了吧
雪    币: 906
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ZvLoveL 2020-6-9 15:31
6
0
通过jdk动态代理处理这情况,确实妙
雪    币: 1867
活跃值: (3703)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
virjar 1 2020-6-9 16:23
7
0
wx_落雪年华 public abstract class Fox{ public abstract void fetch(); public abstract onResponse(Call c ...
这种dexmaker一样可以搞
雪    币: 239
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_落雪年华 2020-6-10 23:20
8
0
用的xposed loadClass("xxx.xxx") 获取到抽象类利用dexmaker还是无法代理抽象类,javassist ProxyFactory也试过不行,请教下你有什么好方法可以代理
雪    币: 494
活跃值: (157724)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
伟叔叔 2021-1-21 17:47
9
0
小黄鸭牛逼,感谢小黄鸭
雪    币: 1708
活跃值: (4012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小黄鸭爱学习 2021-4-1 10:24
10
0
wx_落雪年华 public abstract class Fox{ public abstract void fetch(); public abstract onResponse(Call c ...
抽象类的论坛里已经有解决方案了 就是自定义一个实现类合到目标dex里面去。具体的你搜索一下
游客
登录 | 注册 方可回帖
返回