Xposed为你开启一扇窗
Xposed框架是一款可以在不修改APK的情况下影响程序运行(修改系统)的框架服务,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作,在这个框架下,我们可以加载很多插件App,这些插件App可以直接或间接劫持、篡改、伪造一些信息。
原理探究
Android平台的动态劫持,通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。理论上我们的插件APP可以hook到系统任意一个Java进程zygote、systemserver、systemui。
原理就不讲那么多了,网上有很多分析的文章,比如:
Xposed框架原理深入研究
https://blog.csdn.net/ascii2/article/details/47974217
Dalvik虚拟机原理及Xposed hook原理
https://cloud.tencent.com/developer/article/1193511
Android Hook框架Xposed原理与源代码分析
https://blog.csdn.net/wxyyxc1992/article/details/17320911
不得不稍微提一下:Method中,有两个非常重要的指针:
54 /*
55 * The remaining items are not used for abstract or native methods.
56 * (JNI is currently hijacking "insns" as a function pointer, set
57 * after the first call. For internal-native this stays null.)
58 */
59
60 /* the actual code */
61 const u2* insns; /* instructions, in memory-mapped .dex */
66 /*
67 * JNI: native method ptr; could be actual function or a JNI bridge. We
68 * don't currently discriminate between DalvikBridgeFunc and
69 * DalvikNativeFunc; the former takes an argument superset (i.e. two
70 * extra args) which will be ignored. If necessary we can use
71 * insns==NULL to detect JNI bridge vs. internal native.
72 */
73 DalvikBridgeFunc nativeFunc;
有兴趣的可以去研究一下,这里不做赘述。
免Root使用 Xposed 模块
VirtualXposed,英文原话“A simple app to use Xposed without root, unlock the bootloader or modify system image, etc. “,翻译:“使用VirtualXposed可以免root、不用解锁bootloader或修改系统镜像”。
官方文档:https://vxposed.com/
GitHub:https://github.com/android-hacker/VirtualXposed
Xposed组成部分
Xposed的C++部分
主要是用来替换/system/bin/app_process并为XposedBridge提供JNI方法。
XposedInstaller
Xposed的安装包,负责配置Xposed工作的环境并且提供对基于Xposed框架的Modules的管理。
在安装XposedInstaller之后,app_process与XposedBridge.jar放置在了/data/data/de.robv.android.xposed.installer
XposedTools
XposedTools就是用来帮助我们编译Xposed和XposedBridge的
XposedMods
开发者使用Xposed开发的一些Modules
Xposed使用
如何集成
AndroidManifest.xml
<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="省略一万字,想写啥就写啥~~~" />
<meta-data
android:name="xposedminversion"
android:value="54" />
assets/xposed_init 此文件内容添加Xposed入口类路径
d.xposedshare.hook.MainHookLoad
app/lib/ 此路径下,集成XposedBridgeAPI-89.jar,
build.gradle中添加 compileOnly files(‘lib/XposedBridgeAPI-89.jar’)
然后,我们就可以在Xposed Installer中看到我们自己定义的模块了。
注意:在运行Xposed之前,需要把Install Run去掉哦。每次修改运行HOOK相关之处的代码,都需要重启手机!
演示
我是如何分析的?
打开App,比如这个页面,为了不增加收入,就把码给挡住了,;-)
这样我们在用Accessibility拿到当前页面的ClassName,比如这样:
这样就给我们反编译出来的代码找到了分析入口。对就从这个类下手。className====类路径+类名。className在xposed框架使用时,用来拿到class。
接下来我们使用Apktools打开需要学习的App,慢慢读起来,学习到很多优秀之处。
解压反编译包的资源
找到二维码页面的Activity: