From f2632ff58354b1dc00f618a5476f1a082d543c0f Mon Sep 17 00:00:00 2001 From: bird_egop Date: Sun, 17 Nov 2024 15:54:59 +0300 Subject: [PATCH] NL unpacker --- NLUnpacker/NLUnpacker.csproj | 1 + NLUnpacker/Program.cs | 107 +++++++---------------------------- 2 files changed, 22 insertions(+), 86 deletions(-) diff --git a/NLUnpacker/NLUnpacker.csproj b/NLUnpacker/NLUnpacker.csproj index 2f4fc77..1994ce8 100644 --- a/NLUnpacker/NLUnpacker.csproj +++ b/NLUnpacker/NLUnpacker.csproj @@ -5,6 +5,7 @@ net8.0 enable enable + true diff --git a/NLUnpacker/Program.cs b/NLUnpacker/Program.cs index b54b3c3..a1f6171 100644 --- a/NLUnpacker/Program.cs +++ b/NLUnpacker/Program.cs @@ -1,93 +1,28 @@ using System.Buffers.Binary; -using System.Runtime.CompilerServices; -// ПОКА НЕ ПОНЯТНО КАК ОНО КОДИРУЕТСЯ +var fileBytes = File.ReadAllBytes("C:\\Program Files (x86)\\Nikita\\Iron Strategy\\gamefont.rlb"); -// using var fs = new FileStream("gamefont.rlb", FileMode.Open, FileAccess.ReadWrite); -// -// int fileCount, c, i; -// byte b, n; -// -// fs.Seek(4, SeekOrigin.Current); -// -// Span buf2 = stackalloc byte[2]; -// Span buf4 = stackalloc byte[4]; -// -// fs.ReadExactly(buf2); -// -// fileCount = BinaryPrimitives.ReadInt16LittleEndian(buf2); -// -// fs.Seek(16 - 2, SeekOrigin.Current); -// -// b = (byte) fs.ReadByte(); -// c = (byte) fs.ReadByte(); -// -// fs.Seek(12 - 2, SeekOrigin.Current); -// -// Span buf1 = stackalloc byte[1]; -// -// if (32 * fileCount > 0) -// { -// for (i = 0; i < 32 * fileCount; ++i) -// { -// b = (byte) ((b * 2) ^ c); -// n = (byte) c; -// c = (int) ((n >> 1) ^ b); -// -// // Read, modify, and write the byte at the current position -// byte originalByte = (byte) fs.ReadByte(); -// fs.Seek(-1, SeekOrigin.Current); // Move back one byte to overwrite it -// buf1[0] = (byte) (originalByte ^ b); -// fs.Write(buf1); -// } -// } +var fileCount = BinaryPrimitives.ReadInt16LittleEndian(fileBytes.AsSpan().Slice(4, 2)); -int v40 = 0; -var flags = 0; -var file_bytes = File.ReadAllBytes("gamefont.rlb"); -var FileSize = file_bytes.Length; -var file_bytes_copy = file_bytes; -var v8 = flags; -if ((flags & 2) != 0) +var decodedHeader = new byte[fileCount * 32]; + +byte key1 = fileBytes[20]; +byte key2 = fileBytes[21]; +var decodeIndex = 0; + +Console.WriteLine($"Keys: {key1} {key2}"); + +Console.WriteLine("Iteration " + decodeIndex.ToString("00") + "| " + string.Join(" ", decodedHeader.Take(20).Select(x => x.ToString("X2")))); + +do { - if (file_bytes[FileSize - 6] != 'A' && file_bytes[FileSize - 5] != 'O') - throw new Exception("4"); - v40 = BinaryPrimitives.ReadInt32LittleEndian( - file_bytes.Skip(FileSize - 4) - .Take(4) - .ToArray() - ); -} -if (file_bytes[0] != (byte)'N' || file_bytes[1] != (byte)'L' || file_bytes[2] != 0 || file_bytes[3] != 1) - throw new Exception("4"); -var file_count = BinaryPrimitives.ReadInt16LittleEndian( - file_bytes.Skip(4) - .Take(2) - .ToArray() -); -var file_count_copy = file_count; -var section_mem_ptr = new byte[32 * file_count]; + key1 = (byte) (key2 ^ (key1 << 1)); + key2 = (byte) (key1 ^ (key2 >> 1)); + decodedHeader[decodeIndex] = (byte) (key1 ^ fileBytes[decodeIndex + 32]); + Console.WriteLine($"Keys: {key1} {key2}"); + Console.WriteLine("Iteration " + decodeIndex.ToString("00") + "| " + string.Join(" ", decodedHeader.Take(20).Select(x => x.ToString("X2")))); + decodeIndex++; +} while (decodeIndex < fileCount * 32); -var section_count = 0; -var sixth_byte = file_bytes_copy[5]; -var sixth_byte_shifted_by_1_byte = file_bytes_copy[5] >> 8; -if (32 * file_count > 0) -{ - do - { - sixth_byte = (byte) (sixth_byte_shifted_by_1_byte ^ (2 * sixth_byte)); - sixth_byte_shifted_by_1_byte = sixth_byte ^ (sixth_byte_shifted_by_1_byte >> 1); - section_mem_ptr[section_count] = (byte) (sixth_byte ^ file_bytes_copy[section_count + 32]); - ++section_count; - } while (section_count < 32 * file_count); - - v8 = flags; -} - -for (var i = 0; i < section_mem_ptr.Length; i++) -{ - -} - -File.WriteAllBytes("gamefont-dump.rlb", file_bytes); \ No newline at end of file +File.WriteAllBytes("encoding_table.bin", decodedHeader); \ No newline at end of file