首页 > 解决方案 > 如何使用 Xposed 在 Android 中重定向 .so lib 的负载?

问题描述

我有一个包含 lib 的应用程序(例如,“test.so”),我想将该 .so 的负载重定向到另一个由我修改的“test.so”,我尝试使用 Xposed 进行任何操作,例如:

public class xposed implements IXposedHookLoadPackage {
    public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
        if (lpparam.packageName.equals("package")) {
            findAndHookMethod("java.lang.System", lpparam.classLoader, "loadLibrary", String.class, new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param){
                    XposedBridge.log("(before) Loaded library: " + param.args[0]);
                    if (param.args[0].toString().equals("test")){
                        System.load("/data/data/package/modified_test.so");
                    }
                }
            });
        }
    }
}

该应用程序崩溃了,我在谷歌上搜索并发现了这个:System.loadlibrary hook crash但是当我想像 rovo 一样挂钩运行时时说它什么都不做。有人知道任何解决方案吗?

(请不要告诉我有关将 lib 更改为 .apk 的事情,因为如果我愿意,我没有问这个 xD)。

标签: androidxposedxposed-framework

解决方案


您的代码无法工作,因为您使用了错误的方法。

System.loadlibrary期望作为参数的库名称没有文件路径,没有前置lib和没有文件扩展名。因此,如果您将参数替换"/data/data/package/modified_test.so"为示例中所示的参数,则库加载将不起作用。

我假设如果您将负责将库名称映射到实际库文件的方法挂钩,您可能会更幸运:System.mapLibraryName(String). 您可以在Runtime.loadLibrary(String, ClassLoader)中看到它是如何使用的

为此,请使用afterHookedMethod,检查结果值并使用修改后的库的路径覆盖返回值。


推荐阅读