Xposed使用
Created At :
Views 👀 :
工具
jadx-gui
雷电模拟器
Android Studio
原理
Xposed是一款可以在不修改APK的情况下影响程序运行的框架,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。在这个框架下,我们可以编写并加载自己编写的插件APP,实现对目标apk的注入拦截等。
用自己实现的app_process替换掉了系统原本提供的app_process,加载一个额外的jar包,入口从原来的: **com.android.internal.osZygoteInit.main()被替换成了: de.robv.android.xposed.XposedBridge.main()**,
创建的Zygote进程就变成Hook的Zygote进程了,从而完成对zygote进程及其创建的Dalvik/ART虚拟机的劫持(zytoge注入)
xposed配置以及使用
1.Android Studio创建新项目
2.将下载的xposedBridgeApi.jar包拖进libs文件夹
3.右击jar包,选择add as library
4.修改xml文件配置
1 2 3 4 5 6 7 8 9 10 11 12
| <!-- 是否是xposed模块,xposed根据这个来判断是否是模块 --> <meta-data android:name="xposedmodule" android:value="true" /> <!-- 模块描述,显示在xposed模块列表那里第二行 --> <meta-data android:name="xposeddescription" android:value="这是一个Xposed模块" /> <!-- 最低xposed版本号(lib文件名可知) --> <meta-data android:name="xposedminversion" android:value="89" />
|
5.修改build.gradle,将此处修改为compileOnly 默认的是implementation
6.新建–>Folder–>Assets Folder,创建xposed_init(不要后缀名):只有一行代码,就是说明入口类
7.新建Hook类,实现IXposedHookLoadPackage接口,然后在handleLoadPackage函数内编写Hook逻辑
1 2 3 4 5 6 7 8 9
| import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class Hook implements IXposedHookLoadPackage { @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
} }
|
继承了IXposedHookLoadPackag便拥有了hook的能力
xposed常用API
1.修改返回值
1 2 3 4 5 6 7 8
| XposedHelpers.findAndHookMethod("com.zj.wuaipojie.Demo", loadPackageParam.classLoader, "a", String.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); param.setResult(999); } });
|
2.修改参数
1 2 3 4 5 6 7 8
| XposedHelpers.findAndHookMethod("com.zj.wuaipojie.Demo", loadPackageParam.classLoader, "a", String.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); String a = "pt"; param.args[0] = a; } });
|
3.Hook复杂&自定义参数
1 2 3 4 5 6 7 8 9
| Class a = loadPackageParam.classLoader.loadClass("类名"); XposedBridge.hookAllMethods(a, "方法名", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param);
} });
|
4.Hook替换函数
1 2 3 4 5 6 7
| Class a = classLoader.loadClass("类名"); XposedBridge.hookAllMethods(a,"方法名",new XC_MethodReplacement() { protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable { return ""; } });
|
5.Hook加固通杀
1 2 3 4 5 6 7 8 9
| XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { Context context = (Context) param.args[0]; ClassLoader classLoader = context.getClassLoader(); } });
|
6.Hook变量
静态变量
1 2 3
| final Class clazz = XposedHelpers.findClass("类名", classLoader); XposedHelpers.setStaticIntField(clazz, "变量名", 999);
|
实例变量
1 2 3 4 5 6 7 8 9 10 11
| final Class clazz = XposedHelpers.findClass("类名", classLoader); XposedBridge.hookAllConstructors(clazz, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); Object ob = param.thisObject; XposedHelpers.setIntField(ob,"变量名",9999); } });
|
7.Hook构造函数
有参构造函数
1 2 3 4 5 6 7 8 9 10 11
| XposedHelpers.findAndHookConstructor("com.zj.wuaipojie.Demo", classLoader, String.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); } @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); } });
|
无参构造函数
1 2 3 4 5 6 7 8 9 10
| XposedHelpers.findAndHookConstructor("com.zj.wuaipojie.Demo", classLoader, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); } @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); } });
|
8.主动调用方法
静态方法
1 2
| Class clazz = XposedHelpers.findClass("类名",lpparam.classLoader); XposedHelpers.callStaticMethod(clazz,"方法名",参数(非必须));
|
实例方法
1 2 3
| Class clazz = XposedHelpers.findClass("类名",lpparam.classLoader); XposedHelpers.callMethod(clazz.newInstance(),"方法名",参数(非必须));
|
9.Hook内部类
1 2 3 4 5 6 7 8
| XposedHelpers.findAndHookMethod("com.zj.wuaipojie.Demo$InnerClass", lpparam.classLoader, "innerFunc",String.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param);
} });
|
10.反射
1 2 3 4 5 6 7 8 9 10 11 12
| Class clazz = XposedHelpers.findClass("com.zj.wuaipojie.Demo", lpparam.classLoader); XposedHelpers.findAndHookMethod("com.zj.wuaipojie.Demo$InnerClass", lpparam.classLoader, "innerFunc",String.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); Class democlass = Class.forName("com.zj.wuaipojie.Demo",false,lpparam.classLoader); Method demomethod = democlass.getDeclaredMethod("refl"); demomethod.setAccessible(true); demomethod.invoke(clazz.newInstance()); } });
|
11.字符串赋值定位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| XposedHelpers.findAndHookMethod("android.widget.TextView", lpparam.classLoader, "setText", CharSequence.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); Log.d("zj2595",param.args[0].toString()); if(param.args[0].equals("已过期")){ printStackTrace(); } } }); private static void printStackTrace() { Throwable ex = new Throwable(); StackTraceElement[] stackElements = ex.getStackTrace(); for (int i = 0; i < stackElements.length; i++) { StackTraceElement element = stackElements[i]; Log.d("zj2595","at " + element.getClassName() + "." + element.getMethodName() + "(" + element.getFileName() + ":" + element.getLineNumber() + ")"); } }
|
12.点击事件监听
1 2 3 4 5 6 7 8 9 10 11 12
| Class clazz = XposedHelpers.findClass("android.view.View", lpparam.classLoader); XposedBridge.hookAllMethods(clazz, "performClick", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); Object listenerInfoObject = XposedHelpers.getObjectField(param.thisObject, "mListenerInfo"); Object mOnClickListenerObject = XposedHelpers.getObjectField(listenerInfoObject, "mOnClickListener"); String callbackType = mOnClickListenerObject.getClass().getName(); Log.d("zj2595",callbackType); } });
|
例题演练
1.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
| package com.example.test;
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;
public class Hook implements IXposedHookLoadPackage { @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { if(!loadPackageParam.packageName.equals("com.zj.wuaipojie")){ return; }
XposedHelpers.findAndHookMethod("com.zj.wuaipojie.Demo", loadPackageParam.classLoader, "a", java.lang.String.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); Log.d("zj2595",param.args[0].toString()); param.args[0]="N1ng"; } @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); Log.d("zj2595",param.getResult().toString()); param.setResult("here is N2ng"); } });
} }
|
2.Hook复杂&自定义参数
直接用上面的api,适用于复杂的方法以及参数带有自定义类的方法
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
| package com.example.test;
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;
public class Hook implements IXposedHookLoadPackage { @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { if(!loadPackageParam.packageName.equals("com.zj.wuaipojie")){ return; }
Class a = loadPackageParam.classLoader.loadClass("com.zj.wuaipojie.Demo"); XposedBridge.hookAllMethods(a, "complexParameterFunc", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); Log.d("zj2595",param.args[0].toString());
} });
} }
|
3.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
| package com.example.test;
import android.util.Log;
import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XC_MethodReplacement; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class Hook implements IXposedHookLoadPackage { @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { if(!loadPackageParam.packageName.equals("com.zj.wuaipojie")){ return; }
Class a = loadPackageParam.classLoader.loadClass("com.zj.wuaipojie.Demo"); XposedBridge.hookAllMethods(a,"repleaceFunc",new XC_MethodReplacement() { protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable { return ""; } });
} }
|
利用这个api可以将方法置空
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 3049155267@qq.com