有没有办法在Python中运行反编译的apk的类而不实际运行应用程序?

问题描述 投票:0回答:1

我已经使用 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 中使用复制该类代码。 有人可以指导我如何实现这一目标吗? 感谢您的帮助。

python java java-native-interface apk native
1个回答
0
投票

您不能简单地加载为完全不同的处理器编译的库并期望它能够工作。您需要使用 QEMU 设置一个 armeabi-v7a 环境,这样您就有一个可以加载 DLL 的主机进程。

但这还不是全部!这个

performAction
函数要做的第一件事是调用 JVM 函数指针表(也称为
JNIEnv*
)来检索提供的 String 对象的信息。很可能这不是它所进行的“唯一”JVM 调用。因此,您还需要从具有足够相似环境的 JVM 加载此 DLL,以便本机代码不会遇到丢失的类或方法。 总而言之,您需要

远远

多于Python的工具。

© www.soinside.com 2019 - 2024. All rights reserved.