在 Python 中从 Apk 使用和导入 .SO 本机库
Use And Import .SO Native Library From Apk In Python
如何导入和使用从 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()
这是我应该做的吗?还是有别的办法?
您无法在 x86 上加载和执行 ARM 代码 CPU。为此,您需要一个模拟 ARM CPU 的虚拟机。
即使在 Linux ARM 上加载 .so
文件后,您可能仍然缺少一些 Android 依赖项。使用 ldd copied.so
查看哪个。
您可以尝试反编译您的共享对象并将其移植到 x86。为此,您应该在 Ghidra 中加载您的二进制文件并提取除 JNI 初始化等实用函数之外的所有函数,如果需要,这些函数将由编译器自动插入。然后使用您选择的编译器和 IDE 重建,例如 Clion + Clang。如果使用 Android API,请不要忘记修复一些错误并切换到 Windows API。不过,这将需要一些时间和精力,具体取决于函数的数量和二进制文件的大小(再次支持的内容除外)。
如何导入和使用从 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()
这是我应该做的吗?还是有别的办法?
您无法在 x86 上加载和执行 ARM 代码 CPU。为此,您需要一个模拟 ARM CPU 的虚拟机。
即使在 Linux ARM 上加载 .so
文件后,您可能仍然缺少一些 Android 依赖项。使用 ldd copied.so
查看哪个。
您可以尝试反编译您的共享对象并将其移植到 x86。为此,您应该在 Ghidra 中加载您的二进制文件并提取除 JNI 初始化等实用函数之外的所有函数,如果需要,这些函数将由编译器自动插入。然后使用您选择的编译器和 IDE 重建,例如 Clion + Clang。如果使用 Android API,请不要忘记修复一些错误并切换到 Windows API。不过,这将需要一些时间和精力,具体取决于函数的数量和二进制文件的大小(再次支持的内容除外)。