[Week 4] MineSweeper
- 首先先用ILSpy反编译
MineSweeper\Minesweeper_Data\Managed\Assembly-CSharp.dll
- 得到的是程序的主代码
- 注意到update是主要的运行逻辑函数(又一次惊人的注意力
- 当游戏win之后会运行crypt函数
- 这个函数通过
Array.Copy(Resources.Load<TextAsset>("enc").bytes, array, 44);
加载enc - 用AssetStudio反编译资源(过程中会有弹窗全选确定就行,时间有点慢
- 然后另存enc,记录十六进制值
- crypt内部使用key字符串用作key
- 返回update看crypt函数的传参,使用了haha字符串用作Key
- 最后手搓解密脚本
def crypt(key: str, Key: bytes, enc: bytes) -> str:
num = 0
array = bytearray(44)
array[:] = enc
Key = bytearray(Key)
key_chars = [ord(c) for c in key]
key_length = len(key_chars)
for i in range(44):
num = (num + key_chars[i % key_length]) % 44
Key[num], Key[i] = Key[i], Key[num]
for num2 in range(43, -1, -1):
array[num2] ^= Key[num2]
return array.decode()
enc = b'\x45\x21\x3E\x08\x57\x31\x09\x4D\x42\x45\x42\x44\x5D\x5A\x4B\x4B\x52\x56\x16\x44\x66\x45\x6C\x40\x57\x44\x33\x35\x51\x75\x0D\x58\x15\x71\x11\x1B\x0B\x08\x76\x04\x4F\x5C\x68\x3c'
key = "0xoX0XOxOXoxGAME"
Key = b"This is: True_KEY!for #0xgAmE_Unity~Cryption"
decrypted_text = crypt(key, Key, enc)
print(decrypted_text)
- 0xGame{36ecd059-b3e7-73c8-fa80-0a2abef3c757}
[Week 4] PyPro
- 一眼pyinstaller打包,执行
python pyinstxtractor.py PyPro.exe
- 然而
uncompyle6
支持3.8以下,尝试发现源码是3.12的,显然不能用 - 这里偷个懒直接用网页了,用工具也是可以的pycdc(附上使用教程,
pycdc.exe PyPro.pyc
编码问题可以输入chcp 65001
- 发现反编译有问题,最终还是用回工具了pycdas
pycdas.exe PyPro.pyc
- 汇编是不可能看懂的,扔给GPT
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
key = bytes.fromhex('0554B134A029DE539438BD18604BF114') # 这里开头要手动补0
target_data = '2e8Ugcv8lKVhL3gkv3grJGNE3UqkjlvKqCgJSGRNHHEk98Kd0wv6s60GpAUsU+8Q'
encrypted_data = base64.b64decode(target_data)
cipher = AES.new(key, AES.MODE_ECB)
decrypted_data = cipher.decrypt(encrypted_data)
try:
flag = unpad(decrypted_data, AES.block_size).decode('utf-8')
print(f"flag: {flag}")
except ValueError:
print("解密失败,填充不正确。")
- 注意下给出的key是31位,会报错,开头补个0就行
- 0xGame{1cb76d38-4900-476f-bf1b-9d59f74d7b2e}
- p.s.其实吧汇编感觉还是能看懂点的(但只有一点点