装X指南之Xposed安装与配置

2023-11-12

一、前言

Xposed 能干嘛?我可以告诉你 Root + Xposed ,真的可以为所欲为。而 Android 开源,为“搞机”带了更多的乐趣的同时,当然也引入安全性问题,部分流氓软件在 Root 下,会盗取用户私密信息,例如:号码、照片、短信、密码······,所以需要慎重使用 Root,此外本文仅作为技术学习。

二、Xposed 安装

1.首先你的手机 必须 Root,关于各安卓机型的 Root 方法,请自行到对应机型论坛和贴吧找找 (注:Root 有风险,失败可能导致手机变砖,风险自行承担)

2.下载「Xposed Installer」软件并安装,需要留意的是你的手机系统版本,不同版本下载对应的 apk,如果上不了该网址,可百度搜索——Xposed Installer 最新版本下载。

  • Xposed 官方网址:

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

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

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

官网说明

3.激活 Xposed 框架(确保你手机刷入了第三方 Recovery),激活后可能会使系统变的有些卡顿,但为了技术(装B),我们牺牲点性能还是值得~

  • 点击【安装/更新】,选择【Install via recovery】
  • 等待【下载】,重启到【Recovery】模式,期间请勿操作
  • 耐心等待,刷完会自动重启,打开【Xposed Installer】,显示框架已激活。

Install via recovery框架已激活

三、配置 Xposed 插件

如何配置 Android Studio 项目为 Xposed 插件?

1、配置项目 Gradle 的依赖

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

注:需要 compileOnly 来依赖,如果不想通过 Gradle 配置,也可以下载 XposedBridgeApi.jar ,放到项目 libs 目录。

2、配置 AndroidManifest.xml

<meta-data
    android:name="xposedmodule"
    android:value="true" />
<meta-data
    android:name="xposeddescription"    
    android:value="XXX插件" />
<meta-data
    android:name="xposedminversion"
    android:value="89" />
  • xposedmodule:是否配置为 Xposed 插件,设置为 true
  • xposeddescription:模块名称
  • xposedminversion:最低版本号

3、新建 Hook 入口类

该类需要实现接口 IXposedHookLoadPackage,并实现里面关键方法handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam),该方法会在每个软件被启动的时候回调,所以一般需要通过目标包名过滤。

/**
 * @author zhicheng.chen
 */
public class TargetHook implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
        //通过目标包名过滤
        if (lpparam.packageName.equals("com.xxx.xxx")) {
            XposedBridge.log("启动了xxx软件");
        }
    }
}

4、Xposed 免重启调试

Xposed插件每次代码改动,都需要重启手机才能生效,有时候重启一次还不生效(我的手机有一次重启 3 次,才看到生效,还好是公司测试机,不心疼),所以代码最好写上相关 Log 信息,来看代码生效没。

XposedBridge.log("启动了xxx软件");

不过这里分享一个免重启调试的方法,方法来自网上,感谢 DX :
/**
 * @author DX
 *         这种方案建议只在开发调试的时候使用,因为这将损耗一些性能(需要额外加载apk文件),调试没问题后,直接修改xposed_init文件为正确的类即可
 *         可以实现免重启,由于存在缓存,需要杀死宿主程序以后才能生效
 *         这种免重启的方式针对某些特殊情况的hook无效
 *         例如我们需要implements IXposedHookZygoteInit,并将自己的一个服务注册为系统服务,这种就必须重启了
 *         Created by DX on 2017/10/4.
 */

public class HookLoader2 implements IXposedHookLoadPackage {
    //按照实际使用情况修改下面几项的值
    /**
     * 当前Xposed模块的包名,方便寻找apk文件
     */
    private final String modulePackage = "com.xxx.plugin";
    /**
     * 宿主程序的包名(允许多个),过滤无意义的包名,防止无意义的apk文件加载
     */
    private static List<String> hostAppPackages = new ArrayList<>();

    static {
        // TODO: Add the package name of application your want to hook!
        hostAppPackages.add("com.eg.android.AlipayGphone");
        hostAppPackages.add("com.xxx.plugin");
    }

