VMOS Cloud API
  • 简体中文
  • English
  • 简体中文
  • English
  • 产品介绍
  • 产品类型
  • 产品计费
  • OpenAPI
    • 接口文档
    • 错误码
    • 实例属性列表
    • 安卓改机属性列表
  • Android端 SDK
    • 示例搭建
    • 接口说明
    • 回调函数
    • 错误码
    • 更新日志
  • Web H5端 SDK
    • 示例搭建
    • 接口说明
    • 回调函数
    • 错误码
    • 更新日志
  • Windows PC端 SDK
    • 示例搭建
    • 接口说明
    • 回调函数
    • 更新日志
  • 端侧与云机通信开发
    • AIDL接入方式
    • 系统服务API(aidl)
  • 类XP、LSP Hook框架
  • 相关协议

简介

类Xposed、LSPosed框架的插件加载系统,支持Java和Native Hook。

示例

1.Hook 普通App

准备

  • 被HookApp
  • Hook插件apk
  • 连接设备终端执行apmt指令加载Hook插件
被HookApp内容
public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("test");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        Log.d("___TestApp___", "call onCreate");
        Log.d("___TestApp___", "call stringFromJNI(\"haha\") return:" + stringFromJNI("haha"));
        Log.d("___TestApp___", "call add(10, 5) return:" + add(10, 5));
        Log.d("___TestApp___", "call add(1, 5) return:" + add(1, 5));
    }

    public native String stringFromJNI(String str);

    public native int add(int a, int b);
}
Hook插件内容
public class Entry {

    private static final String TAG = "___HKAPP___";
    private static Context globalContext;

    public static void appMain(ClassLoader loader, Context context, String appClass, String pkg, String process) {
        Log.d(TAG, "appClass=" + appClass + ", filesDir=" + context.getFilesDir() + ", pid=" + Process.myPid() + ", process=" + process);
        if (process.contains("sandboxed_process")) {
            return;//webview相关的暂时忽略
        }
        if (pkg.equals("com.armcloud.testapp")) {
            try {
                Log.d(TAG, "do hookTestApp");
                Class<?> MainActivity = loader.loadClass("com.armcloud.testapp.MainActivity");
                XSHelpers.findAndHookMethod(MainActivity, "stringFromJNI", String.class, new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        super.beforeHookedMethod(param);
                        Log.d(TAG, "call MainActivity->stringFromJNI arg=" + param.args[0]);
                    }

                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        super.afterHookedMethod(param);
                        Log.d(TAG, "call stringFromJNI return:" + param.getResult());
                        param.setResult("byebye");
                    }
                });

                // android.app.Activity
                XSHelpers.findAndHookMethod(Activity.class, "onCreate", Bundle.class, new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        super.beforeHookedMethod(param);
                        Log.d(TAG, "call MainActivity->onCreate:" + param.args[0]);
                    }
                });
                Log.d(TAG, "exit hookTestApp");
            } catch (Exception e) {
                Log.d(TAG, "hookTestApp failed:\n" + Log.getStackTraceString(e));
            }
        }
    }
}
执行apmt命令加载插件

将Hook插件apk导入到手机(此处导入到SD卡路径)

添加插件

提示"add Patch:appdemo success"表示插件添加成功。
还可以通过"apmt patch list"查看插件是否添加成功:

运行被Hook apk, 开启logcat, 验证结果:

可以看到hook插件中打印的日志,表示hook成功。

2.Hook SystemServer

准备

  • Hook插件apk
  • 连接设备终端执行apmt指令加载Hook插件
Hook插件内容
public class Entry {
    private static final String TAG = "___HK_SysServer___";

    public static void systemMain(ClassLoader classLoader, String pkg, String processName) {
        doHook(classLoader);
    }

    private static void doHook(ClassLoader classLoader) {
        try {

            @SuppressLint("PrivateApi")
            Class<?> timingsTraceAndSlog = classLoader.loadClass("com.android.server.utils.TimingsTraceAndSlog");
            XSHelpers.findAndHookMethod("com.android.server.SystemServer", classLoader, "startBootstrapServices",
                    timingsTraceAndSlog, new XC_MethodHook() {
                        @Override
                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                            super.beforeHookedMethod(param);
                            Log.d(TAG, "before call startBootstrapServices");
                        }

                        @Override
                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                            super.afterHookedMethod(param);
                            Log.d(TAG, "after call startBootstrapServices");
                        }
                    });
            Log.d(TAG, "load system hook ok");
        } catch (Exception ex) {
            ex.printStackTrace();
            Log.d(TAG, "doHook failed:" + Log.getStackTraceString(ex));
        }
    }
}
执行apmt命令加载插件

将Hook插件apk导入到手机(此处导入到SD卡路径)

添加插件
注:Hook SystemServer -p 需要指定为 "android"

重启设备,开启logcat,验证结果:

可以看到hook插件中打印的日志,表示hook成功。

名词介绍

1.插件操作命令

该框架使用“apmt命令”操作插件。

2.插件

通过“自定义插件”编写Hook插件,使用插件操作命令加载插件。

apmt命令

必要参数

apmt patch

基础操作

1.添加补丁包

apmt patch add -n test -p com.armcloud.testapp -f /sdcard/test.apk

2.删除补丁包

apmt patch del -n test

3.查询补丁包

apmt patch list

4.查看帮助信息

apmt patch help

全部参数

参数描述
-n插件名称
-p需要应用插件的应用包名
-u需要通过url下载插件时,传入下载链接
-f使用本地插件时,传入插件文件路径

自定义插件

1. Hook普通app

  • 入口类必须命名为:androidx.app.Entry
  • 入口方法必须命名为: public static void appMain( ClassLoader loader, //类加载器 Context context, //上下文 String appClass, //包名 String process //进程名 )

2.Hook SystemServer

  • 入口类必须命名为:androidx.app.Entry
  • 入口方法必须命名为: public static void systemMain( ClassLoader classLoader, //类加载器 String pkg, //包名,默认是android String processName //进程名 )

Demo下载

点击下载 ArmCloudXposeDemo

Prev
端侧与云机通信开发
Next
相关协议