环境和工具 :
模拟器:雷电 4.0.43版本
安卓版本:7.1.2 x86
Xposed :xposed-installer-3-1-5
反编译根据:jadx,Android killer
基于上偏文章 继续学习 XP
模拟器 安装 对应的 apk应用,随便输入账号密码,点击登录,提示 “账号错误,请重新输入”
“账号错误,请重新输入” 就从这切入,使用 jadx 打开 apk文件,全局搜索 这个提示文字
可以搜索到结果,同时可以看到 login 的方法
login(String user, String pwd) user 是获取输入的账号,pwd 是获取输入的密码
我们写个 XP 插件就获取 自己输入的账号和密码 ,并打印日志
分析找到 逻辑的函数,和我们需要的目标函数后,就开始写 xp 插件(上一篇的demo直接用了)
XposedHelpers.findAndHookMethod XP框架的api,看名字应该就知道 意思,获取指定hook的方法
根据方法的参数 传入对应的参数即可
编写一个 简易的 XP hook 插件,指定一个应用,hook 该应用的 login 方法 ,并打印日志
获取指定方法的报名的方式:
# 第一种 :获取 手机展示页面的 活动页面,可以看到包名
adb shell dumpsys activity top
# 第二种:直接模糊搜索 包名 q 是包名包含的字母
adb shell pm list packages | grep q
// 判断 当前的 启动的模板程序是否是 需要hook的 应用,这里要知道 应用的报名
// 如果不判断指定 报名 启动 插件的话,打开所有的应用都会 启动插件,就会保存,其他的应用 不一定用这个指定方法
if(loadPackageParam.packageName.equals("com.qianyu.helloworld")) {
// hook 方法 普通方法 静态方法
XposedHelpers.findAndHookMethod(
"com.qianyu.helloworld.LoginActivity", // 指定加载类,包名+类名
loadPackageParam.classLoader, // 类加载器
"login", // 指定hook的方法
String.class, String.class, // 指定hook的方法的参数列表,参数类型.class
new XC_MethodHook() {
@Override // 执行指定方法之前 要做的操作,就可以在这个方法里面 写逻辑
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
// param.args 方法的 传入参数
XposedBridge.log("args1: " + param.args[0]);
XposedBridge.log("args2: " + param.args[1]);
}
@Override // 执行指定方法之后 要做的操作,就可以在这个方法里面 写逻辑
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
// 在 执行 方法之后,获取方法的返回值 param.getResult()
XposedBridge.log("result: " + param.getResult());
}
}
);
}
编写完成,运行安装,模拟器会提示 XP插件没有激活,点击 xposed应用,在模块里面勾选并重启
重启后打开应用,在输出账号密码登录,再去xposed应用的日志去查看,可以看到打印的结果