【问题标题】:Use And Import .SO Native Library From Apk In Python在 Python 中使用和导入来自 Apk 的 .SO 本机库
【发布时间】:2020-01-03 03:36:43
【问题描述】:

如何导入和使用从apk 文件中提取的.SO 文件? 我在 Linux 中使用过 ctypes 库,但每次尝试时都会出错。

.so 文件有 2 个版本:arm64 和 armeabi。 当我尝试导入 32 位 armeabi 版本时,它给了我

wrong ELF class: ELFCLASS32

于是我尝试了 arm64,不知何故我得到了

cannot open shared object file: No such file or directory

我可以向您保证,这不是一个拼写错误的路径,我尝试使用相同的路径复制它。但我无法导入它,因为没有这样的文件。

代码:

import ctypes

def main():

     TestLib = ctypes.CDLL('/home/manalkaff/Desktop/arm64-v8a/nativelibrary.so')

if __name__ == '__main__':

     main()

这是我应该做的吗?还是有别的办法?

【问题讨论】:

  • 您使用什么类型的计算机来运行此代码?你有ARM CPU吗?
  • @kichik 不,我使用虚拟框,因为我无法在 Windows 中使用它,而且我有 x86_64 cpu 架构
  • 您无法在 x86 进程中加载​​和执行 ARM 代码。您需要一个模拟 ARM CPU 的虚拟机。
  • 我怎么不知道,非常感谢。那清楚的事情。在我导入之后我可以使用apk使用的功能吗?
  • 也许吧。它可能缺少来自 Android 的依赖项。使用 ARM Linux 后,您可以通过 ldd my.so 进行检查。

标签: python linux ctypes decompiler android-native-library


【解决方案1】:

您可以尝试反编译并将您的共享对象移植到 x86。为此,您应该在 Ghidra 中加载二进制文件并提取除 JNI 初始化等实用程序之外的所有函数,如果需要,编译器会自动插入这些函数。然后使用您选择的编译器和 IDE(如 Clion + Clang)进行重建。如果使用 Android API,请不要忘记修复一些错误并切换到 Windows API。不过,这将需要一些时间和精力,具体取决于函数的数量和二进制文件的大小(再次支持的东西除外)。

【讨论】:

    【解决方案2】:

    您无法在 x86 CPU 上加载和执行 ARM 代码。为此,您需要一个模拟 ARM CPU 的虚拟机。

    即使在 Linux ARM 上加载 .so 文件后,您仍可能缺少一些 Android 依赖项。使用ldd copied.so 查看哪个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多