在 Linux 中使用 Android 共享库 (.so) 文件

逆向工程 艾达 拆卸 linux 安卓
2021-06-11 23:31:50

我反编译了一个 APK 文件,该程序在.so文件中包含本机代码

我想.so在 Linux 中使用该文件以使用内联函数。这些代码具有连接到服务器并对传输的数据执行加密/解密的功能。

我也用 IDA Pro 反编译了它。我可以将 ARM 代码反编译并重新编译到 x64 CPU 并在 Linux 中运行吗?

或者,我是否需要一个轻型模拟器来运行该 ARM*.so文件?

IDA Pro反编译代码,我看到了汇编函数,但我不习惯汇编,也不习惯逆向工程。如何将这些函数转换为 C 或 python 函数?

3个回答

首先,提取整个 APK(它是一个重命名的 ZIP)并检查除了 ARM 之外是否没有 x86 版本的二进制文件。这将取决于选择的最佳选项。

以下选项假设您已使用 IDA、Hex-Rays 或 Hopper 等工具分析了二进制文件,并且您可以确定要访问的功能。


如果您需要模拟基于 GLIB 的 Linux 系统和.so面向 Android 的库之间的调用约定,并且模拟架构不是问题,例如因为您在 APK 中有一个 x86 版本的库可用:

  • 一个很常见但有时很痛苦的选择是使用libhybris,这一个围绕 Android 自定义 libc(仿生)调用约定的薄包装器,它允许您从常规 GCC 或 Clang 编译的 GLIBC 程序中调用反向工程 JNI 中的函数。libhybris 的教程并不多,但您会在 Internet 上找到几个依赖于它的开源项目,并将用作示例代码。

    但是,libhybris 将模拟调用约定而不是体系结构。


如果您需要模拟架构和 Android ABI:

  • 你有几个选择,要么在 ARM 主机上运行你的程序部分——这可能是 Android 模拟器、你的智能手机、便宜的 ARM VPS、Raspberry Pi 或其他东西——要么在用户中使用QEMU等模拟器模式(允许您在 chroot 环境中模拟单个 ELF 文件,而无需模拟整个系统)。此外,您可能需要交叉编译您的代码。

如果您需要模拟架构、Android ABI,并且您希望以自己解析 ELF/处理内存布局为代价,更好地控制模拟二进制文件:

  • 另一种选择是使用Unicorn 引擎,这是一个基于 QEMU 代码的库,允许您以类似于使用调试器的方式在外部主机上模拟机器代码,通过读取/写入寄存器、内存和设置断点。

    Unicorn 的 API 是相当裸机的:要使用它,您自己解析elf(5)结构,然后您自己分配和编写二进制文件的相关部分,设置寄存器(PC 用于目标函数,SP 位于指向可用空间,R0、R1 等作为参数,LR 在您设置挂钩的位置)并启动模拟器。您可以在 C 和 Python 中找到一些易于理解的示例

对于反编译 APK 文件,您可以使用不同的工具(https://mobilesecuritywiki.com/)。如果您使用 python,这是最好的:

https://github.com/androguard/androguardhttps://code.google.com/p/androguard/(另见此示例:https://github.com/androguard/androguard/tree/master/demos

您可以为 ARM 反编译,但对于测试,您应该使用 quemu(用于 ARM)或 eclipse。

看一看的NativeFunction API弗里达它可以帮助您调用任何本机函数。通过一点点倒车,你会得到类似的东西

var func = new NativeFunction(Module.findExportByName('libxx.so', 'fun'), 'uint32', []);