我已经使用 jadx-gui 反编译了一个 apk,我注意到该应用程序在其中一个类中使用了本机库。我只是想看看如何在类中运行方法,而无需在 Android 模拟器中实际运行 apk 文件。我想用 python 编写一个脚本来运行该类方法并返回结果。
反编译后的apk的类代码如下:
package com.test.bap;
import java.util.Base64;
import kotlin.jvm.internal.Intrinsics;
/* loaded from: classes.dex */
public final class JniBridge {
static {
if ("btap".length() > 0) {
System.loadLibrary("btap");
}
}
private final native byte[] performAction(int i, String str);
public final String a(String... params) {
String encodeToString = Base64.getEncoder().withoutPadding().encodeToString(performAction(12345, params[0]));
return encodeToString;
}
}
我尝试使用以下代码加载库,但它不起作用。
from ctypes import *
libc = CDLL(r"C:\Program Files (x86)\Nox\bin\1\recompile\resources\lib\armeabi-v7a\libbtap.so")
print(type(libc))
但出现错误:
File "C:\Python311\Lib\ctypes\__init__.py", line 376, in __init__
self._handle = _dlopen(self._name, mode)
^^^^^^^^^^^^^^^^^^^^^^^^^
OSError: [WinError 193] %1 is not a valid Win32 application
我已经能够在 Android 模拟器中挂钩到应用程序,并使用对象挂钩监视方法查看输入参数和返回值。但是,我想用 Python 编写此代码,并且不想在 Android 模拟器中运行该应用程序。我只想在 Python 中使用复制该类代码。 有人可以指导我如何实现这一目标吗? 感谢您的帮助。
您不能简单地加载为完全不同的处理器编译的库并期望它能够工作。您需要使用 QEMU 设置一个 armeabi-v7a 环境,这样您就有一个可以加载 DLL 的主机进程。
但这还不是全部!这个
performAction
函数要做的第一件事是调用 JVM 函数指针表(也称为 JNIEnv*
)来检索提供的 String 对象的信息。很可能这不是它所进行的“唯一”JVM 调用。因此,您还需要从具有足够相似环境的 JVM 加载此 DLL,以便本机代码不会遇到丢失的类或方法。
总而言之,您需要远远多于Python的工具。