第一次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
| 复制代码 隐藏代码 <meta-dataandroid:name="xposedmodule"android:value="true" /><meta-dataandroid:name="xposeddescription"android:value="这是一个Xposed模块" /><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方法