哪里可以解密assembly-csharp.dll?

逆向工程 dll
2021-06-19 00:57:14

所以我有一个安卓游戏。Assembly-CSharp.dll原因.NET Reflector显示

文件不是可移植的可执行文件。DOS 标头不包含“MZ”签名

它是加密的。该应用程序似乎在应用程序启动时解密该程序集。

所以我曾经UltraCompare指出与以前版本相比有什么变化(它没有加密)。

classes.dex是相同的,所以没有更改 Java 代码。
libmain.solibunity.so是一样的,但libmono.so有很大的变化。

有这似乎与加密等相关的一些新添加的符号TEAEncryptTEADecryptTEAEncryptStringTEADecryptString,和一些单库的C#内部调用程序一样ves_icall_System_Security_SecureString_EncryptInternal

如果这是加密的方式,我会问那些函数在哪里调用。

有一些变化Assembly-CSharp-firstpass.dllAssembly-UnityScript.dllAssembly-UnityStript-firstpass.dll一个同样的变化模式我无法弄清楚这是什么意思。

那么Assembly-CSharp.dll在运行时可以在哪里解密呢?或者有没有在运行时解密的另一种方法?

1个回答

Mono 基本上是开源的。所以任何人都可以创建一个 Mono 实现,每当它读取一个 CIL DLL 文件的块时,就会对其应用加密。也许 Unity 提供了一个 libmono.so,它使用最新版本进行加密;也许游戏的供应商自己实现了一些东西。您可以开始查看 Unity 的补丁说明,了解这是否是官方新功能;如果没有,很可能是游戏供应商创建了他们自己的加密 libmono.so。

您的 TEA 函数很可能是在 libmono.so 本身内调用的。如果我必须实现类似的东西,我会编写包装函数TEAopen, TEAread, TEAclosefor fopen, fread,fclose在读取文件时解密,然后用f-*函数替换读取 DLL 的单代码中的TEA-*函数。

TEA 加密适用于 8 字节的块,这可能是这里使用它的原因之一;如果您只想读取文件的一部分,则不需要读取您的部分之前的所有内容,除了填充 8 字节块的几个字节。但这也意味着相同的 8 个输入字节将始终导致相同的 8 个输出字节,如果您的原始 DLL 具有大量 '\0' 字节的区域,它们将导致相同的 8 个字节在加密中一遍又一遍地重复动态链接库。

虽然TEA 有将 128 位密钥转换为 126 位有效位的弱点,但似乎没有已知的明文攻击这意味着,您观察到的相同变化模式对您没有帮助。所以你需要自己从单声道实现中提取密钥。反汇编该文件,尤其是TEAEncryptTEADecrypt函数。它们应该看起来有点像维基百科文章中的代码. 他们的第二个参数是关键;要么尝试找出该密钥的存储/生成位置,要么进行一些动态分析,在这些函数上放置断点,然后检查它们实际获得的参数是什么。另外,检查它是否真的是标准的 TEA 实现,或者是 XTEA 或不同的关键调度常量或其他东西。获得密钥后,找到一个程序,该程序接受一个文件和一个 TEA 密钥并对其进行解密,或者自己动手;这应该不会太难,因为在您选择的任何语言中有很多开源 TEA 实现。