
前言
上次发了一篇文章是 利用 UnityExplorer 获取某八个按键的音乐游戏国服的三个加密数值,但是这个方案需要你能够启动游戏,并且已经打好了MelonLoader,而本方案只需要一个 Assembly-CSharp.dll 即可,不需要启动游戏,缺点是需要脱壳。
正文
1.下载并安装 dnSpy 或 ILSpy
https://github.com/dnSpy/dnSpy/releases
https://github.com/icsharpcode/ILSpy/releases
下载上面任意一个即可,或者选一个你喜欢的或者电脑上有的,需要选择适合你系统的版本。
2.获取脱壳后的 Assembly-CSharp.unpack.dll
众所周知 SEGA 的大部分游戏都有 HyperTech Crackproof 的壳,这意味着无法直接逆向工程,需要先脱壳。
如果你不希望脱壳,你可以直接使用 UnityExplorer 获取 AesKey,AesIV,ObfuscateParam。指路:利用 UnityExplorer 获取某八个按键的音乐游戏国服的三个加密数值
讲真想要脱这种壳真的不难,如果你有脱壳工具的话可以使用你自己的脱壳工具,或者使用一些在线工具比如 https://senbei.momokko.moe/。
将文件拖入里面之后点击 Unpack 按钮即可,得到的文件就是脱壳后的 Assembly-CSharp.unpack.dll。
3.进行逆向得到 AesKey,AesIV,ObfuscateParam(dnSpy)
将 Assembly-CSharp.unpack.dll 拖入 dnSpy 中打开,随后在左侧列表依次展开 Assembly-CSharp -> Assembly-CSharp.dll -> Net -> CipherAES。
随后点击 CipherAES ,随后在右侧的窗口中找到 private static readonly string AesKey 和 private static readonly string AesIV ,这两个就是我们需要的AesKey和AesIV
大概是长这样
using System;using System.Security.Cryptography;using System.Text;using MAI2.Util;
namespace Net{ // Token: 0x02000233 RID: 563 internal class CipherAES : Singleton<CipherAES> { // Token: 0x06001681 RID: 5761 RVA: 0x0009474C File Offset: 0x0009474C public static byte[] Encrypt(byte[] data) { byte[] result; using (AesManaged aesManaged = new AesManaged()) { // ... } return result; }
// Token: 0x06001682 RID: 5762 RVA: 0x000947DC File Offset: 0x000947DC public static byte[] Decrypt(byte[] encryptData) { byte[] result; using (AesManaged aesManaged = new AesManaged()) { // ... } return result; }
// Token: 0x04000FA1 RID: 4001 private static readonly int BLOCK_SIZE = 128;
// Token: 0x04000FA2 RID: 4002 private static readonly int KEY_SIZE = 256;
// Token: 0x04000FA3 RID: 4003 private static readonly string AesKey = "************************";
// Token: 0x04000FA4 RID: 4004 private static readonly string AesIV = "************************"; }}这样就得到了 AesKey 和 AesIV。
如果不希望自己翻的话还是在左侧的列表中可以直接找到 AesIV
AES Key:
// Token: 0x04000FA3 RID: 4003private static readonly string AesKey = "************************";AES IV:
// Token: 0x04000FA4 RID: 4004private static readonly string AesIV = "************************";ObfuscateParam:
// Token: 0x040013D7 RID: 5079protected static string ObfuscateParam = "********";注意 ObfuscateParam 不在 Net -> CipherAES 中,需要切换到 Net -> Net.Packet -> Packet -> ObfuscateParam 中

4.进行逆向得到 AesKey,AesIV,ObfuscateParam(ILSpy)
和上面的操作差不多,用 ILSpy 打开 Assembly-CSharp.unpack.dll ,随后在左侧列表依次展开 Assembly-CSharp.unpack (0.0.0.0,.NETFramework,v4.0) -> Net -> CipherAES,点击 CipherAES ,随后在右侧的窗口中找到 private static readonly string AesKey 和 private static readonly string AesIV ,这两个就是我们需要的AesKey和AesIV。
AES Key / IV:
// Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=nullusing System.Security.Cryptography;using System.Text;using MAI2.Util;using Net;
internal class CipherAES : Singleton<CipherAES>{ private static readonly int BLOCK_SIZE = 128;
private static readonly int KEY_SIZE = 256;
private static readonly string AesKey = "************************";
private static readonly string AesIV = "************************";
public static byte[] Encrypt(byte[] data) { // ... }
public static byte[] Decrypt(byte[] encryptData) { // ... }}ObfuscateParam:
// Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=nullprotected static string ObfuscateParam = "********";注意 ObfuscateParam 不在 Net -> CipherAES 中,需要切换到 Net -> Net.Packet -> Packet -> ObfuscateParam 中

常见问题
-
Q:我在 dnSpy / ILSpy 中没有找到 AesKey AesIV 和 ObfuscateParam,这是为什么?
A: 你可能没有找到正确的类,或者没有找到正确的字段。请检查一下你的类是否正确,或者检查一下你的字段是否正确。
-
Q:为啥我看到的内容和你的不一样?
A: 你可能选错了语言类型,在 dnSpy / ILSpy 中需要选择C#,不过其实都差不多只要你能找到 AesKey AesIV 和 ObfuscateParam 就可以了。
分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
最后更新于 ,距今已过 28 天
部分内容可能已过时