开发Xposed插件CPWechatXposed | 项目复盘(下)

简介: Xposed框架可以在不修改APK的情况下影响程序运行,我们可以利用它对App进行Hook,以实现一些自定义的功能。CPWechatXposed 是笔者开发的一款微信插件,本文介绍的是此插件开发过程与复盘。

② Xposed 提供的一些API


知道怎么创建运行一个Xposed项目,接着了解下都有哪些常用的API~


  • IXposedHookLoadPackage → App被加载时调用,用于App应用Hook回调的函数是:handleLoadPackage


  • XC_LoadPackage.LoadPackageParam → 包含与正在加载的应用程序相关的信息;


网络异常,图片无法展示
|


  • XposedHelpers.findAndHookMethod(要Hook的类,classLoader,方法名,参数,XC_MethodHook回调对象)


Hook一个函数时使用,XC_MethodHook回调对象需重写两个函数:


  • beforeHookedMethod(MethodHookParam param):方法调用前执行;
  • afterHookedMethod(MethodHookParam param):方法调用后执行;


注:可调用**param.setResult**()设置方法的返回值!


  • MethodHookParam:包含与调用方法相关的信息:


网络异常,图片无法展示
|


比较关注的是这里的 thisObject 代表调用此方法的对象实例,如果是静态方法,会返回null,而例子中调用OnCreate()方法的是MainActivity,获得的自然是MainActivity的实例。


接着是 获取成员,分私有与非私有,非私有直接调用下述方法即可获得成员:


Class c = lpparam.classLoader.loadClass("com.coderpig.cpwechatxposed.MainActivity");
Field field = c.getField("tv");


私有成员要先关闭安全访问检查(setAccessible):


Class c = lpparam.classLoader.loadClass("com.coderpig.cpwechatxposed.MainActivity");
Field field = c.getDeclaredField("tv");
field.setAccessible(true);


调用获取该对象:


TextView tv = (TextView) field.get(param.thisObject);
tv.setText("贪玩难约");


  • IXposedHookZygoteInit → 在Zygote启动时调用,用于系统服务的Hook 回调initZygote();


  • IXposedHookInitPackageResources → 在资源布局初始化时会回被执行(inflate) 回调:handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam resparam)


InitPackageResourcesParam包含两个参数,包名和XResource(资源相关)


网络异常,图片无法展示
|


有了这个 XResource 对象,就可以拿到布局资源树了,通过重写 hookLayout 方法:


网络异常,图片无法展示
|


LayoutInflatedParam,里面这个view就是布局资源树,可以拿到遍历,获取特定控件,做一些骚操作:


网络异常,图片无法展示
|


XposeHelpers提供了一些辅助方法:


  • callMethod(Object obj,String methodName, Object... args):在APP中调用特定方法,参数依次是:调用方法的所在类,调用方法名,方法参数;


  • findClass(String className,ClassLoader classLoader):获取class类实例,参数依次是类名,类加载器;


  • findMethodExact:通过反射查找类的成员方法(可setAccessible(true)设置非私有);


  • findConstructorExact:通过反射查找构造函数(同样可设置可访问下性);


  • findAndHookXXX:查找并Hook;


  • setXxx:通过反射设置对象数据成员的值;


  • setStaticXxx:通过反射设置静态变量的值;


  • XposedBridge.log("日志内容"):输入日志和写入到/data/xposed/debug.log,Xposed Installer日志那里可以看到!


  • 内部类:通过$符号链接内部类;


  • 只能Hook方法与构造方法,不能Hook接口和抽象方法;


③ 如何定位到方法调用点


知道哪些API可以耍了,接着就是如何定位到方法调用点了,方法一般有下述三种:


  • 猜测验证法:适用于特定场景,而且具有一定Android开发经验,Hook微信运动改步数,如果你写过计步类的程序,不难想到 手机传感器 那一块去:


网络异常,图片无法展示
|


接着就是写代码验证的过程了,完整过程可以移步至:《抱歉,Xposed真的可以为所欲为——3.微信运动占领封面出售广告位》 自行查阅~



  • 反编译apk源代码:没加固的可以直接用jadx直接反编译,加固的需要自己脱出dex再反编译,然后去跟代码。另外直接用jadx反编译遇到大apk时容易直接卡死,笔者写了个脚本:


网络异常,图片无法展示
|


执行下py文件一键反编译,哈哈,至于简单加固脱壳可以见我之前写的逆向文章,完整过程可移步至:《抱歉,Xposed真的可以为所欲为——6.你的表白撤不回了》 自行查阅~

4、总结思考


在编写Xposed的过程中,让我对逆向有了写了解,相比起普通Android开发仔,在竞品分析时,我能更快的了解到实现方式,日常使用APP时,用得不爽,就写个Xposed或者脱壳修复二次打包。


相关文章
|
7月前
|
测试技术 开发工具 数据库
《移动互联网技术》第十一章 Android应用工程案例: 掌握Android系统的需求分析和设计以及 Android项目的程序测试和版本管理方法
《移动互联网技术》第十一章 Android应用工程案例: 掌握Android系统的需求分析和设计以及 Android项目的程序测试和版本管理方法
76 0
|
8月前
|
API Android开发
基于Xposed自动化框架XposedAppium
基于Xposed自动化框架XposedAppium
132 0
|
10月前
|
Web App开发 前端开发 JavaScript
从开发chrome插件到插件系统设计
最近ChatGPT的技术概念很火热,开发了一个node-gptcommit开源项目,主要利用GPT用来自动生成git commit的信息。
238 0
|
消息中间件 存储 安全
这五款牛逼的 IDEA 插件,堪称代码质量检查利器!
这五款牛逼的 IDEA 插件,堪称代码质量检查利器!
|
Android开发 iOS开发 MacOS
Airtest自动化环境踩坑
Airtest自动化环境踩坑
|
JavaScript 开发者 C++
助你轻松编写与分享snippet的VsCode插件|项目复盘
助你轻松编写与分享snippet的VsCode插件|项目复盘
|
Android开发
开发Xposed插件CPWechatXposed | 项目复盘(上)
Xposed框架可以在不修改APK的情况下影响程序运行,我们可以利用它对App进行Hook,以实现一些自定义的功能。CPWechatXposed 是笔者开发的一款微信插件,本文介绍的是此插件开发过程与复盘。
357 0
|
搜索推荐 IDE Java
pinpoint插件开发之二:从零开始新建一个插件
从零开始新建pinpoint插件,本篇给出从编码到部署运行的详细步骤
887 0
pinpoint插件开发之二:从零开始新建一个插件
|
文字识别 数据安全/隐私保护 计算机视觉
【番外篇】客户端开发(Electron)无源码如何做汉化
【番外篇】客户端开发(Electron)无源码如何做汉化
618 0
【番外篇】客户端开发(Electron)无源码如何做汉化
|
监控 JavaScript Dubbo
pinpoint插件开发实践
Pinpoint是一款全链路分析工具,提供了无侵入式的调用链监控、方法执行详情查看、应用状态信息监控等功能。基于Google Dapper论文进行的实现。
5707 0