    /**
     * 实际hook逻辑处理类
     */
    private final String handleHookClass = TargetHook.class.getName();
    /**
     * 实际hook逻辑处理类的入口方法
     */
    private final String handleHookMethod = "handleLoadPackage";

    @Override
    public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        if (hostAppPackages.contains(loadPackageParam.packageName)) {
            //将loadPackageParam的classloader替换为宿主程序Application的classloader,解决宿主程序存在多个.dex文件时,有时候ClassNotFound的问题
            XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    Context context=(Context) param.args[0];
                    loadPackageParam.classLoader = context.getClassLoader();
                    invokeHandleHookMethod(context,modulePackage, handleHookClass, handleHookMethod, loadPackageParam);
                }
            });
        }
    }

    /**
     * 安装app以后,系统会在/data/app/下备份了一份.apk文件,通过动态加载这个apk文件,调用相应的方法
     * 这样就可以实现,只需要第一次重启,以后修改hook代码就不用重启了
     * @param context context参数
     * @param modulePackageName 当前模块的packageName
     * @param handleHookClass   指定由哪一个类处理相关的hook逻辑
     * @param loadPackageParam  传入XC_LoadPackage.LoadPackageParam参数
     * @throws Throwable 抛出各种异常,包括具体hook逻辑的异常,寻找apk文件异常,反射加载Class异常等
     */
    private void invokeHandleHookMethod(Context context, String modulePackageName, String handleHookClass, String handleHookMethod, XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        File apkFile=findApkFile(context,modulePackageName);
        if (apkFile==null){
            throw new RuntimeException("寻找模块apk失败");
        }
        //加载指定的hook逻辑处理类,并调用它的handleHook方法
        PathClassLoader pathClassLoader = new PathClassLoader(apkFile.getAbsolutePath(), ClassLoader.getSystemClassLoader());
        Class<?> cls = Class.forName(handleHookClass, true, pathClassLoader);
        Object instance = cls.newInstance();
        Method method = cls.getDeclaredMethod(handleHookMethod, XC_LoadPackage.LoadPackageParam.class);
        method.invoke(instance, loadPackageParam);
    }

    /**
     * 根据包名构建目标Context,并调用getPackageCodePath()来定位apk
     * @param context context参数
     * @param modulePackageName 当前模块包名
     * @return return apk file
     */
    private File findApkFile(Context context, String modulePackageName){
        if (context==null){
            return null;
        }
        try {
            Context moudleContext = context.createPackageContext(modulePackageName, Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
            String apkPath=moudleContext.getPackageCodePath();
            return new File(apkPath);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

四、反编译工具

1、TopActivity.apk

安装这个工具可以直接查看当前 App 显示的最前 Activity,后面我们接触别人写的项目,这个工具可以很方便跟踪代码的入口,项目原理是通过 AccessibilityService 服务,监听所有的界面变化,读取当前界面 Activity,需要给软件开启【辅助权限】。

项目地址:
https://github.com/109021017/android-TopActivity

当然也可以通过 Adb 命令,获取 Dumpsys 当前 Activity 的信息:

adb shell dumpsys activity top

Activity信息

2、BDOpener.apk

这是 Xposed 的插件模块,也就是说需要刷入 Xposed 框架后,才能使用该,通过安装这个软件,我们可以使手机安装的软件,变为可调试状态,这样就可以通过 Android Studio 的 Monitor 工具,查看所有的进程状态,并 dumpsys 方法调用信息。

安装这个软件之后,需要在 Xposed 里面的【模块】里面,把该软件勾选后,【重启手机】才能生效。

有人说找不到 Monitor 工具,该工具在新的 As 版本把入口取消了,我们可以在:C:\Users\Administrator\AppData\Local\Android\Sdk\tools\monitor.bat 目录下找到。

开启调试状态之前,只能看到 AS 调试安装的进程:

打开前

开启调试状态之后,可以看到所有的进程信息:

打开后

3、jadx-gui 工具

关于这个工具的介绍,这里我就不再赘述,贴一篇我觉得写得很好的博文,作者讲得很详细易懂。

Android 反编译利器,jadx 的高级技巧:https://www.jianshu.com/p/e5b021df2170

jadx

注:如果出现 Jdk 错误,请安装 Jdk 64 位版本。
更多技术分享,请加微信公众号——码农茅草屋:

码农茅草屋

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

装X指南之Xposed安装与配置 的相关文章

  • 找不到“ANDROID_HOME”环境变量

    我正在尝试构建一个 ionic android 项目 并且安装了 android sdk 我的项目名称是myApp 我已经成功将android平台添加到myApp中 但是当我尝试构建项目时 myApp sudo ionic build an
  • 从数据库中删除项目后如何从 recyclerView 中删除项目

    我正在使用 recyclerView 来显示当用户单击每个项目的删除按钮时可以删除的项目列表 为了做到这一点 我使用了 recyclerview 适配器 我想要的是 从该 recycleView 适配器中 当用户单击某个项目的删除按钮时 会
  • 如何在从另一个活动调用一个活动时延迟一些?

    我有一个应用程序 其中我正在接收包含他的位置的短信 收到短信后 它会调用另一个活动来启动并将该位置传递给该活动以将其绘制在地图上 在调用第二个活动之前 它会显示一个类似于通知的吐司在屏幕上 但由于调用第二个活动 吐司没有出现 我的问题是我们
  • 如何使用 Espresso 访问外部网站上的元素

    使用 espresso 我们单击 登录 按钮 该按钮将启动一个外部网站 Chrome 自定义选项卡 您可以在其中登录 然后重定向回我们的 Android 应用程序 Espresso 有没有办法 1 验证正在启动的 URL 是否正确2 访问网
  • 如何突出显示在 Textview android 中单击的单词

    我正在创建一个应用程序 在其中我从 EditText 中的用户获取输入 现在 单击按钮后 输入的字符串将显示在 TextView 中 现在我的问题是 当用户单击任何单个单词时 我会使该单词在 TextView 中突出显示 例如 用户输入 你
  • 如何在谷歌地图中使用latlng字符串数组绘制多边形

    在我的应用程序中 我有包含 imagview 的 recyclerview 并且该 imageview 通过使用我存储在 sqlite 中的坐标包含静态地图图像 当我单击该图像时 我将该字符串数组格式的坐标传递给其他地图活动 然后使用该字符
  • 无法创建变体“android-manifest-metadata”

    我在 Playstore 上上传了我的应用程序 bundle aab 方法 它在 android 6 0 上运行正常 没有错误 但在 android 7 0 设备上出现错误 并且无法运行该应用程序 我使用了 Gradle 构建类路径 3 1
  • Android Studio 1.2.1.1 中 Gradle 项目刷新失败

    我在全新安装的 Android Studio v 1 2 1 1 上创建了示例项目 但遇到了以下错误消息 Gradle project refresh failed in Android Studio 1 2 1 1 见下图 所以我试图在谷
  • 如何知道 TTS 何时完成?

    我正在 Android 上实现交互式语音响应应用程序 我想知道如何确定何时tts speak 函数已完成通话 因此我可以调用我的语音识别器函数 public class TTSActivity extends Activity implem
  • Android 时间选择器在分钟滚动时自动更改小时

    例如 当我在 TimePicker 上滚动分钟时 在将分钟滚动到 59 后 小时会自动滚动到 7 因此新时间将为 07 59 同样的方式 如果我有 07 59 并且我将分钟滚动到 00 小时将自动滚动到 8 所以时间将是 08 00 此逻辑
  • 在 Phonegap 3.x CLI 上构建 android 发布 apk

    如何使用 Phonegap 3 x CLI 在本地构建 Android 应用程序并准备发布 我检查了项目的platforms android目录中生成的bin文件夹 并且只有 debug APK 顺便说一句 我使用这个命令 phonegap
  • 使用 Android Exoplayer 调整 Dash 流音量

    我正在尝试设置一个搜索栏来控制 exoplayer 流式破折号实例的级别 我正在使用的设置是演示项目的修改版本 并且无法确定我应该尝试影响搜索栏输出的哪个元素 即如何正确使用 MSG SET VOLUME 等 任何意见将不胜感激 我正在寻找
  • ArgumentMatchers.any 不得为 null

    我正在尝试测试ViewModel以确保实时数据得到正确更新 然而使用时ArgumentMatchers any 它失败了IllegalStateException saying ArgumentMatchers any mViewModel
  • WebView 未绘制,WARN/webcore(5336):第一次布局后无法获取 viewWidth

    我的应用程序有一个视图 可以使用以下代码以编程方式添加到活动中 RelativeLayout LayoutParams layoutParams new RelativeLayout LayoutParams 480 75 Relative
  • 如何在 Android 上通过 RTMP 进行流式传输?

    我正在尝试在远程服务器上播放视频文件 视频格式为flv 服务器为Flash Media Server3 5 我将通过 RTMP 连接到服务器并使用 Android Media Player 实现视频文件的播放 真的吗 可能吗 任何帮助都是我
  • 通过使用 DownloadManager,我如何查看设备中所有活动/正在运行的下载?

    通过使用 DownloadManager 我如何查看设备中所有活动 正在运行的下载 My code DownloadManager Query query null Cursor c null DownloadManager downloa
  • 找出该月第一个星期日/星期一等的日期

    我想在java中检测每个月第一周 第二周的第一个星期日 星期一的日期 我怎样才能实现它 我已经检查了 java 中的 Calendar 类和 Date 类 但无法找到解决方案 所以请帮助我解决这个问题 Calendar calendar C
  • 具有通用类的自定义 Android 适配器

    我正在尝试在 Android 中创建一个通用适配器 所以我不能一遍又一遍地编写它 问题是 它正在工作 但它的回收效果不是很好 它显示了我想要的内容 但是当我滚动时 它的顺序不同 public class CustomListViewAdap
  • Pebble 应用程序设置中的开发人员选项

    I am following this manual http www sitepoint com pebble watch development javascript and I don t have the Developers Op
  • 在 Android 中将列表传递给另一个 Activity

    我已经创建了一个列表 并希望将该列表传递给另一个活动 但当我创建意图时 我在 putExtra 语句上收到错误 只是想知道是否有任何简单的方法来传递字符串列表而不是单个字符串 Thanks private List

随机推荐

  • Redis基础语法

    noSQL 主要解决高并发数据 可以提高访问性能 将低服务器负担 Redis 底层结构 采用键值对存储 工作机制 采用单线程 Redis的数据结构 实用度左至右 string hash list set zset key value key
  • 新博客地址

    现在新的博客地址 https rpz105 com https rpz105 com
  • 【 unity3d 】天空盒的创建和使用

    天空盒 周围环境 天空 注意不是地形 一 创建天空盒材质 1 先创建材质 材质里的Shader里找Skybox 有3个制作方式 但是他们的渲染效果一样 只是制作方式不一样
  • LaTeX基本命令使用教程(清晰实例)(Overleaf平台)(论文排版)

    前言 本文是笔者在学习LaTeX的记录文档 主要是一些常用命令 发至博客分享给大家 笔者的感受是熟悉这些常用命令后即可上手编辑简单的论文 效率很高 体验比word好很多 希望本文能够对LaTeX的初学者有所帮助 有任何问题可以在评论区留言
  • 存储过程进行数据合并导入

    CREATE PROCEDURE sp mytest1 mytype int AS declare pro varchar 50 declare pro1 varchar 50 select pro typename from table1
  • web浏览器访问后端提示‘没有javascript支持,将不能正常工作’

    如图提示 网上找了一下解决办法 说是可能浏览器js支持没有开启 但我的浏览器js支持是开启的 后面清理了下浏览器的缓存 问题解决
  • 如何使用 Kubernetes 监测定位慢调用

    监控作者 李煌东 大家好 我是阿里云的李煌东 今天我为大家分享 Kubernetes 监测公开课第四节 如何使用 Kubernetes 监测定位慢调用 今天的课程主要分为三大部分 首先我会介绍一下慢调用的危害以及常见的原因 其次我会介绍慢调
  • Java&JS时间格式转化

    时间格式转化 一 Java格式转化 1 1 接收前端传值转化 1 2 String转化LocalDate 1 3 LocalDate与Date相互转换 二 Javascript格式转化 2 1 JS时间格式转化 一 Java格式转化 1 1
  • openswan中ISAKMP交互过程关键函数接口

    1 ISAKMP交互过程中关键函数接口 下面分别说明不同的阶段和模式下的函数接口以及对应的报文 2 第一阶段 Phase I 主模式函数接口 发送端 响应端 main outI1 主模式第一包
  • MySQL中的索引事务(1)索引----》数据库运行的原理知识+面试题~

    本篇文章主要讲述MySQL索引事务 所谓的索引index就是指 目录 索引存在的意义 加快查找的速度 省略了遍历的过程 但付出了一定的代价 付出的代价如下 1 需要付出额外的空间代价来保存索引数据 2 索引可能会拖慢新增 删除 修改数据的速
  • 华为OD机试真题-最差产品奖【2023.Q1】

    题目内容 题目描述 A公司准备对他下面的N个产品评选最差奖 评选的方式是首先对每个产品进行评分 然后根据评分区间计算相邻几个产品中最差的产品 评选的标准是依次找到从当前产品开始前M个产品中最差的产品 请给出最差产品的评分序列 输入描述 第一
  • Windows terminal + WSL 美化教程的笔记——解决遇到的问题

    文章目录 前言 问题1 如何打开Windows Terminal 的设置 修改配置文件 问题2 打开windows terminal有更新提示怎么办 问题3 打开windows terminal报错怎么办 参考文献 前言 学习过程中突感字体
  • vaultwarden密码库 搭建流程

    系统工程 建设篇 第二章 vaultwarden密码库 搭建流程 系统工程 建设篇 系列文章回顾 前言 前置条件 实施步骤 注意事项 浏览器插件下载链接 部署 vaultwarden密码库 宝塔面板配置docker 开启docker服务 从
  • python连接clickhouse使用方法

    前沿 clickhouse现在作为分布式存储成熟的解决方案 在python开发中经常会用到clickhouse的连接方案 下面所列一个简单的连接clickhouse的写法 正文 from clickhouse driver import C
  • 焉建伟:3.31黄金走势看涨看跌?黄金原油今日如何操作? 实时策略

    消息面 美东时间周二 美国媒体援引两名知情人士的话报道 拜登周三预计将在匹兹堡宣布2 25万亿美元的一揽子基础设施和就业支持计划 具体而言 大约6500亿美元会被用于重建美国基础设施 如道路 桥梁 高速公路和港口 4000亿美元用于老年人和
  • 蓝桥杯单片机前言(经验分享)

    本人在今年省赛的获得了省一等奖 这是战利品hhh 国赛由于没有好好准备 所以没有取得好名次 已经后悔了555 个人经历 当时是寒假开始学习蓝桥杯单片机开发板的 本人情况是有模电 电路理论基础 c语言基础 当时差不多忘记完了 没有51和模电基
  • 六轴融合算法

    先说什么叫六轴融合 在3Dof姿态追踪功能中 最主要的传感器就是陀螺仪 Gyroscope 它可以提供3个轴的角加速度 对时间进行积分 就可以得出物体旋转的方向角度 但是因为硬件精度等各方面原因 会产生误差 随着时间的累积 计算得到的角度误
  • 活动回顾|解锁 AIGC 密码,探寻企业发展新商机

    5月24日 Google Cloud 与 Cloud Ace 联合主办的线下活动顺利落下帷幕 本次活动 有近 40 位企业精英到场支持 三位 Google Cloud 演讲嘉宾就本次活动主题 为大家带来了比较深度的演讲内容 干货满满 以下的
  • Lua中的协同程序 coroutine

    int running 1 int lua finish lua State L running 0 printf lua finish called n return 0 int lua sleep lua State L printf
  • 装X指南之Xposed安装与配置

    一 前言 Xposed 能干嘛 我可以告诉你 Root Xposed 真的可以为所欲为 而 Android 开源 为 搞机 带了更多的乐趣的同时 当然也引入安全性问题 部分流氓软件在 Root 下 会盗取用户私密信息 例如 号码 照片 短信