关于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 @ 2020-09-18 23:08  zpchcbd  阅读(516)  评论(0编辑  收藏  举报