观察:

用Unity3D制作的游戏,提供的文件太多了,不知道分析哪个。。

开始分析
unity是用C#开发的,用dnSpy来进行分析,
注:dnSpy是分析net程序的反编译工具。

找到一堆dll文件,感觉要分析这些。。太多了啊,分析了好一会,函数又多,

然后就看了其他师傅的wp。。。它们都是分析Assembly-CSharp.dll,也就是第一个dll文件(拖进dnSpy)
Assembly-CSharp.dll
sing System;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
// Token: 0x02000004 RID: 4
public class ButtonSpawnFruit : MonoBehaviour
{
// Token: 0x0600000A RID: 10 RVA: 0x00002110 File Offset: 0x00000310
public static string Md5(string str)
{
byte[] bytes = Encoding.UTF8.GetBytes(str);
byte[] array = MD5.Create().ComputeHash(bytes);
StringBuilder stringBuilder = new StringBuilder();
foreach (byte b in array)
{
stringBuilder.Append(b.ToString("X2"));
}
return stringBuilder.ToString().Substring(0, 20);
}
// Token: 0x0600000B RID: 11 RVA: 0x00002170 File Offset: 0x00000370
public static string Sha1(string str)
{
byte[] bytes = Encoding.UTF8.GetBytes(str);
byte[] array = SHA1.Create().ComputeHash(bytes);
StringBuilder stringBuilder = new StringBuilder();
foreach (byte b in array)
{
stringBuilder.Append(b.ToString("X2"));
}
return stringBuilder.ToString();
}
// Token: 0x0600000C RID: 12 RVA: 0x000021C8 File Offset: 0x000003C8
public void Spawn()
{
FruitSpawner component = GameObject.FindWithTag("GameController").GetComponent<FruitSpawner>();
if (component)
{
if (this.audioSources.Length != 0)
{
this.audioSources[Random.Range(0, this.audioSources.Length)].Play();
}
component.Spawn(this.toSpawn);
string name = this.toSpawn.name;
if (name == "汉堡底" && Init.spawnCount == 0)
{
Init.secret += 997;
}
else if (name == "鸭屁股")
{
Init.secret -= 127;
}
else if (name == "胡罗贝")
{
Init.secret *= 3;
}
else if (name == "臭豆腐")
{
Init.secret ^= 18;
}
else if (name == "俘虏")
{
Init.secret += 29;
}
else if (name == "白拆")
{
Init.secret -= 47;
}
else if (name == "美汁汁")
{
Init.secret *= 5;
}
else if (name == "柠檬")
{
Init.secret ^= 87;
}
else if (name == "汉堡顶" && Init.spawnCount == 5)
{
Init.secret ^= 127;
string str = Init.secret.ToString();
if (ButtonSpawnFruit.Sha1(str) == "DD01903921EA24941C26A48F2CEC24E0BB0E8CC7")
{
this.result = "BJDCTF{" + ButtonSpawnFruit.Md5(str) + "}";
Debug.Log(this.result);
}
}
Init.spawnCount++;
Debug.Log(Init.secret);
Debug.Log(Init.spawnCount);
}
}
// Token: 0x04000005 RID: 5
public GameObject toSpawn;
// Token: 0x04000006 RID: 6
public int spawnCount = 1;
// Token: 0x04000007 RID: 7
public AudioSource[] audioSources;
// Token: 0x04000008 RID: 8
public string result = "";
}
函数分析:
if (ButtonSpawnFruit.Sha1(str) == "DD01903921EA24941C26A48F2CEC24E0BB0E8CC7")
{
this.result = "BJDCTF{" + ButtonSpawnFruit.Md5(str) + "}";
Debug.Log(this.result);
}

解密成功,结果是:1001


public static string Md5(string str)
{
byte[] bytes = Encoding.UTF8.GetBytes(str);
byte[] array = MD5.Create().ComputeHash(bytes);
StringBuilder stringBuilder = new StringBuilder();
foreach (byte b in array)
{
stringBuilder.Append(b.ToString("X2"));
}
return stringBuilder.ToString().Substring(0, 20);
}
- 转化为16进制。
- 大写X:ToString(“X2”)即转化为大写的16进制。
- 小写x:ToString(“x2”)即转化为小写的16进制。
- 2表示输出两位,不足的2位的前面补0,如 0x0A 如果没有2,就只会输出0xA
- 取得前20个字母,Substring是截取字符串
即 flag{B8C37E33DEFDE51CF91E}
至于怎么在那么多文件中找到需要的关键文件,我也搞不懂。。。。
本文分析了使用Unity3D开发的游戏中的Assembly-CSharp.dll文件,详细解读了ButtonSpawnFruit类的功能,包括MD5和SHA1算法的应用及游戏内部计数器的秘密。
5239

被折叠的 条评论
为什么被折叠?



