Xposed模块开发学习记录

Xposed模块相关API可以参考在线文档:

https://api.xposed.info/reference/packages.html

?
?

入门教程可以参考:

https://github.com/rovo89/XposedBridge/wiki/Using-the-Xposed-Framework-API

https://github.com/rovo89/XposedBridge/wiki/Development-tutorial

?
?

以下是基于AS 3.2.1开发的一个例子。

以"XposedDemo"为名,新建一个"Empty Activity"模板工程。

打开app/build.gradle,添加xposed依赖:

?
?


compileOnly‘de.robv.android.xposed:api:82‘

compileOnly‘de.robv.android.xposed:api:82:sources‘

第一个依赖是必须的;第二个依赖用于显示API的文本提示,非必须。

注意必须使用compileOnly(低版本的gradle使用provided),不然使用模块时 ,会有包依赖冲突。

?
?

在AndroidManifest.xml文件的<application>标签中,添加3个<meta-data>声明:

含义如下:

  • xprosedmodule,值必须为true
  • xposeddescription,对模块的描述信息
  • xposedminversion,使用Xposed API的版本(gradle添加依赖时,末尾的数字)

?
?

新建一个类,实现IXposedHookLoadPackage接口,该接口有个handleLoadPackage()抽象方法需要实现。

如果模块启用,每个app的包被系统加载时,都会调用模块的handleLoadPackage()方法,入口参数lpparam通过参考在线API文档,得知可以获取以下信息:

可以使用以下代码,过滤非目标app:

?
?

XposedBridge.log()是Xposed框架使用的日志工具,会同时向logcat(TAG为Xposed)和/data/data/de.robv.android.xposed.installer/log/debug.log(该文件可以通过Xposed Installer的日志功能查看)文件写入日志信息。

?
?

通过一定手段,获取hook的目标方法(包名 、类名、方法名),通常使用Xposed.findAndHookMethod()方法,hook目标方法:

该方法与Java反射的语法类似,需要4个参数:

第1个参数:目标方法所在类的全名(包名+类名);

第2个参数:目标方法所在类使用的类加载器,可以使用lpparam.classLoader获取;

第3个参数:目标方法的名称;

第4个参数:为一个Object类型的变长参数,分两部分。前一部分是目标方法的参数列表,与Java反射语法一样,使用参数的Class类型描述,例子中hook的是无参方法,故没有这一部分;后一部分是一个XC_MethodHook()的子类,这个子类是hook的核心,通过重写beforeHookedMethod()afterHookedMethod(),向目标方法插入代码。通过方法名很容易理解,一个方法将代码插入在目标方法前,一个方法将代码插入到目标方法之后。在这两个方法里,可以像正常开发一样写代码,可以通过入参param获取目标方法的基本信息,该参数的类型为MethodHookParam,查看在线API文档,我们可以获取以下数据:

目标方法的参数、this引用、返回值(通常用于afterHookedMethod())等基本信息 ,都可以通过该方法获得。

?
?

编写完hook代码后,需要在main文件夹下,添加一个asset文件,并新建一个文本文件,命名为Xposed_init(必须是这个名字),该文件夹下录入IXposedHookLoadPackage接口实现类的类名

?
?

完成这一切后就可以编译了,安装该apk后,Xposed Installer会自动提示是否弃用该模块,启用并重启手机后,即可实现对目标方法的hook。

如果是通过调试的方式安装apk,需要在编译器关闭Instant Run功能。开启这个功能,编译后的apk会被切分成多个文件,会导致Xposed_init文件无法被正常读取。

?
?

补充

XposedHelpers与XposedBridge

这个两个类的hook操作的核心类,提供了hook的基本方法。想深入了解Xposed模块开发,可以从这两个类入手。

?
?

获取Context

编写hook代码时,如果需要使用Context实例(例如使用Toast时),可以通过AndroidAppHelper类获取

AndroidAppHepler类还可以获取以下信息:

?
?

修改SharedPreferences

Xposed API提供了XSharedPreferences类,用于修改SharedPreference文件。

?
?

替换资源

Xposed API提供了IXposedHookInitPackageResources接口,该接口需要实现handleInitPackageResources()方法 。当app加载app自身的资源时,会调用该方法。替换资源的例子,可以参考:

https://github.com/rovo89/XposedBridge/wiki/Replacing-resources

?

最后,在CSDN上发现个大神,有一系列的Xposed开发教程,有需要可以去围观:

?2.改为OV机型流畅玩耍高帧率王者农药

From <https://blog.csdn.net/coder_pig/article/details/80031291>

?

3.微信运动占领封面出售广告位

From <https://blog.csdn.net/coder_pig/article/details/80074687>

?

4.猜拳投骰子你能赢算我输

From <https://blog.csdn.net/coder_pig/article/details/80173216>

?

5.我自己刷的Xposed凭什么不给我用(反Xposed检测)

From <https://blog.csdn.net/coder_pig/article/details/80586601>

?

6.你的表白撤不回了

From <https://blog.csdn.net/coder_pig/article/details/80786185>

?
?

原文地址:https://www.cnblogs.com/foundkey/p/10252127.html

时间: 2024-10-09 13:24:31

Xposed模块开发学习记录的相关文章

