Xposed模块的开发

简介:

作者:snowdream
Email:yanghui1986527#gmail.com
Github: https://github.com/snowdream
QQ 群: 529327615
原文地址:https://snowdream.github.io/blog/2016/09/02/android-develop-xposed-module/

注: 根据Development tutorial 整理完成

创建Android项目

如果准备从零开始创建Xposed模块,首先应该创建一个Android应用工程。

引入 Xposed Framework API

app/build.gradle文件中声明Xposed Framework API 的jar包依赖。

repositories {
    jcenter();
}

dependencies {
  provided 'de.robv.android.xposed:api:82'
  //如果需要引入文档,方便查看的话
  provided 'de.robv.android.xposed:api:82:sources'
}

说明:

  1. 请留意,这个82是Xposed Framework API的版本号,叫做xposedminversion。
  2. xposedminversion可以在这里进行查询:
    https://bintray.com/rovo89/de.robv.android.xposed/api
  3. Xposed Framework API文档请参考:http://api.xposed.info/reference/packages.html

修改AndroidManifest.xml

在AndroidManifest.xml文件中添加以下代码。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="de.robv.android.xposed.mods.tutorial"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <meta-data
            android:name="xposedmodule"
            android:value="true" />
        <meta-data
            android:name="xposeddescription"
            android:value="Easy example which makes the status bar clock red and adds a smiley" />
        <meta-data
            android:name="xposedminversion"
            android:value="53" />
    </application>
</manifest>

说明:

  1. xposedmodule: 一般设置为true,表示这是一个xposed模块
  2. xposeddescription: 一句话描述该模块的用途,可以引用string.xml中的字符串
  3. xposedminversion: 没错,这个就是上面提到的xposedminversion。我理解为要求支持的Xposed Framework最低版本。

模块实现

创建一个或者几个类,并实现IXposedHookLoadPackage,IXposedHookZygoteInit或者其他IXposedMod的子接口。

package de.robv.android.xposed.mods.tutorial;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;

public class Tutorial implements IXposedHookLoadPackage {
    public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
        XposedBridge.log("Loaded app: " + lpparam.packageName);
    }
}

注: XposedBridge.log会将日志输出到logcat,并写入日志文件"/data/data/de.robv.android.xposed.installer/log/debug.log".

好了,现在可以开始Hook了。
大部分的Hook工作,主要通过XposedHelpers类的一些辅助函数来实现。比如:findAndHookMethod

package de.robv.android.xposed.mods.tutorial;

import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;

public class Tutorial implements IXposedHookLoadPackage {
    public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
        if (!lpparam.packageName.equals("com.android.systemui"))
            return;

        findAndHookMethod("com.android.systemui.statusbar.policy.Clock", lpparam.classLoader, "updateClock", new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                // this will be called before the clock was updated by the original method
            }
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                // this will be called after the clock was updated by the original method
            }
    });
    }
}

注:根据名称不难发现,beforeHookedMethod/afterHookedMethod会在被Hook函数之前/之后执行。

关于使用Xposed来进行Hook的更多知识,这里就不展开了。大家可以参考以下两篇文章:

  1. Helpers
  2. android-hook框架xposed篇

声明实现

在assets目录下创建一个空文件,命名为xposed_init。
在这个文件中,每一行记录一个类的完整路径,来声明实现类。
在这里,我们声明 "de.robv.android.xposed.mods.tutorial.Tutorial"

好了,到这里,一个简单的Xposed模块应用项目就构建好了。

模块安装与使用

  1. 将这个工程,编译,打包,安装到已经支持Xposed的手机中。
  2. 打开Xposed Installer应用,切换到模块界面,你可以看到你开发的Xposed模块。
  3. 通过勾选/取消,来启用/禁用模块。然后,重启手机,进行生效。

模块发布

Xposed模块开发完成后,你可以按照以下步骤发布分享。

  1. 你首先需要一个XDA论坛帐号。如果没有,请前往论坛注册:
    http://forum.xda-developers.com/
  2. 使用XDA论坛帐号,登录xposed官网,按照操作提示进行发布。
    http://repo.xposed.info/

