本帖最后由 behindeye 于 2021-2-28 13:18 编辑
做 xposed 插件的时候,经常会遇到通信的问题,其实这就涉及跨进程通信了,其实也就是多进程通信
通信方式
常用通信方式,当然有更好的方式记得评论
1.文件通信存储,将要存储的数据,写到一个公用的文件,读取数据,可行,欠缺灵活性
2.AIDL通信、Message,不方便插件使用,主要是 aidl 文件的问题
3.ContentProvider,不方便插件使用,还得搞数据库的代码
4.广播,可以很好的找到hook点,并且进行数据传输,适用插件形式
广播通信
这里主要介绍广播的形式进行通信
hook 点,直接找到 application 的 oncreate 方法,进行 hook,并注册广播,插件直接发生广播过去,就能把数据接收
XposedHelpers.findAndHookMethod(Application.class, "onCreate", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Application application = (Application) param.thisObject;
Ct = application;
Utils.init(application);
String currentProcessName = ProcessUtil.getCurrentProcessName(Ct);
// log("进程:" + currentProcessName);
IntentFilter filter = new IntentFilter("action_task");
filter.addAction("action_gorgon");
application.registerReceiver(mrev, filter);
}
});
案例
例如:一个 App 某个接口需要某个加密算法,可以把加密函数的参数发送广播过去,配合多线程的 wait、notify,可以很好的进行数据传输。解密完成之后,发送广播给插件App,这样可以不去分析加密函数的实现流程。如某音的:x-gorgon 算法(仅供学习分析使用)。
参考链接:https://bbs.pediy.com/thread-259906.htm
// 发送广播过去,告诉解密,并传参过去
Intent action_task = new Intent("action_xgorgon");
action_task.putExtra("url", url);
sendBroadcast(action_task);
synchronized (lock) {
while (gorgon == null) {
//子线程等待
lock.wait();
}
}
//解密完之后,发送广播回来接收
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("action_gorgon_resq")) {
gorgon = intent.getStringExtra("gorgon");
synchronized (lock) {
//通知子线程继续走下去
lock.notifyAll();
}
}
}
};
|