Xposed模块开发教程

转:http://vbill.github.io/2015/02/10/xposed-1/ http://blog.csdn.net/zhangmiaoping23/article/details/54891387 原文地址.这是开发者所写的,可以说是官方开发指南.文章讲述了Xposed的原理,以及怎么开发Xposed框架的模块.头一次翻译技术文档,有错误的话请多包涵. 好了,你想学习怎么为Xposed开发新的模块么?那么读读这篇教程(或者我们可以称他为"泛读短文")学着怎么去做.这不

Xposed模块开发入门教程

前言:在高手如云的XDA论坛上Xposed框架都被许多开发者誉为"安卓第一神器".究竟是什么神奇的能力让它在众多APP中脱引而出呢?本文将指引大家完成一个Xposed上最简单的Demo,让大家感受一下Xposed的能力. 一.手机环境 1.ROOT过的Android手机(根据手机型号自行ROOT,本文不再详述) 2.安装了Xposed框架(没有Xposed框架的可从此处下载) 二.原理 Xposed替换了/system/bin/app_process可执行文件,在启动Zygote时加载

Python模块章节学习记录

Python模块章节学习 Python里含有大量的标准模块和第三方模块,同时我们也可以自主定义模块. 1.自定义模块 自定义模块的形式为"模块名 + .py",且模块文件的扩展名必须是.py.一个模块中包含许多函数,在其他的程序中我们可以通过使用import和from--import语句导入模块. import可以一次引用多个模块,且可以将模块用as关键字进行重命名,这个对引用长名模块,可以提供便利.一旦使用import引用模块,则将该模块中的所有函数引用.from--import可以

IOS开发学习记录第1天之熟悉Mac常用快捷键

博客介绍:本人从今天开始将学习IOS开发,随后的时间里将记录自己学习轨迹及心得,特开此博客记录,记录这伟大的时刻. (一).Mac上你应该知道的快捷键 1.让我们先来熟悉一下以后我们将一直敲打的键盘,我们了解一下Mac 键盘的布局,依照我们Mac Pro 笔记本键盘为例: 第一行从左往右开始: esc键:取消命令键,用来取消当前命令,比如我们现在正在全屏看电影,那当我们按下此键的时候,这个时候就回退出全屏. F1键:显示器亮度,通过按住F1键可以调整显示器屏幕的亮度,其中F1为减小亮度 F2为增

IOS开发学习记录第2天之熟悉Xcode常用快捷键

(一).Xcode里你应该了解的快捷键 1.第一天我们熟悉了Mac 常用的快捷键,那么今天我们就来了解学习一下Xcode里我们应该知道的快捷键,当然这里首先要感谢一下 Jimmy.Yang,因为自己在学习的时候看到他得博客,感觉挺全面的,所以摘抄过来一些我们以后应该会常用到得快捷键.摘抄自:http://www.cnblogs.com/yjmyzz/archive/2011/01/25/1944325.html command + N: 新文件 command + shift + N: 新项目

IOS开发学习记录第3天之C语言学习

(一).学习IOS开发,我们就要刨根问底,如果学习,从哪学习,首先iOS是由苹果公司开发的移动操作系统[1] .苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPod touch.iPad以及Apple TV等产品上.iOS与苹果的Mac OS X操作系统一样,属于类Unix的商业操作系统.而UNIX系统大部分是由C语言编写的,因此我们就从C语言开始学习. 1.C语言的发展史: C语言是在 70 年代初问世的.一九七八年由美国

微信开发学习记录 01

最近几天做了一下微信开发,总结了一些经验和教训. 首先是微信token链接,最开始连接的时候总是出现token连接失败,总以为是设置的不对,结果第二天就好了.而且发现,如果上传的代码(我用的是新浪云)有错误的话,可能会连不上(不知道对不对,我只是根据连接的经历总结的) 其次呢,就说一下编程时遇到的一些困难.最开始一两天的时候,总是觉得在网站上没有办法调试,根本不知道哪里会出错.后来发现其实是可以调试的,只是没有办法像编译器一样进行断点调试.但是一些语法问题还是可以发现的. 点击画篮圈的链接,可以

IOS开发学习记录第4天之C语言学习

(一).今天我们要学习的主要包括一下内容: 1.标示符概念及其命名原则  在C语言中,符号常量,变量,数组,函数等都需要一定的名称,我们把这种名称称之为标识符.  标识符划分:关健字.预定义标识符和用户标识符  命名规则: (1).只能由字母.数字.下划线或者美元符号($)组成 (2).不能以数字开头 (3).不能与关健字重名 (4).严格区分大小写  命名规范: (1).起一个有意义的名字(比如用户名:userName) (2).驼峰命名(如果一个名称有多个单词组成,第一个单词首字母小写其他单

MyBatis开发学习记录

使用MyBatis时主要是完成POJO和SQL的映射规则 MyBatis基本构成: SqlSessionFactoryBuilder SqlSessionFactory SqlSession SqlMapper(主要是定义参数类型,描述缓存,描述SQL语句,定义查询结果和POJO的映射关系) 配置(<configuration>): <properties/> 在<properties>中可以定义参数如数据库密码,用户名等形式如: <properties>