You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:25:09