├── README.md └── decrypt.cpp /README.md: -------------------------------------------------------------------------------- 1 | # Honkai-Appdata-Decryptor 2 | A tool to decrypt .unity3d file located in Appdata/LocalLow/miHoYo/Honkai Impact 3/Data/data/... 3 | 4 | 用于解密Appdata/LocalLow/miHoYo/崩坏3/Data/data/...下的unity3d文件的小工具 5 | 6 | Only applicable to files starting with a number. 7 | 8 | 仅适用于以数字开头的文件。 9 | 10 | Usage: decrypt.exe [input] [output] 11 | -------------------------------------------------------------------------------- /decrypt.cpp: -------------------------------------------------------------------------------- 1 | #define _CRT_SECURE_NO_WARNINGS 2 | #include 3 | #include 4 | #include 5 | 6 | int box[624]; 7 | int v3 = 0; 8 | void init(int seed) 9 | { 10 | box[0] = seed; 11 | for (long long i = 1; i != 624; ++i) 12 | { 13 | box[i] = i + 1812433253 * (box[i - 1] ^ (unsigned int)(box[i - 1] >> 30));; 14 | } 15 | } 16 | int getInt() 17 | { 18 | if (v3 == 0) 19 | { 20 | int v2 = 0; 21 | while (1) 22 | { 23 | int v5 = (v2 + 1) % 624; 24 | int v6 = (box[v2]) ^ ((box[v2]) ^ (box[v5])) & 0x7FFFFFFF; 25 | int v7 = (v2 + 397) % 624; 26 | box[v2] = (v6 >> 1) ^ box[v7]; 27 | if ((v6 & 1) != 0) 28 | { 29 | box[v2] ^= 0x9908B0DF; 30 | } 31 | if (++v2 == 624) 32 | break; 33 | } 34 | } 35 | int v4 = box[v3]; 36 | int v5 = v3 + 1; 37 | long long v6 = ((((v4 >> 11) ^ v4) & 0xFF3A58AD) << 7) ^ (v4 >> 11) ^ v4; 38 | long long v7 = (int)((unsigned long long)(3524075731LL * ((int)v3 + 1)) >> 32) >> 9; 39 | int result1 = ((v6 & 0xFFFFDF8C) << 15) ^ v6 ^ ((int)(((v6 & 0xFFFFDF8C) << 15) ^ v6) >> 18); 40 | v3 = v5 - 624 * ((v7 >> 31) + v7); 41 | return result1; 42 | } 43 | char key[0x200]; 44 | char data[0x80]; 45 | char buffer[4096]; 46 | int main(int argc, char** argv) 47 | { 48 | if (argc != 3) 49 | { 50 | printf("Usage: %s [input] [output]", argv[0]); 51 | return -1; 52 | } 53 | 54 | FILE* f = fopen(argv[1], "rb"); 55 | if (!f) 56 | { 57 | printf("Failed to open input file"); 58 | return -1; 59 | } 60 | 61 | int seed = 0; 62 | fread(&seed, sizeof(char), 4, f); 63 | fread(data, sizeof(char), 0x80, f); 64 | init(seed); 65 | 66 | for (int i = 0; i != 128; i++) 67 | { 68 | int number = getInt(); 69 | char* b = (char*)&number; 70 | b[0] ^= data[(i * 4) % 0x80]; 71 | b[1] ^= data[(i * 4 + 7) % 0x80]; 72 | b[2] ^= data[(i * 4 + 13) % 0x80]; 73 | b[3] ^= data[(i * 4 + 11) % 0x80]; 74 | memcpy(&key[i * 4], b, 4); 75 | } 76 | 77 | long long off = getInt(); 78 | 79 | FILE* f2 = fopen(argv[2], "wb"); 80 | if (!f2) 81 | { 82 | printf("Failed to open output file"); 83 | return -1; 84 | } 85 | 86 | while (true) 87 | { 88 | size_t nbytes = fread(buffer, sizeof(char), 4096, f); 89 | 90 | for (int i = 0; i != nbytes; i++) 91 | { 92 | buffer[i] ^= key[(off++) % 0x200]; 93 | } 94 | 95 | fwrite(buffer, sizeof(char), nbytes, f2); 96 | 97 | if (feof(f) || ferror(f)) 98 | break; 99 | } 100 | 101 | fclose(f); 102 | fclose(f2); 103 | return 0; 104 | } 105 | --------------------------------------------------------------------------------