接上一篇,引入Xposed库,使模块生效:https://blog.csdn.net/weixin_42127613/article/details/81839002
现在开始实战Xposed框架的hook功能。
1、新建一个类MainXposed,用于Xposed框架的启动入口。这个类要实现Xposed框架的IXposedHookLoadPackage接口。如下图所示。
我们在这个类的实现方法中,输出当前的包名和进程名,以Xposed的日志形式进行输出。完成后,该类的源码如下。
package net.dalu2048.wechatgenius;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public final class MainXposed implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
XposedBridge.log("当前包名:" + lpparam.packageName + ",进程名:" + lpparam.processName);
}
}
2、加入Xposed框架的入口说明。
在项目中新建assets文件夹。在app文件夹上点击右键,新建文件夹,选择Assets Folder。如下图所示。
在assets文件夹中,新建文件,输入文件名:xposed_init。只能用这个文件名,是固定死的。Xposed框架就是通过这个文件名来寻找入口类。
打开文件,在其中只需要输入一个类名即可。一行一个,也可输入多个。一般我们也只用一个。
文件内容,输入一行:net.dalu2048.wechatgenius.MainXposed
3、运行测试。
现在编译运行,重启模拟器,打开Xposed installer,选择日志菜单,进行日志查看。
通过日志记录,可以看到编写的代码生效了,输出了系统的所有包名和进程。实际上是以进程为索引,Xposed都是hook的进程。如下图所示,可以看到微信的进程和包名。微信是多进程,所以看到有多次出现微信的包名。
最后,做一下过滤。由于我们只需要获取微信的消息,所以只需要hook微信进程即可。
加入判断,如果当前的进程为微信进程,那么继续;否则返回。很多类似代码都是进行包名的对比,由于微信是多进程,所以包名会出现多次,也就hook了多次。虽然影响不大,因为其他进程可能不会调用我们hook的方法,但毕竟不是最精确的做法。所以精确的做法,还是进行进程的对比。
微信的聊天消息,在主进程里面,我们只需要hook主进程即可。
修改后的MainXposed类代码如下。
public final class MainXposed implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (!lpparam.processName.equals("com.tencent.mm")){
return;
}
XposedBridge.log("进入微信进程:" + lpparam.processName);
}
}
编译、运行、重启后,打开Xposed日志,查看到只有一条日志记录,说明我们顺利的进入了微信进程。hook住了微信。
OK。至此,我们hook进入了微信的进程。
最后,源码提交github。项目地址是:https://github.com/dalu2048/WeChatGenius.git
下一篇,将实时获取到微信聊天消息,hook数据库插入操作:https://blog.csdn.net/weixin_42127613/article/details/81840536