看到论坛有人问如何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虚拟机自动化脱壳的方法