如何使用 Xposed 重定向 Android 中的 .so lib 的负载?

How to redirect the load of .so lib in Android using Xposed?

我有一个包含库的应用程序(例如,"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");
                    }
                }
            });
        }
    }
}

应用程序崩溃,我在 Google 上搜索并找到了这个:System.loadlibrary hook crash 但是当我想像 rovo 所说的那样连接到运行时时,它什么都不做。有人知道任何解决方案吗?

(请不要告诉我有关将 lib 更改为 .apk 的信息,因为如果我想要,我不会问这个 xD)。

您的代码无法运行,因为您挂钩了错误的方法。

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

我想如果您挂钩负责将库名称映射到实际库文件的方法,您可能会更幸运:System.mapLibraryName(String)。 你可以在Runtime.loadLibrary(String, ClassLoader)

中看到它是如何使用的

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