一文带你轻松入门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

相关文章

Java Lettuce 客户端入门到生产的实现步骤

《JavaLettuce客户端入门到生产的实现步骤》本文主要介绍了JavaLettuce客户端入门到生产的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录1 安装依赖MavenGradle2 最小化连接示例3 核心特性速览4 生产环境配置建议5 常见问题

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python sys模块的使用及说明

《Pythonsys模块的使用及说明》Pythonsys模块是核心工具,用于解释器交互与运行时控制,涵盖命令行参数处理、路径修改、强制退出、I/O重定向、系统信息获取等功能,适用于脚本开发与调试,需... 目录python sys 模块详解常用功能与代码示例获取命令行参数修改模块搜索路径强制退出程序标准输入

Python pickle模块的使用指南

《Pythonpickle模块的使用指南》Pythonpickle模块用于对象序列化与反序列化,支持dump/load方法及自定义类,需注意安全风险,建议在受控环境中使用,适用于模型持久化、缓存及跨... 目录python pickle 模块详解基本序列化与反序列化直接序列化为字节流自定义对象的序列化安全注

Java轻松实现PDF转换为PDF/A的示例代码

《Java轻松实现PDF转换为PDF/A的示例代码》本文将深入探讨Java环境下,如何利用专业工具将PDF转换为PDF/A格式,为数字文档的永续保存提供可靠方案,文中的示例代码讲解详细,感兴趣的小伙伴... 目录为什么需要将PDF转换为PDF/A使用Spire.PDF for Java进行转换前的准备通过

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

python pymodbus模块的具体使用

《pythonpymodbus模块的具体使用》pymodbus是一个Python实现的Modbus协议库,支持TCP和RTU通信模式,支持读写线圈、离散输入、保持寄存器等数据类型,具有一定的参考价值... 目录一、详解1、 基础概念2、核心功能3、安装与设置4、使用示例5、 高级特性6、注意事项二、代码示例

一文详解MySQL索引(六张图彻底搞懂)

《一文详解MySQL索引(六张图彻底搞懂)》MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度,:本文主要介绍MySQL索引的相关资料,文中通过代码介绍的... 目录一、什么是索引?为什么需要索引?二、索引该用哪种数据结构?1. 哈希表2. 跳表3. 二叉排序树4.

docker编写java的jar完整步骤记录

《docker编写java的jar完整步骤记录》在平常的开发工作中,我们经常需要部署项目,开发测试完成后,最关键的一步就是部署,:本文主要介绍docker编写java的jar的相关资料,文中通过代... 目录all-docker/生成Docker打包部署文件配置服务A的Dockerfile (a/Docke