关于Xposed模块编写
前言:先不研究Xposed原理(盲猜是Inline Hook),自己也不懂,跟着学习编写Xposed模块就可以了,以后再补上
这里自己简单的创建一个工程,在MainActivity写一个简单的登陆验证,接下来通过编写Xposed来进行对账号密码的HOOK
登陆验证的代码实现:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn1 = findViewById(R.id.button); et1 = findViewById(R.id.editText); et2 = findViewById(R.id.editText2); btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { logintest(et1.getText().toString(), et2.getText().toString()); } }); } public void logintest(String username, String password){ if(username.equals("admin") && password.equals("123456")){ Toast.makeText(MainActivity.this, "登陆成功", Toast.LENGTH_SHORT).show(); } }
这里学习下Xposed模块的编写:
1、在新创建的android工程Project中创建一个lib目录,然后放入对应版本的XposedBridgeApi-xx.jar,这里用的模拟器是安卓5.1版本,所以放入54的版本进行测试,最后还需要修改gradle的compile为provided(编译的时候用到依赖相应的jar包 但是打包为apk的时候不会进行参与)
2、然后再AndroidManifest文件中的application标签中加入如下内容
<meta-data android:name="xposedmodule" android:value="true"/> <!-- true会加载这个模块尝试hook --> <meta-data android:name="xposeddescription" android:value="HookTest"/> <!-- 这是模块描述 --> <meta-data android:name="xposedminversion" android:value="54"/> <!-- XposedBridgeApi版本号 -->
3、回到app/src/main/java/xxx.xxx.xxx(包名)/包名下创建一个类,类名随意(这里创建的类名为Test),代码为如下:
import android.content.Context; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.callbacks.XC_LoadPackage; import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; public class Test implements IXposedHookLoadPackage { @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { try{ if (loadPackageParam.packageName.equals("com.example.loginhooktest")){//要hook的包名 findAndHookMethod("com.example.loginhooktest.MainActivity",loadPackageParam.classLoader,"logintest", new XC_MethodHook(){ protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable { } protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable { Class aClass = param.thisObject.getClass(); XposedBridge.log("要hook的方法所在的类:" + aClass.getName()); //通过反射 // Field field[] = aClass.getDeclaredFields(); // for(Field test:field){ // XposedBridge.log("存在的Field:" + test.toString()); // } // Field field= aClass.getDeclaredField("et2"); field.setAccessible(true); EditText et2 = (EditText) field.get(param.thisObject); String str = et2.getText().toString(); XposedBridge.log("劫持到的密码:" + str); } }); //要hook的类名以及方法名,如果有参数,在方法名后面写参数类型与参数个数,例如int.class或String.class或Context.class,有几个写几个,没有就不写。 } } catch (Exception e){ e.printStackTrace(); } } }
5、在AS项目的app文件夹上点击右键,选择 NEW
-> Folder
-> Assets Folder
,选择 main
,点击ok
6、来到app/src/main/Assets
,右键Assets选择NEW,创建一个File,命名为xposed_init
,里面的内容是hook模块的入口点,本例中的包名以及入口点是com.example.xposedtest.Test 所以这个文件里就写了这个,具体你们的包名是什么,类名是什么,你们自己更改
7、然后打开Xposed选中自己刚才安装的Xposed编写的模块,还需要进行重启模块才会生效
8、查看Xposed的日志,发现HOOK成功
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY