问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Xposed框架Hook环境搭建与基础教学

创作时间:
作者:
@小白创作中心

Xposed框架Hook环境搭建与基础教学

引用
CSDN
1.
https://blog.csdn.net/weixin_51111267/article/details/139087638

Xposed框架是一个运行时修改Android系统行为的框架,它允许开发者在不修改系统源代码的情况下,通过Hook技术实现对系统或应用行为的修改。本文将详细介绍Xposed框架的环境搭建过程以及基本的Hook操作方法。

一、Xposed环境搭建

(1) 导入依赖api-82.jar

首先需要下载并导入Xposed框架的API库。你可以从这里下载api-82.jar文件,并将其添加到你的Android项目中。

(2) 修改AndroidManifest.xml(改为Xposed模块)

在AndroidManifest.xml文件中添加以下元数据信息,将你的应用声明为Xposed模块:

<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="this is a hook script" />
<meta-data
android:name="xposedminversion"
android:value="82" />

(3) 编写Hook类

创建一个实现IXposedHookLoadPackage接口的Hook类,用于处理包加载事件:

package com.example.myandroidstudio;
import android.util.Log;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
public class Hook implements IXposedHookLoadPackage {
    public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable{
        if(!lpparam.packageName.equals("com.app.acc"))return;  // 过滤,只hook包名为com.app.acc的app
        Log.d("yunxiao>>>","hook start...");
    }
}

(4) 增加Xposed初始化入口

在项目根目录下新建一个名为xposed_init的文本文件,内容为Hook类的完整路径:

com.example.myandroidstudio.Hook

(5) 编译为Xposed模块APK

使用Android Studio编译项目,生成APK文件。编译完成后,手动安装生成的APK。

(6) 激活Xposed模块

打开Xposed框架管理界面,找到你刚刚安装的模块,勾选激活,然后进行软重启。

(7) 连接安卓进行调试输出

在Logcat中添加相应的过滤器,以便查看Hook相关的日志输出。

注意事项:如果调试输出没有找到相应的应用包名,可以尝试重启手机。

二、Hook教学

(1) Hook普通函数

下面是一个Hook普通函数的例子:

package com.example.myandroidstudio;
import android.util.Log;
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.LoadPackageParam;
import java.util.Map;
public class Hook implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
        if(!lpparam.packageName.equals("com.xxx.abc")) return;
        Log.d("yunxiao>>>","hook com.xxx.abc");
        
        
        XposedHelpers.findAndHookMethod("abc.g$a", lpparam.classLoader, "onCallToAddSecurityFactor", String.class, Map.class, new XC_MethodHook() {
            // $a 为类中类
            // String.class, Map.class 为入参类型,如果入参为空则不用填,有多少个入参填多少个
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                super.beforeHookedMethod(param);
            }
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                String args0 = (String) param.args[0];
                String args1 = param.args[1].toString();    // map打印输出
                Log.d("yunxiao>>>","================================= hook start ==================================");
                Log.d("yunxiao>>>","after args0:"+args0);
                Log.d("yunxiao>>>","after args1:"+args1);
                Log.d("yunxiao>>>","after result:"+param.getResult().toString());
                Log.d("yunxiao>>>","================================= hook end ==================================");
                super.afterHookedMethod(param);
            }
        });
    }
}

(2) 打印调用栈

要在Hook方法中打印调用栈,可以在afterHookedMethod中添加以下代码:

Log.e("yunxiao>>>","Stack:",new Throwable("Stack dump"));
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号