安洵杯复现——牢大想你了

发布于 2023-12-24  82 次阅读


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;
}


The world's full of lonely people afraid to make the first move.