7b d5 3e 89 5d 0a 53 70 04 d5 c2 45 34 9c 7f 37 4c 63 af 4f 62 63 buf = SHA1(Name); int i = 0; for (; i < len(buf) - 1; i++) { buf[i] = ((buf[i] & 0xF0) >> 4) | ((buf[i] & 0xF) << 4); buf[i] ^= buf[i + 1]; } buf[i] = ((buf[i] & 0xF0) >> 4) | ((buf[i] & 0xF) << 4); ;----------------------------------------------------------- Name.Init IL_0000: call System.Text.Encoding get_ASCII()/System.Text.Encoding IL_0005: ldarg.0 IL_0006: ldfld System.String p_name/Game.Name IL_000b: callvirt Byte[] GetBytes(System.String)/System.Text.Encoding IL_0010: stloc.0 IL_0011: newobj Void .ctor()/System.Security.Cryptography.SHA1Managed IL_0016: stloc.1 IL_0017: ldloc.1 IL_0018: callvirt Void Initialize()/System.Security.Cryptography.HashAlgorithm IL_001d: ldarg.0 IL_001e: ldloc.1 IL_001f: ldloc.0 IL_0020: callvirt Byte[] ComputeHash(Byte[])/System.Security.Cryptography.HashAlgorithm IL_0025: stfld Byte[] p_data/Game.Name ;p_data contains SHA1(Name); IL_002a: ldc.i4.0 IL_002b: stloc.2 ; loc.2 = 0 IL_002c: br.s IL_0075 IL_002e: ldarg.0 IL_002f: ldfld Byte[] p_data/Game.Name IL_0034: ldloc.2 IL_0035: ldarg.0 IL_0036: ldfld Byte[] p_data/Game.Name IL_003b: ldloc.2 IL_003c: ldelem.u1 IL_003d: ldc.i4 240 IL_0042: and IL_0043: ldc.i4.4 IL_0044: shr ; (p_data[loc.2] & 0xF0) >> 4 IL_0045: ldarg.0 IL_0046: ldfld Byte[] p_data/Game.Name IL_004b: ldloc.2 IL_004c: ldelem.u1 IL_004d: ldc.i4.s 15 IL_004f: and IL_0050: ldc.i4.4 IL_0051: shl ; (p_data[loc.2] & 0xF) << 4 IL_0052: or ; ((p_data[loc.2] & 0xF0) >> 4) | ((p_data[loc.2] & 0xF) << 4) IL_0053: conv.u1 IL_0054: stelem.i1 ; p_data[loc.2] = ((p_data[loc.2] & 0xF0) >> 4) | ((p_data[loc.2] & 0xF) << 4) IL_0055: ldarg.0 IL_0056: ldfld Byte[] p_data/Game.Name IL_005b: ldloc.2 IL_005c: ldarg.0 IL_005d: ldfld Byte[] p_data/Game.Name IL_0062: ldloc.2 IL_0063: ldelem.u1 IL_0064: ldarg.0 IL_0065: ldfld Byte[] p_data/Game.Name IL_006a: ldloc.2 IL_006b: ldc.i4.1 IL_006c: add ; IL_006d: ldelem.u1 ; p_data[loc.2 + 1] IL_006e: xor IL_006f: conv.u1 IL_0070: stelem.i1 ; p_data[loc.2] ^= p_data[loc.2 + 1] IL_0071: ldloc.2 IL_0072: ldc.i4.1 IL_0073: add IL_0074: stloc.2 ; loc.2++ IL_0075: ldloc.2 IL_0076: ldarg.0 IL_0077: ldfld Byte[] p_data/Game.Name IL_007c: ldlen IL_007d: conv.i4 IL_007e: ldc.i4.1 IL_007f: sub IL_0080: blt.s IL_002e IL_0082: ldarg.0 IL_0083: ldfld Byte[] p_data/Game.Name IL_0088: ldarg.0 IL_0089: ldfld Byte[] p_data/Game.Name IL_008e: ldlen IL_008f: conv.i4 IL_0090: ldc.i4.1 IL_0091: sub IL_0092: ldarg.0 IL_0093: ldfld Byte[] p_data/Game.Name IL_0098: ldarg.0 IL_0099: ldfld Byte[] p_data/Game.Name IL_009e: ldlen IL_009f: conv.i4 IL_00a0: ldc.i4.1 IL_00a1: sub IL_00a2: ldelem.u1 IL_00a3: ldc.i4 240 IL_00a8: and IL_00a9: ldc.i4.4 IL_00aa: shr IL_00ab: ldarg.0 IL_00ac: ldfld Byte[] p_data/Game.Name IL_00b1: ldarg.0 IL_00b2: ldfld Byte[] p_data/Game.Name IL_00b7: ldlen IL_00b8: conv.i4 IL_00b9: ldc.i4.1 IL_00ba: sub IL_00bb: ldelem.u1 IL_00bc: ldc.i4.s 15 IL_00be: and IL_00bf: ldc.i4.4 IL_00c0: shl IL_00c1: or IL_00c2: conv.u1 IL_00c3: stelem.i1 IL_00c4: ret ;----------------------------------------------------------- for (int j = 0; j + 15 < len(p_index); j += 5) { for (int i = 0; i < len(buf); i++) { BYTE b0 = (buf[i] & 0xF0) >> 4; BYTE b1 = buf[i] & 0xF; BYTE b2 = p_index[b0 + j]; p_index[b0 + j] = p_index[b1 + j]; p_index[b1 + j] = b2; } } Name.Process: IL_0000: nop IL_0001: ldarg.1 IL_0002: callvirt Int32[] GetIndex()/Game.TheGame IL_0007: stloc.s V_4 ; V_4 = Game.TheGame.GetIndex() IL_0009: ldc.i4.0 IL_000a: stloc.3 ; loc.3 = 0 IL_000b: br.s IL_006b IL_000d: nop IL_000e: ldc.i4.0 IL_000f: stloc.s V_5 ; V_5 = 0 IL_0011: br.s IL_0054 IL_0013: nop IL_0014: ldarg.0 IL_0015: ldfld Byte[] p_data/Game.Name IL_001a: ldloc.s V_5 IL_001c: ldelem.u1 ; p_data[V_5] IL_001d: ldc.i4 240 IL_0022: and ; p_data[V_5] & 0xF0 IL_0023: ldc.i4.4 IL_0024: shr ; (p_data[V_5] & 0xF0) >> 4 IL_0025: stloc.0 ; loc.0 = (p_data[V_5] & 0xF0) >> 4 IL_0026: ldarg.0 IL_0027: ldfld Byte[] p_data/Game.Name IL_002c: ldloc.s V_5 IL_002e: ldelem.u1 IL_002f: ldc.i4.s 15 IL_0031: and IL_0032: stloc.1 ; loc.1 = p_data[V_5] & 0xF ; IL_0033: ldloc.s V_4 IL_0035: ldloc.0 IL_0036: ldloc.3 IL_0037: add ; loc.0 + loc.3 IL_0038: ldelem.i4 IL_0039: stloc.2 ; loc.2 = V_4[loc.0 + loc.3] ; IL_003a: ldloc.s V_4 IL_003c: ldloc.0 IL_003d: ldloc.3 IL_003e: add ; V_4, loc.0 + loc.3 IL_003f: ldloc.s V_4 ; V_4, loc.0 + loc.3, V_4, IL_0041: ldloc.1 IL_0042: ldloc.3 IL_0043: add ; V_4, loc.0 + loc.3, V_4, loc.0 + loc.3 IL_0044: ldelem.i4 ; V_4, loc.0 + loc.3, V_4[loc.1 + loc.3] IL_0045: stelem.i4 ; V_4[loc.0 + loc.3] = V_4[loc.1 + loc.3] IL_0046: ldloc.s V_4 IL_0048: ldloc.1 IL_0049: ldloc.3 IL_004a: add IL_004b: ldloc.2 IL_004c: stelem.i4 ; V_4[loc.1 + loc.3] = loc.2 IL_004d: nop IL_004e: ldloc.s V_5 IL_0050: ldc.i4.1 IL_0051: add IL_0052: stloc.s V_5 ; V_5++ IL_0054: ldloc.s V_5 IL_0056: ldarg.0 IL_0057: ldfld Byte[] p_data/Game.Name IL_005c: ldlen IL_005d: conv.i4 IL_005e: clt IL_0060: stloc.s V_6 IL_0062: ldloc.s V_6 IL_0064: brtrue.s IL_0013 IL_0066: ldloc.3 IL_0067: ldc.i4.5 IL_0068: add IL_0069: stloc.3 ; loc.3 += 5 IL_006a: nop IL_006b: ldloc.3 IL_006c: ldc.i4.s 15 IL_006e: add ; loc.3 + 15 IL_006f: ldloc.s V_4 IL_0071: ldlen IL_0072: conv.i4 IL_0073: clt ; compare len(V_4) : loc.3 + 15 IL_0075: stloc.s V_6 IL_0077: ldloc.s V_6 IL_0079: brtrue.s IL_000d IL_007b: ldarg.1 IL_007c: ldloc.s V_4 IL_007e: callvirt Void SetIndex(Int32[])/Game.TheGame IL_0083: nop IL_0084: ret ;----------------------------------------------------------- Serial.Process loc.2 = game_p_data loc.3 = game_p_index V_4 = 0; V_5 = 0; V_6 = true; while (V_5 < len(serial_p_data)) { loc.0 = (serial_p_data[V_5] & 0xF0) >> 4; loc.1 = serial_p_data[V_5] & 0xF; game_p_data[game_p_index[V_4] = loc.0; V_4++; if (len(serial_p_data) >= V_5) V_6 = false; else V_6 = V_4 < len(game_p_index); if (!V_6) break; game_p_data[game_p_index[V_4] = loc.1; V_4++; V_5 = V_4 / 2 V_6 = true } ;---- IL_0000: nop IL_0001: ldarg.1 IL_0002: callvirt Byte[] GetData()/Game.TheGame IL_0007: stloc.2 ; loc.2 = game_p_data IL_0008: ldarg.1 IL_0009: callvirt Int32[] GetIndex()/Game.TheGame IL_000e: stloc.3 ; loc.3 = game_p_index IL_000f: ldc.i4.0 IL_0010: stloc.s V_4 ; V_4 = 0 IL_0012: ldc.i4.0 IL_0013: stloc.s V_5 ; V_5 = 0 IL_0015: br.s IL_008c IL_0017: nop IL_0018: ldloc.s V_5 IL_001a: ldarg.0 IL_001b: ldfld Byte[] p_data/Game.Serial IL_0020: ldlen IL_0021: conv.i4 IL_0022: clt ; compare len(serial_p_data) : V_5 IL_0024: stloc.s V_6 IL_0026: ldloc.s V_6 IL_0028: brtrue.s IL_002c IL_002a: br.s IL_0091 ; jump END IL_002c: ldarg.0 IL_002d: ldfld Byte[] p_data/Game.Serial IL_0032: ldloc.s V_5 IL_0034: ldelem.u1 ; serial_p_data[V_5] IL_0035: ldc.i4 240 IL_003a: and ; serial_p_data[V_5] & 0xF0 IL_003b: ldc.i4.4 IL_003c: shr ; IL_003d: conv.u1 IL_003e: stloc.0 ; loc.0 = (serial_p_data[V_5] & 0xF0) >> 4 IL_003f: ldarg.0 IL_0040: ldfld Byte[] p_data/Game.Serial IL_0045: ldloc.s V_5 IL_0047: ldelem.u1 IL_0048: ldc.i4.s 15 IL_004a: and IL_004b: conv.u1 IL_004c: stloc.1 ; loc.1 = serial_p_data[V_5] & 0xF IL_004d: ldloc.2 IL_004e: ldloc.3 IL_004f: ldloc.s V_4 IL_0051: ldelem.i4 ; loc.2, loc.3[V_4] IL_0052: ldloc.0 ; loc.2, loc.3[V_4], loc.0 IL_0053: stelem.i1 ; loc.2[loc.3[V_4] = loc.0 IL_0054: ldloc.s V_4 IL_0056: ldc.i4.1 IL_0057: add IL_0058: stloc.s V_4 ; V_4++ IL_005a: ldloc.s V_5 IL_005c: ldarg.0 IL_005d: ldfld Byte[] p_data/Game.Serial IL_0062: ldlen IL_0063: conv.i4 IL_0064: bge.s IL_006f ; len(serial_p_data) >= V_5 ?? IL_0066: ldloc.s V_4 IL_0068: ldloc.3 IL_0069: ldlen IL_006a: conv.i4 IL_006b: clt ; compare len(loc.3) : V_4 IL_006d: br.s IL_0070 IL_006f: ldc.i4.0 IL_0070: stloc.s V_6 ; V_6 = (? 0 ? ?? ) IL_0072: ldloc.s V_6 IL_0074: brtrue.s IL_0078 IL_0076: br.s IL_0091 ; jump END IL_0078: ldloc.2 IL_0079: ldloc.3 IL_007a: ldloc.s V_4 IL_007c: ldelem.i4 IL_007d: ldloc.1 ; loc.2, loc.3[V_4], loc.1 IL_007e: stelem.i1 ; loc.2[loc.3[V_4] = loc.1 IL_007f: ldloc.s V_4 IL_0081: ldc.i4.1 IL_0082: add IL_0083: stloc.s V_4 ; V_4++ IL_0085: ldloc.s V_4 IL_0087: ldc.i4.2 IL_0088: div ; V_4 / 2 IL_0089: stloc.s V_5 ; V_5 = V_4 / 2 IL_008b: nop IL_008c: ldc.i4.1 IL_008d: stloc.s V_6 ; V_6 = 1 IL_008f: br.s IL_0017 IL_0091: ldarg.1 IL_0092: ldloc.2 IL_0093: callvirt Void SetData(Byte[])/Game.TheGame IL_0098: nop IL_0099: ret ;----------------------------------------------------------- Game.Check loc2 = 0 while (loc2 < p_data_column) { loc1 = 0 loc0 = 0 loc3 = p_data_column * loc2 while (loc3 < (loc2 + 1) * p_data_row) { loc1 = (1 << (game_p_data[loc3] & 0x1F)) >> 1 if (loc1 > 256) return false; if (loc1 == loc0 & loc1) return false; loc0 |= loc1 loc3++ } loc1 = ~(loc0 ^ -512) if (loc1 != 0) return false; loc2++ } IL_0000: nop IL_0001: ldc.i4.0 IL_0002: stloc.2 ; loc.2 = 0 IL_0003: br IL_008f IL_0008: nop IL_0009: ldc.i4.0 IL_000a: dup IL_000b: stloc.1 ; loc.1 = 0 IL_000c: stloc.0 ; loc.0 = 0 IL_000d: ldloc.2 IL_000e: ldarg.0 IL_000f: ldfld Int32 p_data_column/Game.TheGame IL_0014: mul IL_0015: stloc.3 ; loc.3 = p_data_column * loc.2 IL_0016: br.s IL_005c IL_0018: nop IL_0019: ldc.i4 256 IL_001e: ldc.i4.1 IL_001f: ldarg.0 IL_0020: ldfld Byte[] p_data/Game.TheGame IL_0025: ldloc.3 IL_0026: ldelem.u1 ; 256, 1, game_p_data[loc.3] IL_0027: ldc.i4.s 31 ; 256, 1, game_p_data[loc.3], 0x1F IL_0029: and ; 256, 1, game_p_data[loc.3] & 0x1F IL_002a: shl ; 256, 1 << (game_p_data[loc.3] & 0x1F) IL_002b: ldc.i4.1 ; IL_002c: shr ; 256, (1 << (game_p_data[loc.3] & 0x1F)) >> 1 IL_002d: dup IL_002e: stloc.1 ; loc.1 = (1 << (game_p_data[loc.3] & 0x1F)) >> 1 IL_002f: clt ; compare 256 < loc.1 -> 1 IL_0031: ldc.i4.0 IL_0032: ceq ; compare result to 0 IL_0034: stloc.s V_5 IL_0036: ldloc.s V_5 IL_0038: brtrue.s IL_003f IL_003a: ldc.i4.0 IL_003b: stloc.s V_4 IL_003d: br.s IL_00ab ; jump END IL_003f: ldloc.1 IL_0040: ldloc.0 IL_0041: ldloc.1 ; loc.1, loc.0, loc.1 IL_0042: and ; loc.1, loc.0 & loc.1 IL_0043: ceq ; compare eq == -> 1 IL_0045: ldc.i4.0 IL_0046: ceq IL_0048: stloc.s V_5 IL_004a: ldloc.s V_5 IL_004c: brtrue.s IL_0053 IL_004e: ldc.i4.0 IL_004f: stloc.s V_4 ; return 0 IL_0051: br.s IL_00ab ; jump END IL_0053: ldloc.0 IL_0054: ldloc.1 IL_0055: or IL_0056: stloc.0 ; loc.0 = loc.0 | loc.1 IL_0057: nop IL_0058: ldloc.3 IL_0059: ldc.i4.1 IL_005a: add IL_005b: stloc.3 ; loc.3++ IL_005c: ldloc.3 IL_005d: ldloc.2 IL_005e: ldc.i4.1 IL_005f: add ; loc.3, loc.2 + 1 IL_0060: ldarg.0 IL_0061: ldfld Int32 p_data_row/Game.TheGame IL_0066: mul ; loc.3, (loc.2 + 1) * p_data_row IL_0067: clt ; compare loc.3 : (loc.2 + 1) * p_data_row IL_0069: stloc.s V_5 IL_006b: ldloc.s V_5 IL_006d: brtrue.s IL_0018 IL_006f: ldc.i4.0 ; 0 IL_0070: ldloc.0 ; 0, loc.0 IL_0071: conv.i8 IL_0072: ldc.i4 -512 ; 0, loc.0, -512 IL_0077: conv.u8 IL_0078: xor ; 0, loc.0 ^ -512 IL_0079: not ; 0, ~(loc.0 ^ -512) IL_007a: conv.i4 IL_007b: dup IL_007c: stloc.1 ; loc.1 = ~(loc.0 ^ -512) IL_007d: ceq ; compare 0 : ~(loc.0 ^ -512) IL_007f: stloc.s V_5 IL_0081: ldloc.s V_5 IL_0083: brtrue.s IL_008a IL_0085: ldc.i4.0 IL_0086: stloc.s V_4 ; return 0 IL_0088: br.s IL_00ab ; jump END IL_008a: nop IL_008b: ldloc.2 IL_008c: ldc.i4.1 IL_008d: add IL_008e: stloc.2 ; loc.2++ IL_008f: ldloc.2 IL_0090: ldarg.0 IL_0091: ldfld Int32 p_data_column/Game.TheGame IL_0096: clt ; compare p_data_column : loc.2 IL_0098: stloc.s V_5 IL_009a: ldloc.s V_5 IL_009c: brtrue IL_0008 ; if loc.2 < p_data_column then IL_0008 IL_00a1: ldarg.0 IL_00a2: call Boolean CheckC()/Game.TheGame IL_00a7: stloc.s V_4 IL_00a9: br.s IL_00ab IL_00ab: ldloc.s V_4 IL_00ad: ret ;----------------------------------------------------------- Game.CheckC IL_0000: nop IL_0001: ldc.i4.0 IL_0002: stloc.2 IL_0003: br IL_008e IL_0008: nop IL_0009: ldc.i4.0 IL_000a: dup IL_000b: stloc.1 IL_000c: stloc.0 IL_000d: ldloc.2 IL_000e: stloc.3 IL_000f: br.s IL_005a IL_0011: nop IL_0012: ldc.i4 256 IL_0017: ldc.i4.1 IL_0018: ldarg.0 IL_0019: ldfld Byte[] p_data/Game.TheGame IL_001e: ldloc.3 IL_001f: ldelem.u1 IL_0020: ldc.i4.s 31 IL_0022: and IL_0023: shl IL_0024: ldc.i4.1 IL_0025: shr IL_0026: dup IL_0027: stloc.1 IL_0028: clt IL_002a: ldc.i4.0 IL_002b: ceq IL_002d: stloc.s V_5 IL_002f: ldloc.s V_5 IL_0031: brtrue.s IL_0038 IL_0033: ldc.i4.0 IL_0034: stloc.s V_4 IL_0036: br.s IL_00aa IL_0038: ldloc.1 IL_0039: ldloc.0 IL_003a: ldloc.1 IL_003b: and IL_003c: ceq IL_003e: ldc.i4.0 IL_003f: ceq IL_0041: stloc.s V_5 IL_0043: ldloc.s V_5 IL_0045: brtrue.s IL_004c IL_0047: ldc.i4.0 IL_0048: stloc.s V_4 IL_004a: br.s IL_00aa IL_004c: ldloc.0 IL_004d: ldloc.1 IL_004e: or IL_004f: stloc.0 IL_0050: nop IL_0051: ldloc.3 IL_0052: ldarg.0 IL_0053: ldfld Int32 p_data_row/Game.TheGame IL_0058: add IL_0059: stloc.3 IL_005a: ldloc.3 IL_005b: ldarg.0 IL_005c: ldfld Int32 p_data_column/Game.TheGame IL_0061: ldarg.0 IL_0062: ldfld Int32 p_data_row/Game.TheGame IL_0067: mul IL_0068: clt IL_006a: stloc.s V_5 IL_006c: ldloc.s V_5 IL_006e: brtrue.s IL_0011 IL_0070: ldc.i4 4808 IL_0075: ldloc.0 IL_0076: ldc.i4 4919 IL_007b: xor IL_007c: ceq IL_007e: stloc.s V_5 IL_0080: ldloc.s V_5 IL_0082: brtrue.s IL_0089 IL_0084: ldc.i4.0 IL_0085: stloc.s V_4 IL_0087: br.s IL_00aa IL_0089: nop IL_008a: ldloc.2 IL_008b: ldc.i4.1 IL_008c: add IL_008d: stloc.2 IL_008e: ldloc.2 IL_008f: ldarg.0 IL_0090: ldfld Int32 p_data_column/Game.TheGame IL_0095: clt IL_0097: stloc.s V_5 IL_0099: ldloc.s V_5 IL_009b: brtrue IL_0008 IL_00a0: ldarg.0 IL_00a1: call Boolean Check33()/Game.TheGame IL_00a6: stloc.s V_4 IL_00a8: br.s IL_00aa IL_00aa: ldloc.s V_4 IL_00ac: ret ;----------------------------------------------------------- ;----------------------------------------------------------- ;-----------------------------------------------------------