Advertisement
Guest User

Untitled

a guest
Nov 25th, 2015
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 31.13 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.InteropServices;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace DecryptFatalPacket
  9. {
  10.     class Program
  11.     {
  12.         static void Main(string[] args)
  13.         {
  14.             // Yêu cầu đưa vào tên nhân vật
  15.             var playerName = "BeXi";
  16.  
  17.             // Tập giải mã trước để xác định đúng Logic
  18.             var packetText =
  19.                 "42655869202020202020202020202020202020202020202020202020202020006958654220202020396F6E44ED813729A2310BC04239EBDF3C00A0AB3CC8CD826F6E26ADA81DEFAD33CE4940EE0478B2C9B673058ABE71FA4C3E856250BDE50D88730E2A1595CA1225C68E7A5B780EF3175A2281D7D32446E2F9";
  20.  
  21.  
  22.             Console.WriteLine(packetText.Length / 2);
  23.             var packetData = HexStringToByte(packetText);
  24.  
  25.             var packetLength = packetData.Length;
  26.  
  27.             // Phần đầu của Packet chứa chữ gồm Tên Nhân vật và dòng đảo ngược
  28.             var firstPacketPart = new byte[41];
  29.             Array.Copy(packetData, firstPacketPart, 41);
  30.  
  31.             // 5 biến Int đầu tiên
  32.             var int1 = BitConverter.ToInt32(packetData, 40);
  33.             var int2 = BitConverter.ToInt32(packetData, 44);
  34.             var int3 = BitConverter.ToInt32(packetData, 48);
  35.             var int4 = BitConverter.ToInt32(packetData, 52);
  36.             var verifyLength = BitConverter.ToInt16(packetData, 56); // Chỉ 2 bytes thôi
  37.  
  38.             // Build Array chua cac so tren
  39.             var intArray = new byte[18];
  40.             Array.Copy(packetData, 40, intArray, 0, 18);
  41.  
  42.             // 4 byte tiep
  43.             var intArray2 = new byte[16];
  44.  
  45.             // Phần sau của Packet
  46.             var decryptLength = packetLength - 58;
  47.             var endPacketPart = new byte[decryptLength];
  48.             Array.Copy(packetData, 58, endPacketPart, 0, decryptLength ); // Copy phần sau của Packet
  49.  
  50.             // Tìm vị trí của bye 00 đầu tiên
  51.             byte v10 = 1;
  52.             var startIndex = 0;
  53.             do
  54.             {
  55.                 v10 = firstPacketPart[startIndex++];
  56.  
  57.             } while (v10 != 0);
  58.  
  59.             // Sau khi tìm xong đảm bảo nó không nằm ở vị trí vượt quá 40
  60.             // Dòng này đảm bảo số 0 nằm đúng ở vị trí thứ 41 (mảng lấy 40 kí tự đầu thì số ở 41)
  61.             var v11 = startIndex; // v11 = 0x1F, startIndex = 0x20
  62.             if (v11 - 1 > 39)
  63.             {
  64.                 Console.WriteLine("Decrypt Failed here, return result 2");
  65.                 return;
  66.             }
  67.  
  68.             var firstPacket1FLength = new byte[v11];
  69.             Array.Copy(firstPacketPart, firstPacket1FLength, v11);
  70.  
  71.  
  72.             var tempArray1 = new byte[240];
  73.             var tempArray2 = new byte[240];
  74.             var tempArray3 = new byte[240];
  75.  
  76.             var result = Generate16BytesKey(ref tempArray2, firstPacket1FLength, 256);
  77.             DecryptPacketMessage(ref tempArray2, result, intArray, ref intArray2);
  78.  
  79.             var result1 = Generate16BytesKey(ref tempArray1, firstPacket1FLength, 256);
  80.  
  81.             var v14 = decryptLength/16;
  82.             if (decryptLength % 16 > 0)
  83.             {
  84.                 v14++;
  85.             }
  86.  
  87.             var v33 = v14*16;
  88.  
  89.             if (v14 > 0)
  90.             {
  91.                 var count = v14;
  92.                 var v15 = 0;
  93.                
  94.                 do
  95.                 {
  96.                     // 1 lan lay 16 byte dua vao ma hoa
  97.                     // Bắt buộc phải là 16 byte
  98.                     byte[] bDecrypt = new byte[16];
  99.                     Array.Copy(endPacketPart, v15, bDecrypt, 0, 16);
  100.  
  101.                     // Đoạn này thử nghiệm sinh Key
  102.                     // Lấy 16 bytes chưa mã hóa làm Key, rồi sinh từ mảng tempArray ra cái gì
  103.                     //var clearKey = new byte[16];
  104.                     //Array.Copy(firstPacketPart, v15, clearKey, 0, 16);
  105.                     //DecryptPacketMessage(ref tempArray1, result1, clearKey, ref intArray2);
  106.                     DecryptPacketMessage(ref tempArray1, result1, bDecrypt, ref intArray2);
  107.  
  108.                     Array.Copy(intArray2, 0, tempArray3, v15, 16);
  109.  
  110.                     v15 += 16;
  111.                     count--;
  112.                 } while (count > 0);
  113.  
  114.             }
  115.  
  116.             var length1E = v11 - 1;
  117.             var firstPacketString = Encoding.GetEncoding(1258).GetString(firstPacketPart, 0, length1E);
  118.             var decryptPacketString = Encoding.GetEncoding(1258).GetString(tempArray3, 0, length1E);
  119.  
  120.             // Compare together
  121.             if (firstPacketString != decryptPacketString)
  122.             {
  123.                 Console.WriteLine("Message decrypt fail, userName=%s(%s) namelen=%d", firstPacketString, decryptPacketString, v11);
  124.                 result = -3;
  125.             }
  126.             else // Successful
  127.             {
  128.                 var v21 = -1;
  129.  
  130.                 if (verifyLength <= v33)
  131.                 {
  132.                     if (verifyLength >= v33 - 16)
  133.                     {
  134.                         v21 = verifyLength - 40;
  135.                     }
  136.                 }
  137.                 else
  138.                 {
  139.                     v21 = v33 - 40;
  140.                 }
  141.  
  142.                 // 5x4 bytes = 20 bytes, 5 so int
  143.                 Console.WriteLine(v21);
  144.  
  145.                 var rInt1 = BitConverter.ToUInt32(tempArray3, 40);
  146.                 var rInt2 = BitConverter.ToUInt32(tempArray3, 44); // 2 bytes nay giong nhau, chac de verify hoac Type
  147.                 var rInt3 = BitConverter.ToUInt32(tempArray3, 48);
  148.                 var rInt4 = BitConverter.ToUInt32(tempArray3, 52);
  149.                 var rInt5 = BitConverter.ToUInt32(tempArray3, 56);
  150.                 var rInt6 = BitConverter.ToUInt32(tempArray3, 60);
  151.  
  152.  
  153.                 Console.WriteLine("{0:X}, {1:X}, {2:X}, {3:X}, {4:X}", rInt1, rInt2, rInt3, rInt4, rInt5);
  154.  
  155.             }
  156.  
  157.             Console.WriteLine(v11);
  158.  
  159.  
  160.             Console.WriteLine(StaticArray.dwA139F0.Length);
  161.             Console.WriteLine("{0:X}", StaticArray.dwA139F0[0x20]);
  162.  
  163.             Console.ReadLine();
  164.         }
  165.  
  166.         private static void DecryptPacketMessage(ref byte[] arrData, int length, byte[] intArray, ref byte[] intArray2)
  167.         {
  168.             var intData = GetIntsArray(arrData);
  169.  
  170.             var int1 = (uint)(intData[0] ^ (intArray[3] ^ ((intArray[2] ^ ((intArray[1] ^ (intArray[0] << 8)) << 8)) << 8)));
  171.             //var int1 = (uint)(intData[0] ^ BitConverter.ToUInt32(intArray.Take(4).Reverse().ToArray(), 0));
  172.             var int2 = (uint)(intData[1] ^ (intArray[7] ^ ((intArray[6] ^ ((intArray[5] ^ (intArray[4] << 8)) << 8)) << 8)));
  173.             var int3 = (uint)(intData[2] ^ (intArray[11] ^ ((intArray[10] ^ ((intArray[9] ^ (intArray[8] << 8)) << 8)) << 8)));
  174.             var int4 = (uint)(intData[3] ^ (intArray[15] ^ ((intArray[14] ^ ((intArray[13] ^ (intArray[12] << 8)) << 8)) << 8)));
  175.  
  176.             //var temp = StaticArray.dwA145F0[(int3 >> 8) & 0xFF];
  177.             //var a = StaticArray.dwA141F0[(int4 >> 16) & 0xFF];
  178.             //var b = StaticArray.dwA13DF0[(int1 >> 24)];
  179.             //var c = StaticArray.dwA149F0[int2 & 0xFF];
  180.             //temp ^= a;
  181.             //temp ^= b;
  182.             //temp ^= c;
  183.             //temp ^= intData[4];
  184.             //Console.WriteLine(temp);
  185.             //Console.WriteLine(a);
  186.             var int11 = intData[4] ^ StaticArray.dwA149F0[int2 & 0xFF] ^ StaticArray.dwA13DF0[int1 >> 24] ^ StaticArray.dwA145F0[(int3 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int4 >> 16) & 0xFF];
  187.             var int12 = intData[5] ^ StaticArray.dwA149F0[int3 & 0xFF] ^ StaticArray.dwA13DF0[int2 >> 24] ^ StaticArray.dwA145F0[(int4 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int1 >> 16) & 0xFF];
  188.             var int13 = intData[6] ^ StaticArray.dwA149F0[int4 & 0xFF] ^ StaticArray.dwA13DF0[int3 >> 24] ^ StaticArray.dwA145F0[(int1 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int2 >> 16) & 0xFF];
  189.             var int14 = intData[7] ^ StaticArray.dwA149F0[int1 & 0xFF] ^ StaticArray.dwA13DF0[int4 >> 24] ^ StaticArray.dwA145F0[(int2 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int3 >> 16) & 0xFF];
  190.  
  191.             var int21 = intData[8] ^ StaticArray.dwA149F0[int12 & 0xFF] ^ StaticArray.dwA13DF0[int11 >> 24] ^ StaticArray.dwA145F0[(int13 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int14 >> 16) & 0xFF];
  192.             var int22 = intData[9] ^ StaticArray.dwA149F0[int13 & 0xFF] ^ StaticArray.dwA13DF0[int12 >> 24] ^ StaticArray.dwA145F0[(int14 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int11 >> 16) & 0xFF];
  193.             var int23 = intData[10] ^ StaticArray.dwA149F0[int14 & 0xFF] ^ StaticArray.dwA13DF0[int13 >> 24] ^ StaticArray.dwA145F0[(int11 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int12 >> 16) & 0xFF];
  194.             var int24 = intData[11] ^ StaticArray.dwA149F0[int11 & 0xFF] ^ StaticArray.dwA13DF0[int14 >> 24] ^ StaticArray.dwA145F0[(int12 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int13 >> 16) & 0xFF];
  195.  
  196.             var int31 = intData[12] ^ StaticArray.dwA149F0[int22 & 0xFF] ^ StaticArray.dwA13DF0[int21 >> 24] ^ StaticArray.dwA145F0[(int23 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int24 >> 16) & 0xFF];
  197.             var int32 = intData[13] ^ StaticArray.dwA149F0[int23 & 0xFF] ^ StaticArray.dwA13DF0[int22 >> 24] ^ StaticArray.dwA145F0[(int24 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int21 >> 16) & 0xFF];
  198.             var int33 = intData[14] ^ StaticArray.dwA149F0[int24 & 0xFF] ^ StaticArray.dwA13DF0[int23 >> 24] ^ StaticArray.dwA145F0[(int21 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int22 >> 16) & 0xFF];
  199.             var int34 = intData[15] ^ StaticArray.dwA149F0[int21 & 0xFF] ^ StaticArray.dwA13DF0[int24 >> 24] ^ StaticArray.dwA145F0[(int22 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int23 >> 16) & 0xFF];
  200.  
  201.             var int41 = intData[16] ^ StaticArray.dwA149F0[int32 & 0xFF] ^ StaticArray.dwA13DF0[int31 >> 24] ^ StaticArray.dwA145F0[(int33 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int34 >> 16) & 0xFF];
  202.             var int42 = intData[17] ^ StaticArray.dwA149F0[int33 & 0xFF] ^ StaticArray.dwA13DF0[int32 >> 24] ^ StaticArray.dwA145F0[(int34 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int31 >> 16) & 0xFF];
  203.             var int43 = intData[18] ^ StaticArray.dwA149F0[int34 & 0xFF] ^ StaticArray.dwA13DF0[int33 >> 24] ^ StaticArray.dwA145F0[(int31 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int32 >> 16) & 0xFF];
  204.             var int44 = intData[19] ^ StaticArray.dwA149F0[int31 & 0xFF] ^ StaticArray.dwA13DF0[int34 >> 24] ^ StaticArray.dwA145F0[(int32 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int33 >> 16) & 0xFF];
  205.  
  206.             var int51 = intData[20] ^ StaticArray.dwA149F0[int42 & 0xFF] ^ StaticArray.dwA13DF0[int41 >> 24] ^ StaticArray.dwA145F0[(int43 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int44 >> 16) & 0xFF];
  207.             var int52 = intData[21] ^ StaticArray.dwA149F0[int43 & 0xFF] ^ StaticArray.dwA13DF0[int42 >> 24] ^ StaticArray.dwA145F0[(int44 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int41 >> 16) & 0xFF];
  208.             var int53 = intData[22] ^ StaticArray.dwA149F0[int44 & 0xFF] ^ StaticArray.dwA13DF0[int43 >> 24] ^ StaticArray.dwA145F0[(int41 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int42 >> 16) & 0xFF];
  209.             var int54 = intData[23] ^ StaticArray.dwA149F0[int41 & 0xFF] ^ StaticArray.dwA13DF0[int44 >> 24] ^ StaticArray.dwA145F0[(int42 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int43 >> 16) & 0xFF];
  210.  
  211.             var int61 = intData[24] ^ StaticArray.dwA149F0[int52 & 0xFF] ^ StaticArray.dwA13DF0[int51 >> 24] ^ StaticArray.dwA145F0[(int53 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int54 >> 16) & 0xFF];
  212.             var int62 = intData[25] ^ StaticArray.dwA149F0[int53 & 0xFF] ^ StaticArray.dwA13DF0[int52 >> 24] ^ StaticArray.dwA145F0[(int54 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int51 >> 16) & 0xFF];
  213.             var int63 = intData[26] ^ StaticArray.dwA149F0[int54 & 0xFF] ^ StaticArray.dwA13DF0[int53 >> 24] ^ StaticArray.dwA145F0[(int51 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int52 >> 16) & 0xFF];
  214.             var int64 = intData[27] ^ StaticArray.dwA149F0[int51 & 0xFF] ^ StaticArray.dwA13DF0[int54 >> 24] ^ StaticArray.dwA145F0[(int52 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int53 >> 16) & 0xFF];
  215.  
  216.             var int71 = intData[28] ^ StaticArray.dwA149F0[int62 & 0xFF] ^ StaticArray.dwA13DF0[int61 >> 24] ^ StaticArray.dwA145F0[(int63 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int64 >> 16) & 0xFF];
  217.             var int72 = intData[29] ^ StaticArray.dwA149F0[int63 & 0xFF] ^ StaticArray.dwA13DF0[int62 >> 24] ^ StaticArray.dwA145F0[(int64 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int61 >> 16) & 0xFF];
  218.             var int73 = intData[30] ^ StaticArray.dwA149F0[int64 & 0xFF] ^ StaticArray.dwA13DF0[int63 >> 24] ^ StaticArray.dwA145F0[(int61 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int62 >> 16) & 0xFF];
  219.             var int74 = intData[31] ^ StaticArray.dwA149F0[int61 & 0xFF] ^ StaticArray.dwA13DF0[int64 >> 24] ^ StaticArray.dwA145F0[(int62 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int63 >> 16) & 0xFF];
  220.  
  221.             var int81 = intData[32] ^ StaticArray.dwA149F0[int72 & 0xFF] ^ StaticArray.dwA13DF0[int71 >> 24] ^ StaticArray.dwA145F0[(int73 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int74 >> 16) & 0xFF];
  222.             var int82 = intData[33] ^ StaticArray.dwA149F0[int73 & 0xFF] ^ StaticArray.dwA13DF0[int72 >> 24] ^ StaticArray.dwA145F0[(int74 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int71 >> 16) & 0xFF];
  223.             var int83 = intData[34] ^ StaticArray.dwA149F0[int74 & 0xFF] ^ StaticArray.dwA13DF0[int73 >> 24] ^ StaticArray.dwA145F0[(int71 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int72 >> 16) & 0xFF];
  224.             var int84 = intData[35] ^ StaticArray.dwA149F0[int71 & 0xFF] ^ StaticArray.dwA13DF0[int74 >> 24] ^ StaticArray.dwA145F0[(int72 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int73 >> 16) & 0xFF];
  225.  
  226.             var int91 = intData[36] ^ StaticArray.dwA149F0[int82 & 0xFF] ^ StaticArray.dwA13DF0[int81 >> 24] ^ StaticArray.dwA145F0[(int83 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int84 >> 16) & 0xFF];
  227.             var int92 = intData[37] ^ StaticArray.dwA149F0[int83 & 0xFF] ^ StaticArray.dwA13DF0[int82 >> 24] ^ StaticArray.dwA145F0[(int84 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int81 >> 16) & 0xFF];
  228.             var int93 = intData[38] ^ StaticArray.dwA149F0[int84 & 0xFF] ^ StaticArray.dwA13DF0[int83 >> 24] ^ StaticArray.dwA145F0[(int81 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int82 >> 16) & 0xFF];
  229.             var int94 = intData[39] ^ StaticArray.dwA149F0[int81 & 0xFF] ^ StaticArray.dwA13DF0[int84 >> 24] ^ StaticArray.dwA145F0[(int82 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int83 >> 16) & 0xFF];
  230.  
  231.             if (length > 10)
  232.             {
  233.                 var temp1 = intData[40] ^ StaticArray.dwA149F0[int92 & 0xFF] ^ StaticArray.dwA13DF0[int91 >> 24] ^ StaticArray.dwA145F0[(int93 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int94 >> 16) & 0xFF];
  234.                 var temp2 = intData[41] ^ StaticArray.dwA149F0[int93 & 0xFF] ^ StaticArray.dwA13DF0[int92 >> 24] ^ StaticArray.dwA145F0[(int94 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int91 >> 16) & 0xFF];
  235.                 var temp3 = intData[42] ^ StaticArray.dwA149F0[int94 & 0xFF] ^ StaticArray.dwA13DF0[int93 >> 24] ^ StaticArray.dwA145F0[(int91 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int92 >> 16) & 0xFF];
  236.                 var temp4 = intData[43] ^ StaticArray.dwA149F0[int91 & 0xFF] ^ StaticArray.dwA13DF0[int94 >> 24] ^ StaticArray.dwA145F0[(int92 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int93 >> 16) & 0xFF];
  237.  
  238.                 int91 = intData[44] ^ StaticArray.dwA149F0[temp2 & 0xFF] ^ StaticArray.dwA13DF0[temp1 >> 24] ^ StaticArray.dwA145F0[(temp3 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(temp4 >> 16) & 0xFF];
  239.                 int92 = intData[45] ^ StaticArray.dwA149F0[temp3 & 0xFF] ^ StaticArray.dwA13DF0[temp2 >> 24] ^ StaticArray.dwA145F0[(temp4 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(temp1 >> 16) & 0xFF];
  240.                 int93 = intData[46] ^ StaticArray.dwA149F0[temp4 & 0xFF] ^ StaticArray.dwA13DF0[temp3 >> 24] ^ StaticArray.dwA145F0[(temp1 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(temp2 >> 16) & 0xFF];
  241.                 int94 = intData[47] ^ StaticArray.dwA149F0[temp1 & 0xFF] ^ StaticArray.dwA13DF0[temp4 >> 24] ^ StaticArray.dwA145F0[(temp2 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(temp3 >> 16) & 0xFF];
  242.  
  243.  
  244.                 if (length > 12) // Fatal roi vao day
  245.                 {
  246.                     temp1 = intData[48] ^ StaticArray.dwA149F0[int92 & 0xFF] ^ StaticArray.dwA13DF0[int91 >> 24] ^ StaticArray.dwA145F0[(int93 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int94 >> 16) & 0xFF];
  247.                     temp2 = intData[49] ^ StaticArray.dwA149F0[int93 & 0xFF] ^ StaticArray.dwA13DF0[int92 >> 24] ^ StaticArray.dwA145F0[(int94 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int91 >> 16) & 0xFF];
  248.                     temp3 = intData[50] ^ StaticArray.dwA149F0[int94 & 0xFF] ^ StaticArray.dwA13DF0[int93 >> 24] ^ StaticArray.dwA145F0[(int91 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int92 >> 16) & 0xFF];
  249.                     temp4 = intData[51] ^ StaticArray.dwA149F0[int91 & 0xFF] ^ StaticArray.dwA13DF0[int94 >> 24] ^ StaticArray.dwA145F0[(int92 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int93 >> 16) & 0xFF];
  250.  
  251.                     int91 = intData[52] ^ StaticArray.dwA149F0[temp2 & 0xFF] ^ StaticArray.dwA13DF0[temp1 >> 24] ^ StaticArray.dwA145F0[(temp3 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(temp4 >> 16) & 0xFF];
  252.                     int92 = intData[53] ^ StaticArray.dwA149F0[temp3 & 0xFF] ^ StaticArray.dwA13DF0[temp2 >> 24] ^ StaticArray.dwA145F0[(temp4 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(temp1 >> 16) & 0xFF];
  253.                     int93 = intData[54] ^ StaticArray.dwA149F0[temp4 & 0xFF] ^ StaticArray.dwA13DF0[temp3 >> 24] ^ StaticArray.dwA145F0[(temp1 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(temp2 >> 16) & 0xFF];
  254.                     int94 = intData[55] ^ StaticArray.dwA149F0[temp1 & 0xFF] ^ StaticArray.dwA13DF0[temp4 >> 24] ^ StaticArray.dwA145F0[(temp2 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(temp3 >> 16) & 0xFF];
  255.                 }
  256.             }
  257.  
  258.             var v57 = intData[length*4];
  259.             uint final1 = v57 ^
  260.                           (StaticArray.dwA14DF0[int92 & 0xFF] & 0xFF) ^
  261.                           (StaticArray.dwA14DF0[int91 >> 24] & 0xFF000000) ^
  262.                           (StaticArray.dwA14DF0[(int93 >> 8) & 0xFF] & 0xFF00) ^
  263.                           (StaticArray.dwA14DF0[(int94 >> 16) & 0xFF] & 0xFF0000);
  264.  
  265.             v57 = intData[(length * 4) + 1];
  266.             var final2 = v57 ^
  267.                           (StaticArray.dwA14DF0[int93 & 0xFF] & 0xFF) ^
  268.                           (StaticArray.dwA14DF0[int92 >> 24] & 0xFF000000) ^
  269.                           (StaticArray.dwA14DF0[(int94 >> 8) & 0xFF] & 0xFF00) ^
  270.                           (StaticArray.dwA14DF0[(int91 >> 16) & 0xFF] & 0xFF0000);
  271.  
  272.             v57 = intData[(length * 4) + 2];
  273.             var final3 = v57 ^
  274.                           (StaticArray.dwA14DF0[int94 & 0xFF] & 0xFF) ^
  275.                           (StaticArray.dwA14DF0[int93 >> 24] & 0xFF000000) ^
  276.                           (StaticArray.dwA14DF0[(int91 >> 8) & 0xFF] & 0xFF00) ^
  277.                           (StaticArray.dwA14DF0[(int92 >> 16) & 0xFF] & 0xFF0000);
  278.  
  279.             v57 = intData[(length * 4) + 3];
  280.             var final4 =
  281.                           (StaticArray.dwA14DF0[int94 & 0xFF] & 0xFF) ^
  282.                           (StaticArray.dwA14DF0[int93 >> 24] & 0xFF000000) ^
  283.                           (StaticArray.dwA14DF0[(int91 >> 8) & 0xFF] & 0xFF00) ^
  284.                           (StaticArray.dwA14DF0[(int92 >> 16) & 0xFF] & 0xFF0000);
  285.             final4 ^= v57;
  286.             final4 ^= v57;
  287.  
  288.             var test = final3 ^ final4;
  289.             Console.WriteLine(test);
  290.  
  291.             Array.Copy(BitConverter.GetBytes(final1).Reverse().ToArray(), 0, intArray2, 0, 4);
  292.             Array.Copy(BitConverter.GetBytes(final2).Reverse().ToArray(), 0, intArray2, 4, 4);
  293.             Array.Copy(BitConverter.GetBytes(final3).Reverse().ToArray(), 0, intArray2, 8, 4);
  294.             Array.Copy(BitConverter.GetBytes(final4).Reverse().ToArray(), 0, intArray2, 12, 4);
  295.  
  296.  
  297.             //Console.WriteLine(v69);
  298.  
  299.         }
  300.  
  301.         private static int Generate16BytesKey(ref byte[] returnArray, byte[] firstPacket1FLength, int length)
  302.         {
  303.             var intArr = new uint[length / 4];
  304.  
  305.             var result = GenerateMorePart(ref intArr, firstPacket1FLength, length);
  306.  
  307.             var v5 = result;
  308.             var v6 = 0;
  309.  
  310.             if (v5 > 0)
  311.             {
  312.                 var v7 = ((16 * result) + 8) / 4; // vị trí index
  313.                 var v2 = 2;
  314.  
  315.                 // Đoạn này tráo 4 byte đầu với 4 byte cuối
  316.                 do
  317.                 {
  318.                     var int0 = intArr[v2 - 2];
  319.                     intArr[v2 - 2] = intArr[v7 - 2]; // Có vẻ như tráo đầu với đuôi
  320.                     intArr[v7 - 2] = int0;
  321.  
  322.                     var v10 = intArr[v7 - 1];
  323.                     var int1 = intArr[v2 - 1];
  324.                     intArr[v2 - 1] = v10;
  325.  
  326.                     var v12 = intArr[v7];
  327.                     intArr[v7 - 1] = int1;
  328.  
  329.                     var v13 = intArr[v2];
  330.                     intArr[v2] = v12;
  331.  
  332.                     var v14 = intArr[v7 + 1];
  333.                     intArr[v7] = v13;
  334.  
  335.                     var int3 = intArr[v2 + 1];
  336.                     intArr[v2 + 1] = v14;
  337.                     intArr[v7 + 1] = int3;
  338.  
  339.                     v6++;
  340.                     v5--;
  341.  
  342.                     v2 += 4;
  343.                     v7 -= 4;
  344.                 } while (v6 < v5);
  345.             }
  346.  
  347.             if (result > 1)
  348.             {
  349.                 var bArray = GetBytesArray(intArr); // Đổi ra mảng bytes
  350.  
  351.                 var v16 = 2;
  352.                 var v17 = result - 1;
  353.  
  354.                 do
  355.                 {
  356.                     var v18 = BitConverter.ToUInt32(bArray, v16 + 14);
  357.                     var v19 = StaticArray.dwA139F0[bArray[v16 + 15]];
  358.  
  359.                     v16 += 16;
  360.  
  361.                     var v20 = StaticArray.dwA141F0[StaticArray.dwA139F0[bArray[v16]] & 0xFF];
  362.                     v20 ^= StaticArray.dwA145F0[v19 & 0xFF];
  363.                     v20 ^= StaticArray.dwA13DF0[StaticArray.dwA139F0[v18 >> 24] & 0xFF];
  364.  
  365.                     var v21 = BitConverter.ToUInt32(bArray, v16 + 3);
  366.                     var v22 = StaticArray.dwA149F0[StaticArray.dwA139F0[v18 & 0xFF] & 0xFF];
  367.                     v22 ^= v20;
  368.  
  369.                     var v23 = BitConverter.ToUInt32(bArray, v16 + 2);
  370.  
  371.                     // Gan vi tri 16
  372.                     Array.Copy(BitConverter.GetBytes(v22), 0, bArray, v16 - 2, 4);
  373.  
  374.                     var v24 = StaticArray.dwA141F0[StaticArray.dwA139F0[bArray[v16 + 4]] & 0xFF];
  375.                     v24 ^= StaticArray.dwA145F0[StaticArray.dwA139F0[v21 & 0xFF] & 0xFF];
  376.                     v24 ^= StaticArray.dwA13DF0[StaticArray.dwA139F0[v23 >> 24] & 0xFF];
  377.  
  378.                     var v25 = BitConverter.ToUInt32(bArray, v16 + 7);
  379.                     var v26 = StaticArray.dwA149F0[StaticArray.dwA139F0[v23 & 0xFF] & 0xFF];
  380.                     v26 ^= v24;
  381.  
  382.                     var v27 = BitConverter.ToUInt32(bArray, v16 + 6);
  383.  
  384.                     // Gan vi tri 20
  385.                     Array.Copy(BitConverter.GetBytes(v26), 0, bArray, v16 + 2, 4);
  386.  
  387.                     var v28 = StaticArray.dwA141F0[StaticArray.dwA139F0[bArray[v16 + 8]] & 0xFF];
  388.                     v28 ^= StaticArray.dwA145F0[StaticArray.dwA139F0[v25 & 0xFF] & 0xFF];
  389.                     v28 ^= StaticArray.dwA13DF0[StaticArray.dwA139F0[v27 >> 24] & 0xFF];
  390.  
  391.                     var v29 = BitConverter.ToUInt32(bArray, v16 + 11);
  392.                     var v30 = StaticArray.dwA149F0[StaticArray.dwA139F0[v27 & 0xFF] & 0xFF];
  393.                     v30 ^= v28;
  394.  
  395.                     var v31 = BitConverter.ToUInt32(bArray, v16 + 10);
  396.  
  397.                     // Gan vi tri 24
  398.                     Array.Copy(BitConverter.GetBytes(v30), 0, bArray, v16 + 6, 4);
  399.  
  400.                     v17--;
  401.  
  402.                     var temp = StaticArray.dwA149F0[StaticArray.dwA139F0[v31 & 0xFF] & 0xFF];
  403.                     temp ^= StaticArray.dwA141F0[StaticArray.dwA139F0[bArray[v16 + 12]] & 0xFF];
  404.                     temp ^= StaticArray.dwA145F0[StaticArray.dwA139F0[v29 & 0xFF] & 0xFF];
  405.                     temp ^= StaticArray.dwA13DF0[StaticArray.dwA139F0[v31 >> 24] & 0xFF];
  406.  
  407.                     // Gan vi tri 28
  408.                     Array.Copy(BitConverter.GetBytes(temp), 0, bArray, v16 + 10, 4);
  409.  
  410.                 } while (v17 > 0);
  411.  
  412.                 returnArray = bArray;
  413.             }
  414.  
  415.             return result;
  416.         }
  417.  
  418.         private static uint[] GetIntsArray(byte[] bArray)
  419.         {
  420.             var result = new uint[bArray.Length / 4];
  421.  
  422.  
  423.             for (int i = 0; i < result.Length; i++)
  424.             {
  425.                 result[i] = BitConverter.ToUInt32(bArray, i * 4);
  426.             }
  427.  
  428.             return result;
  429.         }
  430.  
  431.         private static byte[] GetBytesArray(uint[] intArray)
  432.         {
  433.             var result = new byte[intArray.Length*4];
  434.  
  435.  
  436.             for (int i = 0; i < intArray.Length; i++)
  437.             {
  438.                 var bUint = BitConverter.GetBytes(intArray[i]);
  439.                 Array.Copy(bUint, 0, result, i * 4, 4);
  440.             }
  441.  
  442.             return result;
  443.         }
  444.  
  445.         /// <summary>
  446.         /// Sinh ra mảng 256 bytes để dành cho việc giải mã từ 40 bytes ban đầu
  447.         /// </summary>
  448.         /// <param name="intArr"></param>
  449.         /// <param name="firstPacket"></param>
  450.         /// <param name="length"></param>
  451.         /// <returns></returns>
  452.         private static int GenerateMorePart(ref uint[] intArr, byte[] firstPacket, int length)
  453.         {
  454.             //var intArr = new uint[length/4];
  455.  
  456.             // Sử dụng kĩ thuật LINQ thay vì dịch byte (có thể sẽ bị chậm hơn
  457.             //intArr[0] = (((((firstPacket[0] << 8) ^ (firstPacket[1])) << 8) ^ (firstPacket[2])) << 8) ^ (firstPacket[3]);
  458.             intArr[0] = BitConverter.ToUInt32(firstPacket.Take(4).Reverse().ToArray(), 0);
  459.             //intArr[1] = ((((((firstPacket[4]) << 8) ^ (firstPacket[5])) << 8) ^ (firstPacket[6])) << 8) ^ (firstPacket[7]);
  460.             intArr[1] = BitConverter.ToUInt32(firstPacket.Skip(4).Take(4).Reverse().ToArray(), 0);
  461.             //intArr[2] = ((((((firstPacket[8]) << 8) ^ (firstPacket[9])) << 8) ^ (firstPacket[10])) << 8) ^ (firstPacket[11]);
  462.             intArr[2] = BitConverter.ToUInt32(firstPacket.Skip(8).Take(4).Reverse().ToArray(), 0);
  463.             //intArr[3] = ((((((firstPacket[12]) << 8) ^ (firstPacket[13])) << 8) ^ (firstPacket[14])) << 8) ^ (firstPacket[15]);
  464.             intArr[3] = BitConverter.ToUInt32(firstPacket.Skip(12).Take(4).Reverse().ToArray(), 0);
  465.  
  466.             if (length == 128)
  467.             {
  468.                 return 10;
  469.             }
  470.             else
  471.             {
  472.                 intArr[4] = BitConverter.ToUInt32(firstPacket.Skip(16).Take(4).Reverse().ToArray(), 0);
  473.                 intArr[5] = BitConverter.ToUInt32(firstPacket.Skip(20).Take(4).Reverse().ToArray(), 0);
  474.  
  475.                 if (length == 192)
  476.                 {
  477.                     return 12;
  478.                 }
  479.                 else
  480.                 {
  481.                     intArr[6] = BitConverter.ToUInt32(firstPacket.Skip(24).Take(4).Reverse().ToArray(), 0);
  482.                     intArr[7] = BitConverter.ToUInt32(firstPacket.Skip(28).Take(4).Reverse().ToArray(), 0);
  483.  
  484.                     if (length == 256) // Packet Fatal
  485.                     {
  486.                         var int7 = intArr[7];
  487.  
  488.                         intArr[8] = (StaticArray.dwA139F0[(int7 >> 16) & 0xFF] ^ 0x1000000) & 0xFF000000 ^
  489.                                     (StaticArray.dwA139F0[(int7 >> 8) & 0xFF] & 0xFF0000) ^
  490.                                     (StaticArray.dwA139F0[(int7 >> 24)] & 0xFF) ^ // LOBYTE (MOVZX) phai AND voi 0xFF (giu 1 byte cuoi cung)
  491.                                     (StaticArray.dwA139F0[int7 & 0xFF] &0xFF00) ^ intArr[0];
  492.                         //Console.WriteLine(intArr[8]);
  493.                        
  494.                         intArr[9] = intArr[8] ^ intArr[1];
  495.                         intArr[10] = intArr[9] ^ intArr[2];
  496.                         intArr[11] = intArr[10] ^ intArr[3];
  497.                        
  498.                         var v30 = 0;
  499.  
  500.                         // Trong ASM nó là con trỏ trỏ để mảng returnArray thứ 48,
  501.                         // đồng nghĩa với biến int13
  502.                         var v34 = 48;
  503.                         do
  504.                         {
  505.                             var int11 = intArr[(v34 - 4)/4];
  506.  
  507.                             var v35 = StaticArray.dwA139F0[(int11 >> 16) & 0xFF] & 0xFF0000 ^
  508.                                       StaticArray.dwA139F0[(int11 >> 8) & 0xFF] & 0xFF00 ^
  509.                                       StaticArray.dwA139F0[int11 >> 24] & 0xFF000000 ^
  510.                                       StaticArray.dwA139F0[(int11) & 0xFF] & 0xFF ^
  511.                                       intArr[(v34 - 32)/4];
  512.                                
  513.                             var v36 = v35 ^ intArr[(v34 - 28)/4];
  514.                             var v37 = v36 ^ intArr[(v34 - 24)/4];
  515.                             var v38 = v37 ^ intArr[(v34 - 20)/4];
  516.  
  517.                             intArr[(v34)/4] = v35;
  518.                             intArr[(v34 + 4)/4] = v36;
  519.                             intArr[(v34 + 8)/4] = v37;
  520.                             intArr[(v34 + 12)/4] = v38;
  521.  
  522.                             // Dời index thêm 32 bytes ( 8 số int)
  523.                             v34 += 32;
  524.  
  525.                             v30++; // Index cua mang 2 tang len
  526.  
  527.                             var v40 = StaticArray.dwA151F4[v30 - 1] ^
  528.                                       intArr[(v34 - 48)/4] ^
  529.                                       StaticArray.dwA139F0[v38 & 0xFF] & 0xFF00 ^
  530.                                       (StaticArray.dwA139F0[v38 >> 24]) & 0xFF ^
  531.                                       (StaticArray.dwA139F0[(v38 >> 16) & 0xFF]) & 0xFF000000 ^ 0xFF0000 &
  532.                                       (StaticArray.dwA139F0[(v38 >> 8) & 0xFF]);
  533.  
  534.                             var v41 = v40 ^ intArr[(v34 - 44) / 4];
  535.                             var v42 = v41 ^ intArr[(v34 - 40) / 4];
  536.                             var v43 = v42 ^ intArr[(v34 - 36) / 4];
  537.  
  538.                             intArr[(v34 - 16)/4] = v40;
  539.                             intArr[(v34 - 12)/4] = v41;
  540.                             intArr[(v34 - 8)/4] = v42;
  541.                             intArr[(v34 - 4)/4] = v43;
  542.  
  543.                         } while (v30 != 6);
  544.  
  545.                         //foreach (var u in intArr)
  546.                         //{
  547.                         //    Console.WriteLine("{0:X}", u);
  548.                         //}
  549.  
  550.                         return 14;
  551.                     }
  552.  
  553.                     return 0;
  554.                 }
  555.             }
  556.  
  557.             return 0;
  558.         }
  559.        
  560.         public static byte[] HexStringToByte(string s)
  561.         {
  562.             try
  563.             {
  564.                 int num = s.Length / 2;
  565.                 var buffer = new byte[num];
  566.                 for (int i = 0; i < num; i++)
  567.                 {
  568.                     buffer[i] = Convert.ToByte(s.Substring(i * 2, 2), 16);
  569.                 }
  570.                 return buffer;
  571.             }
  572.             catch (Exception)
  573.             {
  574.                 return new byte[s.Length];
  575.             }
  576.         }
  577.     }
  578. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement