如何逆向工程 android APK 中的 .so 文件?

逆向工程 拆卸 二元分析 混淆 安卓 去混淆
2021-07-07 00:14:45

我知道如何使用诸如 APK-tool 和 dex2jar 之类的工具对普通的 android APK 进行逆向工程,但我不知道如何进行混淆处理。任何人都可以帮助或至少提供一些指示吗?我知道这在很大程度上构成了我自己的学习,但我真的不知道该看什么或该看哪里。一些例子真的很有帮助。谢谢!

编辑:

当我从 APK 中提取所有内容时,我得到了一些 SMALI 文件(我尝试了 JD-GUI,但字符串包含随机名称。可能使用 Proguard 进行了混淆。)、一些资源文件和 lib 目录中的“.so”文件。如何分析“.so”文件。我知道 SO 文件是 Linux 世界的一种 DLL,但是可用于分析 SO 文件的工具是什么。任何视频链接都会非常有帮助。:)

另外,如果 APK 中有 JAR 文件而不是 SO 文件,我该如何解决?

4个回答

.so 文件是一个编译库,在大多数情况下来自 C 或 C++ 源代码。.so 代表共享对象,它与混淆没有任何关系,它只是意味着有人用 C 编写了部分应用程序。

在某些情况下,存在现有的 C 代码,程序员更容易构建 JNI 接口以从 java 调用库;在其他情况下,程序员希望编译的 C 比 java 具有速度优势。当然,如果我想隐藏我的应用程序的某些部分是如何工作的,用 C 编写并将其编译为 .so 会使反转变得更加困难。

如果您想反转 android .so,您可以选择以下选项:

  • 购买商业版 IDA pro。演示版本不会,因为它们不能反汇编 ARM 代码。这很昂贵,但迄今为止是处理未知目标代码的最佳工具。
  • 如果该应用程序包含适用于不同硬件的 .so 版本,并且它具有适用于 x86 上的 android 库,则您可以使用免费的 IDA 5.1 版本对其进行反汇编。
  • 如果您可以访问 linux 系统,请获取包含 objdump 的 ARM 的 gcc 工具链,并使用 objdump --disassemble 获取包含反汇编代码的巨大文本文件。然后,享受那个文本文件的乐趣。也可能有适用于在 Windows 上运行的 ARM 目标的 gcc 工具链,但我从未尝试过。
  • 如果您不想安装 gcc 工具链,也可以将 .so 文件上传到http://onlinedisassembler.com/以获取反汇编文件。

但是请注意,在所有这些情况下,您都需要彻底了解 ARM 处理器体系结构、汇编语言、JNI 约定和编译器 ABI,才能理解反汇编。如果您没有经验,请准备好度过许多漫长的夜晚。

除了 Guntram 的建议之外,请查看可重定向反编译器,又名 retdec它可以将二进制文件反编译为 Python 或 C 代码。至少对我来说,它比纯汇编更容易阅读(并且适用于 ARM 二进制文件)。

它非常适合为您勾画共享对象的粗略工作。

存在用于选择 IDA 版本的插件,但主要限制是它不支持 64 位代码。

您还可以通过挂钩 API 并观察参数和返回值来尝试动态方法。这将允许您查看进入加密 API 的数据,这在处理网络协议时可能会有很大帮助。查看Frida 仪器工具包以获取开源跨平台解决方案(Android、iOS、Windows、Mac 和 Linux)。有一个教程展示了如何在几分钟内构建一个交互式检测工具,该工具将代码注入 iOS 上的“Yo”应用程序并使用 Google 地图绘制网络连接。

使用 android-ndk,https://developer.android.com/ndk/downloads/index.html

您可以使用 ndk 中的工具链来执行您想要的反汇编类型。例如,如果我反编译一个 apk 并从中得到一个 .so 库,我会这样做:

./android-ndk-r15b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-objdump -T "SAMPLE.so | less

要获得一个objdump.