Xposed框架是一款进行Android逆向编程时非常有及时效应的一个框架。只需做好依赖,实现IXposedHookLoadPackage,IXposedHookZygoteInit或者其他IXposedMod的子接口,就可以进行定制,实现各种awesome的功能。
具体了解可前往:
Xposed官网
Xposed Github项目
在不修改apk的情况下Xposed替换了/system/bin/app_process可执行文件,在启动Zygote时加载额外的jar文件(/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar),并执行一些初始化操作(执行XposedBridge的main方法)。
1.手机获取Root权限
2.安装XposedInstaller
1.导入依赖
eclipse环境下,下载XposedBridgeApi-54.jar并导入程序的libs目录
as环境下,添加依赖
provided 'de.robv.android.xposed:api:82'
//如果需要引入文档,方便查看的话
provided 'de.robv.android.xposed:api:82:sources'
2.修改配置
在AndroidManifest.xml文件中添加如下三个
第一个标签标识是否为Xposed模块
第二个标签为所要开发的Xposed模块的描述信息,可以引用资源第三个标签声明锁开发的Xposed模块所支持的最低Xposed框架版本
3.编写模块
创建一个类或几个类实现IXposedHookLoadPackage,IXposedHookZygoteInit或者其他IXposedMod的子接口。
public class ProductProgram implements IXposedHookLoadPackage {
@Override public void handleLoadPackage(final LoadPackageParam packageParam) throws Throwable { }
}
现在就可以进行hook开发了。
Xposed的XposedHelper类给我们提供了很多已经写好的hook函数,学会灵活使用这些函数是我们使用Xposed必不可少的一部分。
例如hook函数:
findAndHookMethod(createQRUI, "onCreate", Bundle.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
launcher = (Activity) param.thisObject;
}
@Override
protected void afterHookedMethod(MethodHookParam methodHookParam) throws Throwable {
super.afterHookedMethod(methodHookParam);
callCreateAliQrCodeMethod(loadPackageParam);
}
});
更多hook知识可以查看:
Helper
Android.Hook框架xposed篇
4.声明模块
在项目的assets文件夹下新建xposed_init文本,xposed_init文本中写xposed类的确定路径。xposed_init文本区分大小写
例如:
com.product.module.xpose.ProductProgram
将程序安装到已支持xposed的手机上,打开xposed installer切换到模块界面,勾选/取消您想/不想起作用的模块,重启手机,ok。
1.xposed模块安装后不起作用,可去xposed installer的日志中查看具体原因,如果没有
load class 你在xposed_init中声明的模块路径 则加载模块不成功,需重新加载。
2.xposed模块突然不起作用,查看xposed installers的日志,自行确定问题。
1、xposed加载模块失败,在xposed installer的log中看到提示如下
java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
原因:因为没有修改build.gradle文件,默认libs目录下的内容会被包仅apk中,导致和手机上原有的发生了冲突,在build.gradle中把compile修改成provided即可。
2、xposed_init中区分大小写,例如com.zcgames.xposedtest.XModule修改成com.zcgames.XposedTest.XModule,也会导致模块加载失败
3、模块安装后再次使用adb install安装时,提供程序已经安装,需要到设置->应用中找到安装的模块进行卸载(没有activity,无法在桌面卸载)
最后愿大家在填坑的道路上越走越远!