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