Xposed 框架 hook 简介 案例 MD

Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱
MyAndroidBlogs baiqiantao baiqiantao bqt20094 [email protected]

目录

Xposed

Xposed 是一款可以在不修改APK的情况下影响程序运行(修改系统)的框架服务,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。Xposed 理论上能够hook到系统任意一个Java进程,由于是从底层hook,所以需要root权限,并且每次更新都要重新启动设备

由于Xposed项目每次安装都要重新启动,在真机上是非常耗时间的,建议选择Genymotion模拟器。

我们可以通过Xposed installer右上角菜单中的"软重启"来重启设备,当然此APP还提供了一切常用的其他功能。

相关资源

Xposed框架中文站
Xposed插件官方网站
FAQ,建议开发前仔细阅读一遍

framework下载地址
Xposed_installer_3.1.4百度盘下载Xposed_installer_3.1.5官网下载
xposed依赖的maven地址

rovo89的GitHub主页

里面有5个项目,包括XposedInstallerXposed、XposedBridge、XposedTools、android_art。

官方简介

Xposed is a framework for modules that can change the behavior of the system and apps without touching any APKs.

Xposed是一个可以在不触及任何APK的情况下改变系统和应用程序的行为的模块框架。

That's great because it means that modules can work for different versions and even ROMs without any changes (as long as the original code was not changed too much). It's also easy to undo. As all changes are done in the memory, you just need to deactivate the module and reboot to get your original system back.

这很好,因为它意味着模块可以在不做任何更改的情况下为不同的版本甚至ROM工作(只要原始代码没有太多改变)。 撤消也很容易。 由于所有更改都在内存中完成,您只需要停用模块并重新启动即可恢复原始系统。

There are many other advantages, but here is just one more: Multiple modules can do changes to the same part of the system or app. With modified APKs, you to decide for one. No way to combine them, unless the author builds multiple APKs with different combinations.

还有许多其他优点,但这里只有一个:多个模块可以对系统或应用程序的同一部分进行更改。 使用经过修改的APK,您可以选择一个。 除非作者使用不同的组合构建多个APK,否则无法组合它们。

Note that this only works with root access on Android 4.0.3 up to Android 4.4.

请注意,这仅适用于Android 4.0.3到Android 4.4 的具有root访问权限的设备。

最新版本支持到 8.1(27)

参考这里

目前最新版本来到3.1.5,支持Android7.0、7.1、Android8.x框架安装。

新版本的主要的功能更新是它带来了适配于当前设备的Xposed框架直接下载安装的选项,当然也包括卸载选项,这样就不用自己再去针对CPU和系统版本手动筛选需要刷入的框架版本了,减少了出错的几率,方便新手用户。

新版本的xposed框架主程序增加一些检查步骤,能够在出错的时候给出更多的提示,所以强烈推荐更新,并且作者也鼓励大家更新到新版本,各方面都会比旧版本要好一些。

第一个 xposed 项目

参考WrBug的简书慢啄网的文章

简单来说就是,需要以下几个基本步骤:

  • 1、安装framework,重启
  • 2、安装XposedInstaller,重启
  • 3、添加依赖,添加三个meta-data
  • 4、编写Hook逻辑,配置完整类名
  • 5、安装APP,重启

系统环境配置

1、根据Android设备系统版本到 framework官网 下载对应的框架,选择.zip结尾的文件,例如 sdk22 系统 x86 环境最新版本下载地址为 xposed-v89-sdk22-x86.zip,下载完成后运行模拟器,将 zip 包拖到模拟器界面即可刷入,完成后重启模拟器

2、到 installer官网 下载安装XposedInstaller应用(可能比较慢),例如最新的 XposedInstaller_3.1.5.apk,也可百度搜索后下载安装。安装完毕后打开此app,会提示你没有激活,再次重启后进入刚刚安装的app,会提示已激活,即安装成功。

项目环境配置

1、在模块中添加依赖,maven地址在这里

compileOnly 'de.robv.android.xposed:api:82' //xposed依赖,注意这个版本号和framework版本号并不是一致的

2、在AndroidManifest.xml中添加如下配置:

<meta-data
    android:name="xposedmodule"
    android:value="true"/>
<meta-data
    android:name="xposeddescription"
    android:value="hello xposed"/>
<meta-data
    android:name="xposedminversion"
    android:value="89"/>

注意这里的版本号和framework版本号是一致的

配置完成后,安装到模拟器,状态栏弹出如下提示:

我们点击软重启即可。

需求分析

例如我们有这么一个简单的Activity

public class XposedActivity extends Activity {
    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        textView = new TextView(this);
        setContentView(textView);
    }
}

下面通过 xposed 给 textView 设置文本 Hello Xposed。

思路:Xposed hook onCreate方法,在该方法执行完后获取TextView的实例,通过setText方法设置文本。

编写 Xposed 代码

新建一个类XposedInit实现IXposedHookLoadPackage,关于IXposedHookLoadPackage等接口,后面的文章会有说明。

public class XposedInit implements IXposedHookLoadPackage {

    private static String PACKAGE_NAME = "com.my.bqt";
    private static String CLASS_NAME = "com.my.bqt.xposed.XposedActivity";
    private static String METHOD_NAME = "onCreate";

    @Override
    public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) {
        Log.i("bqt", "【handleLoadPackage】" + lpparam.packageName);//任何一个app启动时都会调用
        if (lpparam.packageName.equals(PACKAGE_NAME)) { //匹配指定的包名
            //参数:String className, ClassLoader classLoader, String methodName, Object... parameterTypesAndCallback
            XposedHelpers.findAndHookMethod(CLASS_NAME, lpparam.classLoader, METHOD_NAME, Bundle.class, new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    Log.i("bqt", "【afterHookedMethod】"); //当Hook成功后回调
                    Class c = lpparam.classLoader.loadClass(CLASS_NAME);//不能通过Class.forName()来获取Class,在跨应用时会失效
                    Field field = c.getDeclaredField("textView");
                    field.setAccessible(true);
                    TextView textView = (TextView) field.get(param.thisObject);//param.thisObject为执行该方法的对象,在这里指Activity
                    textView.setText("Hello Xposed");
                }
            });
        }
    }
}

配置完整类名

新建assets文件夹,文件夹下新建xposed_init文件,在文件中填写XposedInit的完整类名

com.my.bqt.xposed.XposedInit

然后安装到模拟器上,然后重启模拟器,重启后打开app,这时textView将显示Hello Xposed

IXposedHook相关接口解析

上面案例中我们通过一个简单的例子开发了一款Xposed框架,感受到了Xposed的强大功能,在demo中我们新建了一个XposedInit的类实现了IXposedHookLoadPackage接口,在handleLoadPackage中进行hook,最终达到了我们的目的,那IXposedHookLoadPackage是干什么的呢?还有handleLoadPackage什么时候会调用呢?还有IXposedHookInitPackageResourcesIXposedHookZygoteInit的左右是什么?下面会对这些做一个讲解。

IXposedHookLoadPackage

2019-4-13

猜你喜欢

转载自www.cnblogs.com/baiqiantao/p/10699552.html