Xposed框架Hook Demo实例教程

Xposed是GitHub上rovo89大神设计的一个针对Android平台的动态劫持项目,通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。

Xposed模块本质上也是一个Android App程序,完成一个Xposed模块需要有以下几步:

  • 创建一个Android App程序,并让Xposed知道这个程序是一个Xposed模块;
  • App程序中导入Xposed API的Jar包;
  • 编写具体Hook代码1;
  • 添加入口,使Xposed能知道这个Xposed模块的Hook类入口;

一、创建App程序,并让Xposed认识你

1、打开AndroidStudio,建立一个工程。

Xposed框架Hook
Xposed框架Hook

2、打开AndroidManifest.xml文件,在文件中添加如下几行代码。

Xposed框架Hook

3、完成以上两步后,就可以在手机上运行测试一下了。把手机连到电脑上,并确定能在AndroidStudio上看到你的手机(看不到就检查下是不是adb的问题),这里我使用了网易MuMu模拟器来代替真机。点击运行,在手机上跳出程序后,打开Xposed软件的模块界面,能看到下面这个,就说明Xposed已经识别到你写的Xposed模块了(记得把勾选上,开启该模块)。

Xposed框架Hook

二、让你在App程序中能使用Xposed API

1、打开build.gradle(Module: app)文件,在dependencies中添加如下两行代码,添加后,记得点击右上角的Sync Now按钮,这样我们就可以在我们App程序中使用Xposed的API了。

compileOnly 'de.robv.android.xposed:api:82'
compileOnly 'de.robv.android.xposed:api:82:sources'
Xposed框架Hook

三、编写具体Hook代码

1、在编写Hook代码之前,我们首先先完成一个测试的界面:

在activity_main.xml文件中,添加一个按钮,设按钮id为btn;

Xposed框架Hook

在MainActivity.java文件中获取该按钮,并绑定点击事件,点击后弹出提示框,内容为方法toastMsg()返回的字符串“我未被劫持”。

Xposed框架Hook

重新运行App,点击按钮后效果如下:

Xposed框架Hook

2、编写具体Hook代码,这里我们Hook要实现的最终效果是使点击按钮后弹出的提示框内容变为“你被劫持啦”。

  • 在MainActivity同级目录下新建HookTest.java文件;
  • HookTest类实现IXposedHookLoadPackage接口,并重写handleLoadPackage方法;
  • 加判断,当Hook到你需要的应用时,加载需要Hook的类,其中“com.hyb.hookdemo”为目标应用的包名,“com.hyb.hookdemo.MainActivity”为需要Hook的方法的类名,“toastMsg”为需要Hook的方法名;
  • 调用XposedHelpers的findAndHookMethod()方法,方法的第三个参数new XC_MethodHook()为具体的Hook处理逻辑,XC_MethodHook中重写beforeHookedMethod()和afterHookedMethod()两个方法,其中beforeHookedMethod()为toastMsg()方法执行前执行,afterHookedMethod()为toastMsg()方法执行后执行;
  • 在afterHookedMethod()中修改toastMsg()方法的返回值;

具体实现代码如下:

public class HookTest implements IXposedHookLoadPackage {

    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
        String hookPackageName = "com.hyb.hookdemo";
        if (hookPackageName.equals(lpparam.packageName)) {
            XposedBridge.log("已成功Hook到HookDemo应用");
            Class clazz = lpparam.classLoader.loadClass("com.hyb.hookdemo.MainActivity");
            XposedHelpers.findAndHookMethod(clazz, "toastMsg", new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
                    super.beforeHookedMethod(param);
                }

                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    param.setResult("你被劫持啦");
                }
            });
        }
    }
}
Xposed框架Hook

四、添加入口,让Xposed知道你的Hook模块入口

1、AndroidStudio左边目录切换到Project目录,在app/src/main上右键选择New->Folder->Assets Folder,点击Finish新建。

Xposed框架Hook

2、在assets文件夹上新建文件(New->File),命名为xposed_init,在文件中添加一行文本“com.hyb.hookdemo.HookTest”,该文本为你具体Hook代码文件的完整路径。这样Xposed就可以通过读取xposed_init文件知道你Hook模块的入口在哪啦。

Xposed框架Hook

五、最终效果

至此,你的Hook模块就完成啦,重新编译运行App,重启设备(每次修改Hook代码后都记得重启手机),点击按钮效果如下:

Xposed框架Hook

本次教程就到这里结束啦,最终代码已上传GitHub:https://github.com/huaxiaobin/HookDemo

 

发布者:糖太宗,转载请注明出处:https://www.qztxs.com/archives/science/technology/5604

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年5月7日 下午4:13
下一篇 2022年5月7日 下午4:33

相关推荐

  • 服务挂了,怎么自动恢复?

    上周有个朋友问我: (1)tomcat挂了,站点死了; (2)service出core了,服务死了; 如何让挂掉的服务自动启动呢? 这里给大伙推荐一个常见的运维工具 supervisor。   supervisor是什么? 用Python开发的通用的进程管理工具。   supervisor有什么用? supervisor能把一个普通进程变为后台daemon进...

    技术 2022年5月15日
    1700
  • 突然掉电,为啥MySQL也不会丢失数据?(收藏)

    MySQL采用buffer机制,避免每次读写进行磁盘IO,提升效率: 《缓冲池(buffer pool)》 《写缓冲(change buffer)》 《日志缓冲(log buffer)》   MySQL的buffer一页的大小是16K,文件系统一页的大小是4K,也就是说,MySQL将buffer中一页数据刷入磁盘,要写4个文件系统里的页。 如上图所示,MyS...

    2022年5月10日
    1600
  • 究竟为啥总在凌晨上线,如何进行无损发布

    为什么很多互联网公司升级系统,选择在晚上上线? 美名其曰,晚上上线,对用户影响最小。   为什么会对用户产生影响? 很多人认为,系统升级往往需要重启,重启的过程中,正在访问的用户会访问失败。   例如,如果升级的是web-server: 如上图,重启ip1上的tomcat时,tomcat上或许有1000个http请求正在处理,这些请求就会失败。   又例如,...

    2022年5月15日
    4100
  • 真的痛,小小的IP,大大的耦合

    什么是耦合? 耦合,是架构中,本来不相干的代码、模块、服务、系统因为某些原因联系在一起,各自独立性差,影响则相互影响,变动则相互变动的一种架构状态。 感官上,怎么发现系统中的耦合? 作为技术人,每每在心中骂上下游,骂兄弟部门,“这个东西跟我有什么关系?为什么需要我来配合做这个事情?”。明明不应该联动,却要被动配合,就可能有潜在的耦合。 因为IP配置,导致上下...

    技术 2022年5月11日
    1700
  • 老板问我,什么是基于内容的推荐?

    工程架构方向的程序员,看到推荐/搜索/广告等和算法相关的技术,心中或多或少有一丝胆怯。但认真研究之后,发现其实没有这么难。 今天给大家介绍下推荐系统中的“基于内容的推荐”,绝无任何公式,保证大伙弄懂。什么是基于内容的推荐(Content-based Recommendation)?答:通过用户历史感兴趣的信息,抽象信息内容共性,根据内容共性推荐其他信息。 比...

    技术 2022年5月11日
    1600

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信