一文带你轻松入门Xposed框架,编写Xposed模块

2024-01-22 21:48

本文主要是介绍一文带你轻松入门Xposed框架,编写Xposed模块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欢迎访问姊妹篇:一文带你轻松入门Frida框架,编写Hook脚本

0x1 Xposed框架简介

Xposed框架在Hook界可谓无人不知无人不晓,是用于Android系统中,Hook App函数的一个重要框架。其原理是,通过替换/system/bin/app_process程序,控制Zygote进程,使得app_process加载XposedBridge.jar,从而可以劫持Zygote进程及其创建的虚拟机。其中比较重要的一点是,Xposed对Android系统本身的要求较高,Android系统的版本,以及国内厂商定制的版本都会影响其安装。 目前,官方支持Android 8.0及以下版本。

0x11 Xposed的安装

Xposed安装方法有多种,在这里介绍最简单的一种,即通过安装器来安装。在官网下载 Xposed Installer
在这里插入图片描述
选择图中的apk,下载到手机上即可。打开该安装器,app会自动选择一个合适的版本,下载安装即可。
在这里插入图片描述
安装完成之后,重启手机,即可完成Xposed框架的安装。

0x12 Android Studio新建一个用于Hook的Demo

假设我们的包名设为com.lys.demoapplication

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button = findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);alertDialog.setTitle("弹框");alertDialog.setMessage(getString());alertDialog.setCancelable(false);alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener()	{@Overridepublic void onClick(DialogInterface	dialog, int	which)	{}});alertDialog.setNegativeButton("CANCEL", new DialogInterface.OnClickListener()	{@Overridepublic void onClick(DialogInterface	dialog, int	which)	{}});alertDialog.show();}});}private String getString(){return "未被hook,我是原始函数";}
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="弹框"/></LinearLayout>

我们的目标就是hook getString() 函数。
在这里插入图片描述

0x2 Xposed模块编写

编写Xposed模块,实际上就是编写一个apk,因此,需要借助于Android Studio,还需要下载一个配套的jar包,即XposedBridgeApi.jar,这是以前的做法,但是如今,只需要利用AS仓库,配置一下gradle就可以了。首先新建一个空项目,这个项目可以有Activity,也可以是一个没有MainActivity,取决于你的模块是否需要界面。新建完apk项目之后,三部曲,即可完成最终的模块编写。

0x21 修改Manifest.xml文件

在Application标签下,加入如下代码

<meta-dataandroid:name="xposedmodule"android:value="true" />
<meta-dataandroid:name="xposeddescription"android:value="这是一个Xposed示例" />
<meta-dataandroid:name="xposedminversion"android:value="53" />

这段代码啥意思?我相信你在安装,并运行一下apk,再打开xposed框架,就知道什么意思了。
在这里插入图片描述

0x22 加载XposedBridgeApi.jar

早期,是需要下载该模块,并导入到项目的libs目录中的,如今,只需要简单配置下gradle即可。
在app/src/main目录中,导入jcenter(),这一步Android Studio都帮你做好了。接下来就是从这个jcenter仓库中,远程寻找 de.robv.android.xopsed:api:89。在build.gradle中加入如下代码。

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

对于AS旧版本(AS3.0以下版本),则需要修改为

implementation 'de.robv.android.xposed:api:82'
implementation 'de.robv.android.xposed:api:82:sources'

0x23 编写具体hook逻辑

我们的目的是,hook在第一节编写好的demo程序中的getString()函数。

package com.lys.hook;import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;public class HookTest implements IXposedHookLoadPackage {public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {if (loadPackageParam.packageName.equals("com.lys.demoapplication")) {XposedBridge.log(" has Hooked!");Class clazz = loadPackageParam.classLoader.loadClass("com.lys.demoapplication.MainActivity");XposedHelpers.findAndHookMethod(clazz, "getString", new XC_MethodHook() {protected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);XposedBridge.log(" has Hooked!");}protected void afterHookedMethod(MethodHookParam param) throws Throwable {param.setResult("我已被劫持!");}});}}
}
loadPackageParam.packageName.equals()

该方法用来寻找需要hook的包名,XposedHookLoadPackage中的handleLoadPackage方法主要用于加载应用程序包时执行用户的操作。

loadPackageParam.classLoader.loadClass()

用反射的方法来寻找需要hook的类名

XposedHelpers.findAndHookMethod()

顾名思义,使用反射的方法,来寻找需要hook的方法

beforeHookedMethod 该方法在hook目标方法执行前调用,其中,参数param指的是目标方法的相关参数、回调、方法等信息;afterHookedMethod 该方法在hook目标方法执行后调用,其中,参数param指的是目标方法的相关参数、回调、方法等信息。Xposed运行多个模块对同一个方法进行hook时,框架就会根据Xposed模块的优先级来排序。

XposedBridge类中hookAllMethods和log方法主要用于一次hook每个类的所有方法或够造函数。

hookAllMethods(Class<?> hookClass,//需要进行hook的类String methodName,//需要进行hook的方法名XC_MethodHook callback//回调函数
)

0x24 添加入口点

右键点击 “main ” 文件夹 , 选择new –> Folder –>Assets Folder,新建assets 文件夹:
在这里插入图片描述
右键点击 assets文件夹, new–> file,文件名为xposed_init(文件类型选text),并在其中写上入口类的完整路径(就是自己编写的那一个Hook类), Xposed框架能够从这个 xposed_init 读取信息来找到模块的入口,然后进行Hook操作了。比如这里,我们在xposed_init,添加

com.lys.hook.HookTest  // 该类就是自己编写的xposed模块类

0x25 安装模块

安装app,并在xposed框架中,激活该模块,重启手机。请注意,要想让Xposed识别出我们修改好的模块,必须要禁用Instant Run,即单击 File -> Settings -> Build, Execution, Deployment -> Instant Run,把第一个√去掉,这样再点击AS的安装,手机的Xposed框架会弹出模块已经更新,需要重启的对话框。
在这里插入图片描述
此时再运行我们之前装好的demo程序,即可看到,程序弹框已经被修改。
在这里插入图片描述

这篇关于一文带你轻松入门Xposed框架,编写Xposed模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/634333

相关文章

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(