第一次hook成功有点兴奋所以写一篇总结:

1whatishook

xposed是一款可以在不修改APK的情况下景程序运行的框架,基于它可以制作出许多功能强大的模块,且在功能不,冲突的情况下同时运作。在这个框架下,我们可以编写并

加载自己编写的插件APP,实现对目标apk的注入拦载等。

假如签名校验无法绕过,则可利用xposed或frida去hook

原理

用自己实现的app_process普换掉了系统原本提供的app_process,加载一个额外的jar包,入口从原来的:com.android.internal.0sygoteInit.main(O)被替换成了:

de.robvandroid.xposed.XposedBridge.main(),

创建的Zygote进程就变成Hook的zygote进程了,从而完成对zygote进程及其创建的Dalvik/ART虚拟机的劫持(zytoge注入)

2开始配置xposed:

.Android Studio创建新项目

2.将下载的xposedBridgeApi.jar包拖进libs文件夹

3.右击jar包,选择add as library

4.修改xml文件配置

1
2
 复制代码 隐藏代码
<!-- 是否是xposed模块,xposed根据这个来判断是否是模块 --><meta-dataandroid:name="xposedmodule"android:value="true" /><!-- 模块描述,显示在xposed模块列表那里第二行 --><meta-dataandroid:name="xposeddescription"android:value="这是一个Xposed模块" /><!-- 最低xposed版本号(lib文件名可知) --><meta-dataandroid:name="xposedminversion"android:value="89" />

5.修改build.gradle,将此处修改为compileOnly 默认的是implementation

1
2
3
 复制代码 隐藏代码
implementation 使用该方式依赖的库将会参与编译和打包
compileOnly 只在编译时有效,不会参与打包

6.新建–>Folder–>Assets Folder,创建xposed_init(不要后缀名):只有一行代码,就是说明入口类

记得详细到类名(第一次就是没详细到类名出现问题耗了半天)S

7.新建Hook类,实现IXposedHookLoadPackage接口,然后在handleLoadPackage函数内编写Hook逻辑

1
2
3
4
5
6
7
 复制代码 隐藏代码
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

public class Hook implements IXposedHookLoadPackage {@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
}
}

继承了IXposed HookLoad SPackag便拥有了hook的能力

3如何去实际hook

首先连接到模拟机:我这个as直接给我连接到了有点nb平常应该是需要用adb来连接

前面都配置完之后写Hook的逻辑之后先启动钩子在启动程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package com.example.myapplication;

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;

import android.app.Activity;
import android.util.Log;
//前面都是声明as会给你补齐
public class Hook implements IXposedHookLoadPackage {
private static final String TAG = "XposedHook";//添加了XposedHook这个标签为了好调试

@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
//包含了关于正在加载的应用包的信息;throws是抛出异常
if (!loadPackageParam.packageName.equals("com.example.test")) {
return;
}//判断是否是com.example.test(也就是筛选出需要hook的包名)

try {
XposedHelpers.findAndHookMethod("com.example.test.MainActivity", loadPackageParam.classLoader, "check", String.class, new XC_MethodHook() {

@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
String str = (String) param.args[0];
Log.d(TAG, "MainActivity.check 被调用: str=" + str);
}

@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
param.setResult(1);
int result = (int) param.getResult();
Log.d(TAG, "MainActivity.check 结果=" + result);
}
});//这段代码使用了 Xposed 框架中的 XposedHelpers.findAndHookMethod 方法,主要用于在指定类的方法调用时插入自定义逻辑。具体来看,代码的各个部分的意义如下:

// "com.example.test.MainActivity":这是你要拦截的目标类的全名。在这里,MainActivity 是该应用的一个
//Activity。

//loadPackageParam.classLoader:这是加载该应用的类加载器,确保可以找到并操作目标类。

//"check":这是要拦截的方法名称。在这个例子中,是 MainActivity 类中的 check 方法。

//String.class:这是方法参数的类型。在这个例子中,check 方法接受一个 String 类型的参数。

//new XC_MethodHook() { ... }:这是一个匿名类,用于定义你希望在 check 方法调用时执行的逻辑。这个类可以重写以下两个方法:

//beforeHookedMethod:在目标方法被调用之前执行的代码。
//afterHookedMethod:在目标方法被调用之后执行的代码。
} catch (Exception e) {
Log.e(TAG, "钩子方法时出错", e);//检测钩子方法是否出错
}
}
}

其中具体的模板是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.example.myapplication;

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;

import android.app.Activity;
import android.util.Log;
//前面都是声明as会给你补齐
public class Hook implements IXposedHookLoadPackage {
private static final String TAG = "XposedHook";//添加了XposedHook这个标签为了好调试

@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
//包含了关于正在加载的应用包的信息;throws是抛出异常
if (!loadPackageParam.packageName.equals("com.example.test")) {
return;
}//判断是否是com.example.test(也就是筛选出需要hook的包名)

try {
XposedHelpers.findAndHookMethod("com.example.test.MainActivity", loadPackageParam.classLoader, "check", String.class, new XC_MethodHook() {

@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
}

@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {

}
});

} catch (Exception e) {
Log.e(TAG, "钩子方法时出错", e);//检测钩子方法是否出错
}
}
}

以上就是xposed的hook方法