Xposed_Hook教程

2019年11月17日 13点53分 创建

一. 前言

最近在研究Apk逆向,发现了一款可以Hook任意Apk方法的软件Xposed,前提是手机需要Root权限,于是乎便去研究了一把。

二. 安装 Xposed

  1. 手机需要Root
  2. 安装Xposed,不同Android版本对应不同的Xposed Installer版本
  • Android 4.0.3 - Android 4.4 版本的下载地址:

https://repo.xposed.info/module/de.robv.android.xposed.installer

Android 5.0 及以上版本的下载地址:

https://forum.xda-developers.com/showthread.php?t=3034811

  1. 激活Xposed框架
  • 点击 安装/更新,选择install
  • 等待下载,安装完成
  • 重启,激活成功

这里我使用了夜神模拟器

nox_adb.exe connect 127.0.0.1:62001     夜神模拟器连接AndriodStudio命令

三. 创建Hook Apk

通过创建Xposed插件我们便可以实现Hook任意Apk函数(Xposed插件就是一个Apk)

  1. 打开Android Studio,新建项目
  2. 选择空白不带界面的项目和带一个Activity的项目都可以,这里我选择EmptyActivity

image.png

image.png

  1. 配置gradle,拉取Xposed依赖,并配置AndroidManifest.xml
  • xposedmodule 是否是Xposed 模块
  • xposeddescription 在Xposed中显示的模块名称
  • xposedminversion 最低Xposed版本号

拉取Xposed依赖

配置AndroidManifest.xml

  1. 作为演示,我们Hook我们自己Apk的MainActivity的MyToast方法作为演示
    image.png
  2. 创建Hook类,类名任意
  • 该类需要继承 de.robv.android.xposed.IXposedHookLoadPackage
  • 实现 handleLoadPackage 方法
  • 调用 XposedHelpers.findAndHookMethod 我们便可实现Hook函数的功能,其类似于spring的AOP切面
package com.example.xposedhookdemo01;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;

public class MyHook01 implements IXposedHookLoadPackage {

    @Override
    public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
        XposedHelpers.findAndHookMethod(
                // 被Hook函数的包名加类名
                "com.example.xposedhookdemo01.MainActivity"
                // 类加载器
                , lpparam.classLoader
                // 被Hook函数的函数名
                , "MyToast"
                // 被Hook函数的参数类型
                , String.class
                // Hook成功回调
                , new XC_MethodHook() {
                    @Override
                    // 在被Hook函数之前执行
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        super.beforeHookedMethod(param);
                        param.args[0] = "Hook住了【MyToast】方法【beforeHookedMethod】";
                    }
                    // 在被Hook函数之后执行
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        super.afterHookedMethod(param);
                        param.args[0] = "Hook住了【MyToast】方法【afterHookedMethod】";
                    }
                });
    }
}
  1. 创建 Xposed 插件入口文件使本Apk成为Xposed 的插件
  • 在Main下创建Assets资源文件夹
  • 创建xposed_init文本文件,并在其中写入Hook类全名
    创建Assets资源文件夹

写入Hook类全名

  1. 在模拟器中运行Apk
  • 打开Xposed插件选项,选中自己的插件
  • 重启模拟器
  • 运行自己Hook的方法

选中自己的插件
image.png

结语

Xposed 是一款很强大的框架,通过给我们想要修改的函数下钩子,我们可以实现一些我们想要实现的功能,但Xposed也有一些缺点就是需要设备拥有Root权限,有些Apk会自动检测设备是否被Root,如果设备被Root便强制结束Apk,当然了,要解决并不困难,我们可以找到检测的方法,并Hook此方法,修改它的返回值,以达到欺骗Apk的目的。

所有原创文章采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。
您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
本站部分内容收集于互联网,如果有侵权内容、不妥之处,请联系我们删除。敬请谅解!

  Previous post 基于泛微OA注入学习及成果输出
Next post   已到最新一篇

评论已关闭

很多东西宁缺毋滥,流星的光芒短暂而灼热闪耀。

让你变得更好的那个人,往往是你觉得很难与之相处的那个人。—— by 小宇

觉得自己做的到和不做的到,其实只在一念之间。

路在自己脚下,没有人可以决定我的方向。

你的选择是做或不做,但不做就永远不会有机会。

凡事顺其自然,遇事处于泰然,得意之时淡然,失意之时坦然,艰辛曲折必然,历尽沧桑悟然。