Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Text;
- using System.Threading.Tasks;
- namespace DecryptFatalPacket
- {
- class Program
- {
- static void Main(string[] args)
- {
- // Yêu cầu đưa vào tên nhân vật
- var playerName = "BeXi";
- // Tập giải mã trước để xác định đúng Logic
- var packetText =
- "42655869202020202020202020202020202020202020202020202020202020006958654220202020396F6E44ED813729A2310BC04239EBDF3C00A0AB3CC8CD826F6E26ADA81DEFAD33CE4940EE0478B2C9B673058ABE71FA4C3E856250BDE50D88730E2A1595CA1225C68E7A5B780EF3175A2281D7D32446E2F9";
- Console.WriteLine(packetText.Length / 2);
- var packetData = HexStringToByte(packetText);
- var packetLength = packetData.Length;
- // Phần đầu của Packet chứa chữ gồm Tên Nhân vật và dòng đảo ngược
- var firstPacketPart = new byte[41];
- Array.Copy(packetData, firstPacketPart, 41);
- // 5 biến Int đầu tiên
- var int1 = BitConverter.ToInt32(packetData, 40);
- var int2 = BitConverter.ToInt32(packetData, 44);
- var int3 = BitConverter.ToInt32(packetData, 48);
- var int4 = BitConverter.ToInt32(packetData, 52);
- var verifyLength = BitConverter.ToInt16(packetData, 56); // Chỉ 2 bytes thôi
- // Build Array chua cac so tren
- var intArray = new byte[18];
- Array.Copy(packetData, 40, intArray, 0, 18);
- // 4 byte tiep
- var intArray2 = new byte[16];
- // Phần sau của Packet
- var decryptLength = packetLength - 58;
- var endPacketPart = new byte[decryptLength];
- Array.Copy(packetData, 58, endPacketPart, 0, decryptLength ); // Copy phần sau của Packet
- // Tìm vị trí của bye 00 đầu tiên
- byte v10 = 1;
- var startIndex = 0;
- do
- {
- v10 = firstPacketPart[startIndex++];
- } while (v10 != 0);
- // Sau khi tìm xong đảm bảo nó không nằm ở vị trí vượt quá 40
- // 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)
- var v11 = startIndex; // v11 = 0x1F, startIndex = 0x20
- if (v11 - 1 > 39)
- {
- Console.WriteLine("Decrypt Failed here, return result 2");
- return;
- }
- var firstPacket1FLength = new byte[v11];
- Array.Copy(firstPacketPart, firstPacket1FLength, v11);
- var tempArray1 = new byte[240];
- var tempArray2 = new byte[240];
- var tempArray3 = new byte[240];
- var result = Generate16BytesKey(ref tempArray2, firstPacket1FLength, 256);
- DecryptPacketMessage(ref tempArray2, result, intArray, ref intArray2);
- var result1 = Generate16BytesKey(ref tempArray1, firstPacket1FLength, 256);
- var v14 = decryptLength/16;
- if (decryptLength % 16 > 0)
- {
- v14++;
- }
- var v33 = v14*16;
- if (v14 > 0)
- {
- var count = v14;
- var v15 = 0;
- do
- {
- // 1 lan lay 16 byte dua vao ma hoa
- // Bắt buộc phải là 16 byte
- byte[] bDecrypt = new byte[16];
- Array.Copy(endPacketPart, v15, bDecrypt, 0, 16);
- // Đoạn này thử nghiệm sinh Key
- // Lấy 16 bytes chưa mã hóa làm Key, rồi sinh từ mảng tempArray ra cái gì
- //var clearKey = new byte[16];
- //Array.Copy(firstPacketPart, v15, clearKey, 0, 16);
- //DecryptPacketMessage(ref tempArray1, result1, clearKey, ref intArray2);
- DecryptPacketMessage(ref tempArray1, result1, bDecrypt, ref intArray2);
- Array.Copy(intArray2, 0, tempArray3, v15, 16);
- v15 += 16;
- count--;
- } while (count > 0);
- }
- var length1E = v11 - 1;
- var firstPacketString = Encoding.GetEncoding(1258).GetString(firstPacketPart, 0, length1E);
- var decryptPacketString = Encoding.GetEncoding(1258).GetString(tempArray3, 0, length1E);
- // Compare together
- if (firstPacketString != decryptPacketString)
- {
- Console.WriteLine("Message decrypt fail, userName=%s(%s) namelen=%d", firstPacketString, decryptPacketString, v11);
- result = -3;
- }
- else // Successful
- {
- var v21 = -1;
- if (verifyLength <= v33)
- {
- if (verifyLength >= v33 - 16)
- {
- v21 = verifyLength - 40;
- }
- }
- else
- {
- v21 = v33 - 40;
- }
- // 5x4 bytes = 20 bytes, 5 so int
- Console.WriteLine(v21);
- var rInt1 = BitConverter.ToUInt32(tempArray3, 40);
- var rInt2 = BitConverter.ToUInt32(tempArray3, 44); // 2 bytes nay giong nhau, chac de verify hoac Type
- var rInt3 = BitConverter.ToUInt32(tempArray3, 48);
- var rInt4 = BitConverter.ToUInt32(tempArray3, 52);
- var rInt5 = BitConverter.ToUInt32(tempArray3, 56);
- var rInt6 = BitConverter.ToUInt32(tempArray3, 60);
- Console.WriteLine("{0:X}, {1:X}, {2:X}, {3:X}, {4:X}", rInt1, rInt2, rInt3, rInt4, rInt5);
- }
- Console.WriteLine(v11);
- Console.WriteLine(StaticArray.dwA139F0.Length);
- Console.WriteLine("{0:X}", StaticArray.dwA139F0[0x20]);
- Console.ReadLine();
- }
- private static void DecryptPacketMessage(ref byte[] arrData, int length, byte[] intArray, ref byte[] intArray2)
- {
- var intData = GetIntsArray(arrData);
- var int1 = (uint)(intData[0] ^ (intArray[3] ^ ((intArray[2] ^ ((intArray[1] ^ (intArray[0] << 8)) << 8)) << 8)));
- //var int1 = (uint)(intData[0] ^ BitConverter.ToUInt32(intArray.Take(4).Reverse().ToArray(), 0));
- var int2 = (uint)(intData[1] ^ (intArray[7] ^ ((intArray[6] ^ ((intArray[5] ^ (intArray[4] << 8)) << 8)) << 8)));
- var int3 = (uint)(intData[2] ^ (intArray[11] ^ ((intArray[10] ^ ((intArray[9] ^ (intArray[8] << 8)) << 8)) << 8)));
- var int4 = (uint)(intData[3] ^ (intArray[15] ^ ((intArray[14] ^ ((intArray[13] ^ (intArray[12] << 8)) << 8)) << 8)));
- //var temp = StaticArray.dwA145F0[(int3 >> 8) & 0xFF];
- //var a = StaticArray.dwA141F0[(int4 >> 16) & 0xFF];
- //var b = StaticArray.dwA13DF0[(int1 >> 24)];
- //var c = StaticArray.dwA149F0[int2 & 0xFF];
- //temp ^= a;
- //temp ^= b;
- //temp ^= c;
- //temp ^= intData[4];
- //Console.WriteLine(temp);
- //Console.WriteLine(a);
- var int11 = intData[4] ^ StaticArray.dwA149F0[int2 & 0xFF] ^ StaticArray.dwA13DF0[int1 >> 24] ^ StaticArray.dwA145F0[(int3 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int4 >> 16) & 0xFF];
- var int12 = intData[5] ^ StaticArray.dwA149F0[int3 & 0xFF] ^ StaticArray.dwA13DF0[int2 >> 24] ^ StaticArray.dwA145F0[(int4 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int1 >> 16) & 0xFF];
- var int13 = intData[6] ^ StaticArray.dwA149F0[int4 & 0xFF] ^ StaticArray.dwA13DF0[int3 >> 24] ^ StaticArray.dwA145F0[(int1 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int2 >> 16) & 0xFF];
- var int14 = intData[7] ^ StaticArray.dwA149F0[int1 & 0xFF] ^ StaticArray.dwA13DF0[int4 >> 24] ^ StaticArray.dwA145F0[(int2 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int3 >> 16) & 0xFF];
- var int21 = intData[8] ^ StaticArray.dwA149F0[int12 & 0xFF] ^ StaticArray.dwA13DF0[int11 >> 24] ^ StaticArray.dwA145F0[(int13 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int14 >> 16) & 0xFF];
- var int22 = intData[9] ^ StaticArray.dwA149F0[int13 & 0xFF] ^ StaticArray.dwA13DF0[int12 >> 24] ^ StaticArray.dwA145F0[(int14 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int11 >> 16) & 0xFF];
- var int23 = intData[10] ^ StaticArray.dwA149F0[int14 & 0xFF] ^ StaticArray.dwA13DF0[int13 >> 24] ^ StaticArray.dwA145F0[(int11 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int12 >> 16) & 0xFF];
- var int24 = intData[11] ^ StaticArray.dwA149F0[int11 & 0xFF] ^ StaticArray.dwA13DF0[int14 >> 24] ^ StaticArray.dwA145F0[(int12 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int13 >> 16) & 0xFF];
- var int31 = intData[12] ^ StaticArray.dwA149F0[int22 & 0xFF] ^ StaticArray.dwA13DF0[int21 >> 24] ^ StaticArray.dwA145F0[(int23 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int24 >> 16) & 0xFF];
- var int32 = intData[13] ^ StaticArray.dwA149F0[int23 & 0xFF] ^ StaticArray.dwA13DF0[int22 >> 24] ^ StaticArray.dwA145F0[(int24 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int21 >> 16) & 0xFF];
- var int33 = intData[14] ^ StaticArray.dwA149F0[int24 & 0xFF] ^ StaticArray.dwA13DF0[int23 >> 24] ^ StaticArray.dwA145F0[(int21 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int22 >> 16) & 0xFF];
- var int34 = intData[15] ^ StaticArray.dwA149F0[int21 & 0xFF] ^ StaticArray.dwA13DF0[int24 >> 24] ^ StaticArray.dwA145F0[(int22 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int23 >> 16) & 0xFF];
- var int41 = intData[16] ^ StaticArray.dwA149F0[int32 & 0xFF] ^ StaticArray.dwA13DF0[int31 >> 24] ^ StaticArray.dwA145F0[(int33 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int34 >> 16) & 0xFF];
- var int42 = intData[17] ^ StaticArray.dwA149F0[int33 & 0xFF] ^ StaticArray.dwA13DF0[int32 >> 24] ^ StaticArray.dwA145F0[(int34 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int31 >> 16) & 0xFF];
- var int43 = intData[18] ^ StaticArray.dwA149F0[int34 & 0xFF] ^ StaticArray.dwA13DF0[int33 >> 24] ^ StaticArray.dwA145F0[(int31 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int32 >> 16) & 0xFF];
- var int44 = intData[19] ^ StaticArray.dwA149F0[int31 & 0xFF] ^ StaticArray.dwA13DF0[int34 >> 24] ^ StaticArray.dwA145F0[(int32 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int33 >> 16) & 0xFF];
- var int51 = intData[20] ^ StaticArray.dwA149F0[int42 & 0xFF] ^ StaticArray.dwA13DF0[int41 >> 24] ^ StaticArray.dwA145F0[(int43 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int44 >> 16) & 0xFF];
- var int52 = intData[21] ^ StaticArray.dwA149F0[int43 & 0xFF] ^ StaticArray.dwA13DF0[int42 >> 24] ^ StaticArray.dwA145F0[(int44 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int41 >> 16) & 0xFF];
- var int53 = intData[22] ^ StaticArray.dwA149F0[int44 & 0xFF] ^ StaticArray.dwA13DF0[int43 >> 24] ^ StaticArray.dwA145F0[(int41 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int42 >> 16) & 0xFF];
- var int54 = intData[23] ^ StaticArray.dwA149F0[int41 & 0xFF] ^ StaticArray.dwA13DF0[int44 >> 24] ^ StaticArray.dwA145F0[(int42 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int43 >> 16) & 0xFF];
- var int61 = intData[24] ^ StaticArray.dwA149F0[int52 & 0xFF] ^ StaticArray.dwA13DF0[int51 >> 24] ^ StaticArray.dwA145F0[(int53 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int54 >> 16) & 0xFF];
- var int62 = intData[25] ^ StaticArray.dwA149F0[int53 & 0xFF] ^ StaticArray.dwA13DF0[int52 >> 24] ^ StaticArray.dwA145F0[(int54 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int51 >> 16) & 0xFF];
- var int63 = intData[26] ^ StaticArray.dwA149F0[int54 & 0xFF] ^ StaticArray.dwA13DF0[int53 >> 24] ^ StaticArray.dwA145F0[(int51 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int52 >> 16) & 0xFF];
- var int64 = intData[27] ^ StaticArray.dwA149F0[int51 & 0xFF] ^ StaticArray.dwA13DF0[int54 >> 24] ^ StaticArray.dwA145F0[(int52 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int53 >> 16) & 0xFF];
- var int71 = intData[28] ^ StaticArray.dwA149F0[int62 & 0xFF] ^ StaticArray.dwA13DF0[int61 >> 24] ^ StaticArray.dwA145F0[(int63 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int64 >> 16) & 0xFF];
- var int72 = intData[29] ^ StaticArray.dwA149F0[int63 & 0xFF] ^ StaticArray.dwA13DF0[int62 >> 24] ^ StaticArray.dwA145F0[(int64 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int61 >> 16) & 0xFF];
- var int73 = intData[30] ^ StaticArray.dwA149F0[int64 & 0xFF] ^ StaticArray.dwA13DF0[int63 >> 24] ^ StaticArray.dwA145F0[(int61 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int62 >> 16) & 0xFF];
- var int74 = intData[31] ^ StaticArray.dwA149F0[int61 & 0xFF] ^ StaticArray.dwA13DF0[int64 >> 24] ^ StaticArray.dwA145F0[(int62 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int63 >> 16) & 0xFF];
- var int81 = intData[32] ^ StaticArray.dwA149F0[int72 & 0xFF] ^ StaticArray.dwA13DF0[int71 >> 24] ^ StaticArray.dwA145F0[(int73 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int74 >> 16) & 0xFF];
- var int82 = intData[33] ^ StaticArray.dwA149F0[int73 & 0xFF] ^ StaticArray.dwA13DF0[int72 >> 24] ^ StaticArray.dwA145F0[(int74 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int71 >> 16) & 0xFF];
- var int83 = intData[34] ^ StaticArray.dwA149F0[int74 & 0xFF] ^ StaticArray.dwA13DF0[int73 >> 24] ^ StaticArray.dwA145F0[(int71 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int72 >> 16) & 0xFF];
- var int84 = intData[35] ^ StaticArray.dwA149F0[int71 & 0xFF] ^ StaticArray.dwA13DF0[int74 >> 24] ^ StaticArray.dwA145F0[(int72 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int73 >> 16) & 0xFF];
- var int91 = intData[36] ^ StaticArray.dwA149F0[int82 & 0xFF] ^ StaticArray.dwA13DF0[int81 >> 24] ^ StaticArray.dwA145F0[(int83 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int84 >> 16) & 0xFF];
- var int92 = intData[37] ^ StaticArray.dwA149F0[int83 & 0xFF] ^ StaticArray.dwA13DF0[int82 >> 24] ^ StaticArray.dwA145F0[(int84 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int81 >> 16) & 0xFF];
- var int93 = intData[38] ^ StaticArray.dwA149F0[int84 & 0xFF] ^ StaticArray.dwA13DF0[int83 >> 24] ^ StaticArray.dwA145F0[(int81 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int82 >> 16) & 0xFF];
- var int94 = intData[39] ^ StaticArray.dwA149F0[int81 & 0xFF] ^ StaticArray.dwA13DF0[int84 >> 24] ^ StaticArray.dwA145F0[(int82 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int83 >> 16) & 0xFF];
- if (length > 10)
- {
- var temp1 = intData[40] ^ StaticArray.dwA149F0[int92 & 0xFF] ^ StaticArray.dwA13DF0[int91 >> 24] ^ StaticArray.dwA145F0[(int93 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int94 >> 16) & 0xFF];
- var temp2 = intData[41] ^ StaticArray.dwA149F0[int93 & 0xFF] ^ StaticArray.dwA13DF0[int92 >> 24] ^ StaticArray.dwA145F0[(int94 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int91 >> 16) & 0xFF];
- var temp3 = intData[42] ^ StaticArray.dwA149F0[int94 & 0xFF] ^ StaticArray.dwA13DF0[int93 >> 24] ^ StaticArray.dwA145F0[(int91 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int92 >> 16) & 0xFF];
- var temp4 = intData[43] ^ StaticArray.dwA149F0[int91 & 0xFF] ^ StaticArray.dwA13DF0[int94 >> 24] ^ StaticArray.dwA145F0[(int92 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int93 >> 16) & 0xFF];
- int91 = intData[44] ^ StaticArray.dwA149F0[temp2 & 0xFF] ^ StaticArray.dwA13DF0[temp1 >> 24] ^ StaticArray.dwA145F0[(temp3 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(temp4 >> 16) & 0xFF];
- int92 = intData[45] ^ StaticArray.dwA149F0[temp3 & 0xFF] ^ StaticArray.dwA13DF0[temp2 >> 24] ^ StaticArray.dwA145F0[(temp4 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(temp1 >> 16) & 0xFF];
- int93 = intData[46] ^ StaticArray.dwA149F0[temp4 & 0xFF] ^ StaticArray.dwA13DF0[temp3 >> 24] ^ StaticArray.dwA145F0[(temp1 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(temp2 >> 16) & 0xFF];
- int94 = intData[47] ^ StaticArray.dwA149F0[temp1 & 0xFF] ^ StaticArray.dwA13DF0[temp4 >> 24] ^ StaticArray.dwA145F0[(temp2 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(temp3 >> 16) & 0xFF];
- if (length > 12) // Fatal roi vao day
- {
- temp1 = intData[48] ^ StaticArray.dwA149F0[int92 & 0xFF] ^ StaticArray.dwA13DF0[int91 >> 24] ^ StaticArray.dwA145F0[(int93 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int94 >> 16) & 0xFF];
- temp2 = intData[49] ^ StaticArray.dwA149F0[int93 & 0xFF] ^ StaticArray.dwA13DF0[int92 >> 24] ^ StaticArray.dwA145F0[(int94 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int91 >> 16) & 0xFF];
- temp3 = intData[50] ^ StaticArray.dwA149F0[int94 & 0xFF] ^ StaticArray.dwA13DF0[int93 >> 24] ^ StaticArray.dwA145F0[(int91 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int92 >> 16) & 0xFF];
- temp4 = intData[51] ^ StaticArray.dwA149F0[int91 & 0xFF] ^ StaticArray.dwA13DF0[int94 >> 24] ^ StaticArray.dwA145F0[(int92 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(int93 >> 16) & 0xFF];
- int91 = intData[52] ^ StaticArray.dwA149F0[temp2 & 0xFF] ^ StaticArray.dwA13DF0[temp1 >> 24] ^ StaticArray.dwA145F0[(temp3 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(temp4 >> 16) & 0xFF];
- int92 = intData[53] ^ StaticArray.dwA149F0[temp3 & 0xFF] ^ StaticArray.dwA13DF0[temp2 >> 24] ^ StaticArray.dwA145F0[(temp4 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(temp1 >> 16) & 0xFF];
- int93 = intData[54] ^ StaticArray.dwA149F0[temp4 & 0xFF] ^ StaticArray.dwA13DF0[temp3 >> 24] ^ StaticArray.dwA145F0[(temp1 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(temp2 >> 16) & 0xFF];
- int94 = intData[55] ^ StaticArray.dwA149F0[temp1 & 0xFF] ^ StaticArray.dwA13DF0[temp4 >> 24] ^ StaticArray.dwA145F0[(temp2 >> 8) & 0xFF] ^ StaticArray.dwA141F0[(temp3 >> 16) & 0xFF];
- }
- }
- var v57 = intData[length*4];
- uint final1 = v57 ^
- (StaticArray.dwA14DF0[int92 & 0xFF] & 0xFF) ^
- (StaticArray.dwA14DF0[int91 >> 24] & 0xFF000000) ^
- (StaticArray.dwA14DF0[(int93 >> 8) & 0xFF] & 0xFF00) ^
- (StaticArray.dwA14DF0[(int94 >> 16) & 0xFF] & 0xFF0000);
- v57 = intData[(length * 4) + 1];
- var final2 = v57 ^
- (StaticArray.dwA14DF0[int93 & 0xFF] & 0xFF) ^
- (StaticArray.dwA14DF0[int92 >> 24] & 0xFF000000) ^
- (StaticArray.dwA14DF0[(int94 >> 8) & 0xFF] & 0xFF00) ^
- (StaticArray.dwA14DF0[(int91 >> 16) & 0xFF] & 0xFF0000);
- v57 = intData[(length * 4) + 2];
- var final3 = v57 ^
- (StaticArray.dwA14DF0[int94 & 0xFF] & 0xFF) ^
- (StaticArray.dwA14DF0[int93 >> 24] & 0xFF000000) ^
- (StaticArray.dwA14DF0[(int91 >> 8) & 0xFF] & 0xFF00) ^
- (StaticArray.dwA14DF0[(int92 >> 16) & 0xFF] & 0xFF0000);
- v57 = intData[(length * 4) + 3];
- var final4 =
- (StaticArray.dwA14DF0[int94 & 0xFF] & 0xFF) ^
- (StaticArray.dwA14DF0[int93 >> 24] & 0xFF000000) ^
- (StaticArray.dwA14DF0[(int91 >> 8) & 0xFF] & 0xFF00) ^
- (StaticArray.dwA14DF0[(int92 >> 16) & 0xFF] & 0xFF0000);
- final4 ^= v57;
- final4 ^= v57;
- var test = final3 ^ final4;
- Console.WriteLine(test);
- Array.Copy(BitConverter.GetBytes(final1).Reverse().ToArray(), 0, intArray2, 0, 4);
- Array.Copy(BitConverter.GetBytes(final2).Reverse().ToArray(), 0, intArray2, 4, 4);
- Array.Copy(BitConverter.GetBytes(final3).Reverse().ToArray(), 0, intArray2, 8, 4);
- Array.Copy(BitConverter.GetBytes(final4).Reverse().ToArray(), 0, intArray2, 12, 4);
- //Console.WriteLine(v69);
- }
- private static int Generate16BytesKey(ref byte[] returnArray, byte[] firstPacket1FLength, int length)
- {
- var intArr = new uint[length / 4];
- var result = GenerateMorePart(ref intArr, firstPacket1FLength, length);
- var v5 = result;
- var v6 = 0;
- if (v5 > 0)
- {
- var v7 = ((16 * result) + 8) / 4; // vị trí index
- var v2 = 2;
- // Đoạn này tráo 4 byte đầu với 4 byte cuối
- do
- {
- var int0 = intArr[v2 - 2];
- intArr[v2 - 2] = intArr[v7 - 2]; // Có vẻ như tráo đầu với đuôi
- intArr[v7 - 2] = int0;
- var v10 = intArr[v7 - 1];
- var int1 = intArr[v2 - 1];
- intArr[v2 - 1] = v10;
- var v12 = intArr[v7];
- intArr[v7 - 1] = int1;
- var v13 = intArr[v2];
- intArr[v2] = v12;
- var v14 = intArr[v7 + 1];
- intArr[v7] = v13;
- var int3 = intArr[v2 + 1];
- intArr[v2 + 1] = v14;
- intArr[v7 + 1] = int3;
- v6++;
- v5--;
- v2 += 4;
- v7 -= 4;
- } while (v6 < v5);
- }
- if (result > 1)
- {
- var bArray = GetBytesArray(intArr); // Đổi ra mảng bytes
- var v16 = 2;
- var v17 = result - 1;
- do
- {
- var v18 = BitConverter.ToUInt32(bArray, v16 + 14);
- var v19 = StaticArray.dwA139F0[bArray[v16 + 15]];
- v16 += 16;
- var v20 = StaticArray.dwA141F0[StaticArray.dwA139F0[bArray[v16]] & 0xFF];
- v20 ^= StaticArray.dwA145F0[v19 & 0xFF];
- v20 ^= StaticArray.dwA13DF0[StaticArray.dwA139F0[v18 >> 24] & 0xFF];
- var v21 = BitConverter.ToUInt32(bArray, v16 + 3);
- var v22 = StaticArray.dwA149F0[StaticArray.dwA139F0[v18 & 0xFF] & 0xFF];
- v22 ^= v20;
- var v23 = BitConverter.ToUInt32(bArray, v16 + 2);
- // Gan vi tri 16
- Array.Copy(BitConverter.GetBytes(v22), 0, bArray, v16 - 2, 4);
- var v24 = StaticArray.dwA141F0[StaticArray.dwA139F0[bArray[v16 + 4]] & 0xFF];
- v24 ^= StaticArray.dwA145F0[StaticArray.dwA139F0[v21 & 0xFF] & 0xFF];
- v24 ^= StaticArray.dwA13DF0[StaticArray.dwA139F0[v23 >> 24] & 0xFF];
- var v25 = BitConverter.ToUInt32(bArray, v16 + 7);
- var v26 = StaticArray.dwA149F0[StaticArray.dwA139F0[v23 & 0xFF] & 0xFF];
- v26 ^= v24;
- var v27 = BitConverter.ToUInt32(bArray, v16 + 6);
- // Gan vi tri 20
- Array.Copy(BitConverter.GetBytes(v26), 0, bArray, v16 + 2, 4);
- var v28 = StaticArray.dwA141F0[StaticArray.dwA139F0[bArray[v16 + 8]] & 0xFF];
- v28 ^= StaticArray.dwA145F0[StaticArray.dwA139F0[v25 & 0xFF] & 0xFF];
- v28 ^= StaticArray.dwA13DF0[StaticArray.dwA139F0[v27 >> 24] & 0xFF];
- var v29 = BitConverter.ToUInt32(bArray, v16 + 11);
- var v30 = StaticArray.dwA149F0[StaticArray.dwA139F0[v27 & 0xFF] & 0xFF];
- v30 ^= v28;
- var v31 = BitConverter.ToUInt32(bArray, v16 + 10);
- // Gan vi tri 24
- Array.Copy(BitConverter.GetBytes(v30), 0, bArray, v16 + 6, 4);
- v17--;
- var temp = StaticArray.dwA149F0[StaticArray.dwA139F0[v31 & 0xFF] & 0xFF];
- temp ^= StaticArray.dwA141F0[StaticArray.dwA139F0[bArray[v16 + 12]] & 0xFF];
- temp ^= StaticArray.dwA145F0[StaticArray.dwA139F0[v29 & 0xFF] & 0xFF];
- temp ^= StaticArray.dwA13DF0[StaticArray.dwA139F0[v31 >> 24] & 0xFF];
- // Gan vi tri 28
- Array.Copy(BitConverter.GetBytes(temp), 0, bArray, v16 + 10, 4);
- } while (v17 > 0);
- returnArray = bArray;
- }
- return result;
- }
- private static uint[] GetIntsArray(byte[] bArray)
- {
- var result = new uint[bArray.Length / 4];
- for (int i = 0; i < result.Length; i++)
- {
- result[i] = BitConverter.ToUInt32(bArray, i * 4);
- }
- return result;
- }
- private static byte[] GetBytesArray(uint[] intArray)
- {
- var result = new byte[intArray.Length*4];
- for (int i = 0; i < intArray.Length; i++)
- {
- var bUint = BitConverter.GetBytes(intArray[i]);
- Array.Copy(bUint, 0, result, i * 4, 4);
- }
- return result;
- }
- /// <summary>
- /// Sinh ra mảng 256 bytes để dành cho việc giải mã từ 40 bytes ban đầu
- /// </summary>
- /// <param name="intArr"></param>
- /// <param name="firstPacket"></param>
- /// <param name="length"></param>
- /// <returns></returns>
- private static int GenerateMorePart(ref uint[] intArr, byte[] firstPacket, int length)
- {
- //var intArr = new uint[length/4];
- // Sử dụng kĩ thuật LINQ thay vì dịch byte (có thể sẽ bị chậm hơn
- //intArr[0] = (((((firstPacket[0] << 8) ^ (firstPacket[1])) << 8) ^ (firstPacket[2])) << 8) ^ (firstPacket[3]);
- intArr[0] = BitConverter.ToUInt32(firstPacket.Take(4).Reverse().ToArray(), 0);
- //intArr[1] = ((((((firstPacket[4]) << 8) ^ (firstPacket[5])) << 8) ^ (firstPacket[6])) << 8) ^ (firstPacket[7]);
- intArr[1] = BitConverter.ToUInt32(firstPacket.Skip(4).Take(4).Reverse().ToArray(), 0);
- //intArr[2] = ((((((firstPacket[8]) << 8) ^ (firstPacket[9])) << 8) ^ (firstPacket[10])) << 8) ^ (firstPacket[11]);
- intArr[2] = BitConverter.ToUInt32(firstPacket.Skip(8).Take(4).Reverse().ToArray(), 0);
- //intArr[3] = ((((((firstPacket[12]) << 8) ^ (firstPacket[13])) << 8) ^ (firstPacket[14])) << 8) ^ (firstPacket[15]);
- intArr[3] = BitConverter.ToUInt32(firstPacket.Skip(12).Take(4).Reverse().ToArray(), 0);
- if (length == 128)
- {
- return 10;
- }
- else
- {
- intArr[4] = BitConverter.ToUInt32(firstPacket.Skip(16).Take(4).Reverse().ToArray(), 0);
- intArr[5] = BitConverter.ToUInt32(firstPacket.Skip(20).Take(4).Reverse().ToArray(), 0);
- if (length == 192)
- {
- return 12;
- }
- else
- {
- intArr[6] = BitConverter.ToUInt32(firstPacket.Skip(24).Take(4).Reverse().ToArray(), 0);
- intArr[7] = BitConverter.ToUInt32(firstPacket.Skip(28).Take(4).Reverse().ToArray(), 0);
- if (length == 256) // Packet Fatal
- {
- var int7 = intArr[7];
- intArr[8] = (StaticArray.dwA139F0[(int7 >> 16) & 0xFF] ^ 0x1000000) & 0xFF000000 ^
- (StaticArray.dwA139F0[(int7 >> 8) & 0xFF] & 0xFF0000) ^
- (StaticArray.dwA139F0[(int7 >> 24)] & 0xFF) ^ // LOBYTE (MOVZX) phai AND voi 0xFF (giu 1 byte cuoi cung)
- (StaticArray.dwA139F0[int7 & 0xFF] &0xFF00) ^ intArr[0];
- //Console.WriteLine(intArr[8]);
- intArr[9] = intArr[8] ^ intArr[1];
- intArr[10] = intArr[9] ^ intArr[2];
- intArr[11] = intArr[10] ^ intArr[3];
- var v30 = 0;
- // Trong ASM nó là con trỏ trỏ để mảng returnArray thứ 48,
- // đồng nghĩa với biến int13
- var v34 = 48;
- do
- {
- var int11 = intArr[(v34 - 4)/4];
- var v35 = StaticArray.dwA139F0[(int11 >> 16) & 0xFF] & 0xFF0000 ^
- StaticArray.dwA139F0[(int11 >> 8) & 0xFF] & 0xFF00 ^
- StaticArray.dwA139F0[int11 >> 24] & 0xFF000000 ^
- StaticArray.dwA139F0[(int11) & 0xFF] & 0xFF ^
- intArr[(v34 - 32)/4];
- var v36 = v35 ^ intArr[(v34 - 28)/4];
- var v37 = v36 ^ intArr[(v34 - 24)/4];
- var v38 = v37 ^ intArr[(v34 - 20)/4];
- intArr[(v34)/4] = v35;
- intArr[(v34 + 4)/4] = v36;
- intArr[(v34 + 8)/4] = v37;
- intArr[(v34 + 12)/4] = v38;
- // Dời index thêm 32 bytes ( 8 số int)
- v34 += 32;
- v30++; // Index cua mang 2 tang len
- var v40 = StaticArray.dwA151F4[v30 - 1] ^
- intArr[(v34 - 48)/4] ^
- StaticArray.dwA139F0[v38 & 0xFF] & 0xFF00 ^
- (StaticArray.dwA139F0[v38 >> 24]) & 0xFF ^
- (StaticArray.dwA139F0[(v38 >> 16) & 0xFF]) & 0xFF000000 ^ 0xFF0000 &
- (StaticArray.dwA139F0[(v38 >> 8) & 0xFF]);
- var v41 = v40 ^ intArr[(v34 - 44) / 4];
- var v42 = v41 ^ intArr[(v34 - 40) / 4];
- var v43 = v42 ^ intArr[(v34 - 36) / 4];
- intArr[(v34 - 16)/4] = v40;
- intArr[(v34 - 12)/4] = v41;
- intArr[(v34 - 8)/4] = v42;
- intArr[(v34 - 4)/4] = v43;
- } while (v30 != 6);
- //foreach (var u in intArr)
- //{
- // Console.WriteLine("{0:X}", u);
- //}
- return 14;
- }
- return 0;
- }
- }
- return 0;
- }
- public static byte[] HexStringToByte(string s)
- {
- try
- {
- int num = s.Length / 2;
- var buffer = new byte[num];
- for (int i = 0; i < num; i++)
- {
- buffer[i] = Convert.ToByte(s.Substring(i * 2, 2), 16);
- }
- return buffer;
- }
- catch (Exception)
- {
- return new byte[s.Length];
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement