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

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

一文全面详解Python变量作用域

《一文全面详解Python变量作用域》变量作用域是Python中非常重要的概念,它决定了在哪里可以访问变量,下面我将用通俗易懂的方式,结合代码示例和图表,带你全面了解Python变量作用域,需要的朋友... 目录一、什么是变量作用域?二、python的四种作用域作用域查找顺序图示三、各作用域详解1. 局部作

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

一文彻底搞懂Java 中的 SPI 是什么

《一文彻底搞懂Java中的SPI是什么》:本文主要介绍Java中的SPI是什么,本篇文章将通过经典题目、实战解析和面试官视角,帮助你从容应对“SPI”相关问题,赢得技术面试的加分项,需要的朋... 目录一、面试主题概述二、高频面试题汇总三、重点题目详解✅ 面试题1:Java 的 SPI 是什么?如何实现一个

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

电脑蓝牙连不上怎么办? 5 招教你轻松修复Mac蓝牙连接问题的技巧

《电脑蓝牙连不上怎么办?5招教你轻松修复Mac蓝牙连接问题的技巧》蓝牙连接问题是一些Mac用户经常遇到的常见问题之一,在本文章中,我们将提供一些有用的提示和技巧,帮助您解决可能出现的蓝牙连接问... 蓝牙作为一种流行的无线技术,已经成为我们连接各种设备的重要工具。在 MAC 上,你可以根据自己的需求,轻松地