1.思路:
最开始看这道题的时候一打开属实把我搞蒙了,因为之前做的游戏题很多都是修改数值的,这道题考的点便是纯逆向,当时做的时候思路方向是对的,但是还是差了一点,没能找到健米的地方,现在来复盘一下:
首先因为是游戏题,以我目前的学习的知识俩看,我想的是这些函数有关的应该会放在dll文件里面,所以我们就要用dnspy去分析函数:
2.找到所需的dll文件:
按照以下的路径去寻找:
这一个dll文件应该就是所有的dll文件的一个汇总(查询资料可以得知,unity游戏的主逻辑模块代码静态编辑之后存储于Assembly-CSharp.dll文件中)
然后用dnspy打开这一个文件:
按照以下的步骤去寻找加密函数,有混淆,就从没被混淆的类入手,寻找public未被混淆的类,跟进去(说实话不知道为什么要这样)
然后这一块的加密是一个TEA加密,用一个脚本解出:
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
// Function to decrypt the data using the provided key
void Decrypt(uint32_t* data, uint32_t* key)
{
uint32_t v0 = data[0], v1 = data[1];
uint32_t delta = 0x9e3779b9;
uint32_t sum = delta * 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[] = { 0xc873914f, 0x4a628600, 0x20c77a1c, 0x1a877aaa, 0xd6faa982, 0x60d1c964, 0xb9884c32, 0x2a08a862, 0xc74a0036, 0x8f2ee196, 0xef08a6a9, 0xa3850896 };
uint32_t key[] = { 0x11111111, 0x11111111, 0x11111111, 0x11111111 };
int dataSize = sizeof(encryptedData) / sizeof(encryptedData[0]);
// Decrypt the data
for (int i = 0; i < dataSize; i += 2)
{
Decrypt(&encryptedData[i], key);
}
// Convert decrypted data to ASCII characters
int decryptedSize = dataSize * 4 + 1;
char* decryptedString = (char*)malloc(decryptedSize);
memset(decryptedString, 0, decryptedSize);
for (int i = 0; i < dataSize; i++)
{
char* bytes = (char*)&encryptedData[i];
decryptedString[i * 4] = bytes[0];
decryptedString[i * 4 + 1] = bytes[1];
decryptedString[i * 4 + 2] = bytes[2];
decryptedString[i * 4 + 3] = bytes[3];
}
// Print the decrypted string
printf("Decrypted String: %s\n", decryptedString);
free(decryptedString); // Free the dynamically allocated memory
return 0;
}
Comments | NOTHING