关于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成功

posted @   zpchcbd  阅读(531)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
点击右上角即可分享
微信分享提示