如何在Python中运行反编译APK的JNI类方法(无需模拟器)
问题:无需Android模拟器调用APK中的JNI方法
我用jadx-gui反编译了一个APK,发现其中的JniBridge类调用了名为libbtap.so的原生库,希望在不启动Android模拟器运行APK的前提下,编写Python脚本调用该类的a方法并获取返回结果。
反编译得到的JniBridge类代码
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; } }
尝试的Python代码及报错
尝试的代码
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
我曾通过Objection Hook在模拟器中监控该方法的参数和返回值,但现在想在Python中实现无需模拟器的调用,恳请指导解决方案。
解决方案
错误原因
你加载的libbtap.so是**ARM架构(armeabi-v7a)**的原生库,而Windows是x86/x64架构,不同架构的二进制文件无法直接兼容,因此ctypes加载失败。
可行解决路径
1. 使用QEMU模拟ARM环境运行Python
QEMU可以模拟ARM架构的Linux环境,在该环境中可以正常加载ARM原生库:
- 下载ARM架构的Linux镜像(如Debian ARM),用QEMU启动镜像并安装Python环境
- 将
libbtap.so传到镜像中,按照JNI方法的命名规则编写调用脚本:from ctypes import * import base64 # 加载ARM原生库 lib = CDLL("./libbtap.so") # 定义JNI方法的参数与返回值(JNI方法命名规则:Java_包名_类名_方法名) jni_method = lib.Java_com_test_bap_JniBridge_performAction jni_method.argtypes = [c_void_p, c_void_p, c_int, c_char_p] jni_method.restype = POINTER(c_byte) # 模拟调用(简单场景下JNIEnv和jobject可传NULL,部分库不校验) param = b"your_input_param" result_ptr = jni_method(None, None, 12345, param) # 解析返回的字节数组 result_bytes = [] idx = 0 while True: current_byte = result_ptr[idx] if current_byte == 0: break result_bytes.append(current_byte) idx += 1 raw_result = bytes(result_bytes) # 执行与Java方法一致的Base64无填充编码 final_result = base64.b64encode(raw_result).decode('utf-8').rstrip('=') print(final_result) - 注意:如果
libbtap.so依赖Android系统库(如libandroid.so、liblog.so),需要从Android模拟器/设备中提取对应库,在QEMU中设置LD_LIBRARY_PATH指定依赖库路径。
2. 逆向分析libbtap.so直接实现逻辑
如果performAction的业务逻辑不复杂,可以用IDA Pro或Ghidra逆向分析函数功能,直接在Python中复现对应的计算逻辑,无需调用原生库。该方法需要具备基础的逆向工程能力。
3. 使用Android NDK工具链
利用Android NDK的ARM交叉编译工具链,在Windows上编译能调用libbtap.so的程序,或使用NDK提供的模拟器环境。该方法复杂度较高,需熟悉NDK的使用流程。
内容的提问来源于stack exchange,提问作者Drew
相关产品推荐
相关产品推荐

