可以看到得到的是一个Unity文件
从Lazzaro师傅的blog里可以得到经验
Unity逆向 | Lazzaro 工具 Unity Dll逆向 一般的 Unity3D 游戏的主逻辑都在 Assembly-CSarp.dll 中,所以需要 dll文件逆向/重新打包 工具。Unity3D开发的游戏,其核心代码都在这个 dll 文件中,所以逆向/修改这个 dll 文件就可以了。 ILSpy 用于查看dll程序逻辑。 ILDASM 用于反编译dll文件,生成il文件(存放了dll反编译后的指令)和rehttps://lazzzaro.github.io/2020/12/13/reverse-Unity%E9%80%86%E5%90%91/index.html
Unity Dll逆向
一般的 Unity3D 游戏的主逻辑都在 Assembly-CSarp.dll 中,所以需要 dll文件逆向/重新打包 工具。Unity3D开发的游戏,其核心代码都在这个 dll 文件中,所以逆向/修改这个 dll 文件就可以了。
所以我们在文件夹里找 Assembly-CSarp.dll
这个文件
Unity框架的文件我们用dnspy进行反编译
GameManager看起来像个正经文件,点开来看一下
有“牢大”“flag”的字符串,应该是主函数部分
往下翻看到类似key和密文的东西
跟进一下encryptedData后面的字符串
跳转到加密函数位置,标准TEA加密
结合上文得知:密文={ 3363017039,1247970816,549943836,445086378,3606751618,1624361316,3112717362,705210466,3343515702,2402214294,4010321577,2743404694 }
密钥={ 286331153,286331153,286331153,286331153 }
delta=2654435769
由此构建TEA解密脚本
#include
#include
#include
#include
void Decrypt(uint32_t* data, uint32_t* key)
{
uint32_t v0 = data[0], v1 = data[1];
uint32_t delta = 2654435769;
uint32_t sum = delta * 32; //反过来最后一次的sum,循环32次
for (int i = 0; i < 32; i++)
{
v1 -= ((v0 << 4) + key[2]) ^ (v0 + sum) ^ ((v0 >> 5) + key[3]);
v0 -= ((v1 << 4) + key[0]) ^ (v1 + sum) ^ ((v1 >> 5) + key[1]);
sum -= delta;
}
data[0] = v0;
data[1] = v1;
} //解密函数
int main()
{
uint32_t encryptedData[] =
{ 3363017039,1247970816,549943836,445086378,
3606751618,1624361316,3112717362,705210466,
3343515702,2402214294,4010321577,2743404694 }; //12个
uint32_t key[] = { 286331153,286331153,286331153,286331153 };
for (int i = 0; i < 12; i += 2)
{
Decrypt(&encryptedData[i], key);
}
printf("%s", encryptedData);
return 0;
}
得到 flag{it_is_been_a_long_day_without_you_my_friend}