通过 IDA 从 APK 中提取解密的 Assembly-CSharp.dll

逆向工程 艾达 解密 apk
2021-06-15 10:46:04

我和我的朋友正在尝试从用 Unity3D 编写的 Android 游戏中解密 Assembly-CSharp.dll 文件。通常这些文件在使用 JustDecompile 时是可读的,但这个文件是加密的。

我们设法修改了 APK 使其可调试,并设法让这些东西运行,以便我们可以在 IDA Pro 中调试 APK。到目前为止运行良好,我们还可以设置断点和所有这些东西。

但是在 IDA Pro 中调试 APK 时,我们无法找到客户端解密 Assembly-CSharp.dll 文件的点,因为这似乎发生在 libmono.so 中。下面是加密 DLL 的示例: 在此处输入图片说明

以及它应该是什么样子(来自一个游戏,由我统一制作): 在此处输入图片说明

在对从 APK 加载文件的方式进行了一些调整后,我们能够将 libmono.so 和 libunity.so 加载到 IDA 中,但我们无法调试这些文件。

每当我们要调试它们时,IDA 系统都会告诉我们这些文件不能自行运行。现在我们有 3 种可能的方法来达到我们想要的目标:

  1. 通过调试 classes.dex 文件找到 libmono.so 的正确条目
  2. 加载 libmono.so 或 libunity.so 以逐步跳转到对 Assembly-CSharp.dll 进行解密并提取 DLL 的点(不确定如何执行此操作 ^^)
  3. 找到一种方法将 libmono.so 加载到 IDA 并使用另一个工具对其进行调试(我在这里找到了一个名为 native-shim 的工具,这可能对我们有帮助)。
2个回答

我认为解决方案非常简单,只需稍作调整即可。

要解密文件, 将加密数据与字节异或0xFCC6DC7FDCC7DFE0,您将获得未加密的文件。

您可以通过查看加密文件和有效 dll 来查看此模式。如果您发现应该全为 0 的区域,您会看到一个很容易辨别的重复模式。

似乎加密文件有一个 16 字节的标头,很可能

    4-byte     file-signature  (0x0b25c4fa)
    4-byte     file size
    4-byte     file size (duplicated ?)
    4-byte     flag?

文件的其余部分是加密文件。

有一个小区别.. 至少未加密文件的前 2 个字节以某种方式被破坏以进一步模糊它。对于 dll,首先将前 2 个字节设置为0x4D5A,这样应该可以被某些工具(例如 010Editor)识别。您可能需要使用 DOS_HEADER(dll 的前 64 个字节)结构来查看它是否有意义。

您可能会尝试需要 root 的 GDB gcore。它将转储内存,您可以从转储文件中恢复解密文件 http://www.iandrohacker.net/2015/11/tutorial-how-to-decrypt-encrypted-dll.html