Xposed模块开发优势和不足

优势

  1. 功能强大,既可以修改系统应用,也可以修改其他应用。hook android,hook everything.
  2. 使用灵活,既可以针对一款应用进行Hook,也可以针对所有应用进行Hook。

不足

  1. 无法调试。只能通过打印日志进行跟踪。(例如:XposedBridge.log)
  2. 无法即时生效。启用/禁用模块,你需要重启手机。
  3. multidex支持不足。详见Multidex support

Xposed模块开发实例

Xposed-Keylogger的基础上,我稍作修改,制作了一个Xposed模块开发实例。
这个模块的作用就是监听键盘按键,记录所有你设置到EditText控件的字符串。

建议

Xposed是如此的强大,因此,建议重视手机安全的用户,坚决不要root,不要安装xposed,发烧友,土豪随意。

参考

  1. Xposed 官网
  2. Xposed XDA论坛
  3. Development tutorial
  4. Helpers
  5. Replacing resources
  6. Using the Xposed Framework API
  7. DingDingUnrecalled
  8. FakeXX
  9. WechatLuckyMoney
  10. Xposed Framework API
  11. Xposed Framework API in bintray
  12. android-hook框架xposed篇
  13. JustTrustMe
相关文章
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
阿里云瑶池在2024云栖大会上重磅发布由Data+AI驱动的多模数据管理平台DMS:OneMeta+OneOps,通过统一、开放、多模的元数据服务实现跨环境、跨引擎、跨实例的统一治理,可支持高达40+种数据源,实现自建、他云数据源的无缝对接,助力业务决策效率提升10倍。
|
Java 索引
substring方法基本使用
`substring` 方法是 Java 中 `String` 类的重要方法,用于从字符串中提取子串。它有两种常用形式:`substring(int beginIndex)` 从指定索引开始截取至字符串末尾;`substring(int beginIndex, int endIndex)` 从指定起始索引截取到结束索引(不包括)。注意索引超出范围会抛出异常。
510 0
|
开发工具 芯片 开发者
鸿蒙Flutter实战:12-使用模拟器开发调试
本文介绍了如何在 M 系列芯片的 Mac 电脑上使用模拟器进行鸿蒙 Flutter 开发和调试。主要内容包括:创建 Flutter 项目、签名、创建模拟器、运行 Flutter 项目以及常见问题的解决方法。适用于希望在鸿蒙系统上开发 Flutter 应用的开发者。
488 2
鸿蒙Flutter实战:12-使用模拟器开发调试
|
运维 监控 网络协议
在Linux中,有哪些系统管理和配置工具?
在Linux中,有哪些系统管理和配置工具?
|
网络架构 数据格式
IPv4首部格式(超详细)
IPv4数据报首部格式是实现IPv4协议的基础,通常以32比特为单位描述。首部包括固定部分(20字节)和可变部分(最多40字节)。固定部分含版本、首部长度、区分服务、总长度、标识、标志、片偏移、生存时间、协议及首部检验和等字段;可变部分含可选字段和填充,确保首部为4字节整数倍。首部检验和通过二进制反码求和计算。分片时需考虑MTU限制。
1216 10
|
存储 算法 C++
c++string容器-字符串比较讲解
c++string容器-字符串比较讲解
885 1
|
大数据 Linux Android开发
Android ParcelFileDescriptor实现进程间通信
Android ParcelFileDescriptor实现进程间通信
505 0
|
算法 Java 开发工具
使用阿里云KMS产品针对 Springboot 接口参数加密解密功能
针对Springboot里面使用开源工具使用加解密,替换成阿里云KMS产品进行加解密;
1631 2
|
测试技术
07-白盒测试方法-逻辑覆盖法
07-白盒测试方法-逻辑覆盖法
|
网络协议 Linux 网络安全
linux服务器防火墙的开启及关闭
linux服务器防火墙的开启及关闭
1749 1