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。
1. xposedminversion可以在这里进行查询:
https://bintray.com/rovo89/de.robv.android.xposed/api
1. 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模块
1. xposeddescription: 一句话描述该模块的用途,可以引用string.xml中的字符串
1. 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
1. 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/
1. 使用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
时间: 2024-11-02 13:55:37

Xposed模块的开发的相关文章

iOS视频功能模块的开发

iOS视频功能模块的开发 一.使用MPMoviePlayerController进行视频播放         MPMoviePlayerController是iOS中进行视频播放开发的一个控制类,里面涵盖了视频播放中大部分的需求功能,在使用这个框架时,需要导入头文件<MediaPlayer/MediaPlayer.h>. 1.初始化方法         MPMoviePlayerController可以播放网络视频,也可以播放本地视频,通过不同的URL来进行初始化,例如本地视频的初始化如下:

apicloud-请问在Android开发中,怎么利用APICloud的模块进行开发?

问题描述 请问在Android开发中,怎么利用APICloud的模块进行开发? 如题.请问要怎么利用APICloud里面已有的模块进行开发,看它网站上的教学视频基本都是针对于web开发者的,那么有没有针对native开发者的视频教程呢?是利用superwebview吗?我研究了一天了也没研究出来怎么利用superwebview来在native开发中加入web模块呀..所以特来请教,还望有经验的大神们不吝赐教! 解决方案 http://docs.apicloud.com/APICloud/%E6%

抽象工厂模块在开发中的应用

抽象工厂是设计模块中创建型模式的一种,它比起工厂方法模式来说,更加具有一般性,在本模式中会引入一个产品族的概念,就是说,在本模式中抽象产品会有多个,然后用抽象工厂去调用它们,具体怎么去调用由具体工厂来实现. 看下列代码,主要实现动态生成按钮和弹出窗口的功能,弹出窗口可以根据浏览器的类型去调用适合 自己的方法,按钮也可以根据传入的样式和类型去自动生成按钮. class Program { static void Main(string[] args) { RunEnvironment run=ne

PB公用错误捕获模块的开发

作者:达通兴电脑科技公司(www.study01job.com) 郭宝利 在一个应用程序中,不管什么时候发生错误,都可以触发Application对象的SystemError事件(个别的,数据窗口的DBError.ItemError事件不会触发SystemError,以后再讨论),在该事件中可以处理全局对象Error的信息,以便用户清楚错误的情况,并且还有机会继续执行程序,否则整个应用可能就会关闭了. 程序设计思路很简单,只要在Application对象的SystemError事件中打开一个公用

浅谈android hook技术

前言 在测试android过程中,能对函数进行hook能帮助更加深入的进行测试,本文简单介绍了hook框架xposed和frida,从简单的小例子做了简单的演示,算是自己的学习的过程,是个入门的过程. xposed框架 xposed,主页:http://repo.xposed.info/module/de.robv.android.xposed.installer是个开源的框架,在github上有源码的,直接下载apk后安装激活就可以使用,很多地方有这方面的教程,针对不同的手机架构,有大牛做了针

Android Xposed框架中如何创建模块

当然,你可以去学习如何创建一个Xposed模块.所以你可以阅读这篇教程(官方教程)去学习怎样解决这个问题.这不仅仅讲解如何新建模块.如何编写模块,我们要往更深处思考,为什么按照这些步骤,为什么要新建这个类.如果你是"TL博士"那样的人,那么可以直接阅读"Making the project an Xposed module" 这一章节.如果你想看完整个教程那么你需要很好的理解能力.你将会花费时间去阅读这篇文章,因为你不能但靠自己解决任何的问题. here).综观类X

DNN模块开发系列文章(1)——分析设计

序 DNN做为一个优秀的门户网站框架,可以通过安装各种功能模块的方式扩充应用.正是通过这一优秀的功能,DNN框架可以实现:文章管理,图片管理,文档管理,论坛,博客,商店,调查,FAQ等等各种各样满足实际需求的模块.通过这个强大的框架支持,我们可以很容易的实现这些模块.比如:权限控制,多语言支持,多数据库支持,搜索,聚合,皮肤等功能,我都可以很容易的通过框架实现.如果是在平时,光是实现这些基础功能我们就需要花去大量的时间.现在有了DNN框架的支持,我们就可以集中精力投入到模块的业务逻辑和流程上,从

初探PHPcms模块开发介绍

 由于工作关系,只能暂时放弃对mongodb的研究了 .开始研究PHPcms . 目前为止我已经基本完成了模块的开发.趁着周末来这里做个总结.我发现phpcms写的还不错,不过文档什么的确实不多. 不说废话了.对于phpcms的模块开发.首先要了解模块的目录结构. 我们可以在http://v9.help.phpcms.cn/html/2010/structure_0928/69.html 找到他的目录结构 我们要开发的东东(也就是模块)就在/phpcms/modules/下面 如果没有什么特别的

Nginx模块开发入门(转)

  前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并发情况下具有巨大的性能优势. Nginx属于典型的微内核设计,其内核非常简洁和优雅,同时具有非常高的可扩展性.Nginx最初仅仅主要被用于做反向代理,后来随着HTTP核心的成熟和各种HTTP扩展模块的丰富,Nginx越来越多被用来取代Apache而单独承担HTTP Server的责任,例如目前淘