You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
3.1 KiB
C#
82 lines
3.1 KiB
C#
using NetMFAPatcher.Utils;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace NetMFAPatcher.utils
|
|
{
|
|
class Decryption
|
|
{
|
|
public static byte[] DecryptionKey;
|
|
public static byte MagicChar=54;
|
|
public static void MakeKey(string STitle, string SCopyright,string SProject)
|
|
{
|
|
var RawKey = "";
|
|
RawKey += STitle;
|
|
RawKey += SCopyright;
|
|
RawKey += SProject;
|
|
Logger.Log("Combined data "+RawKey,true,ConsoleColor.Yellow);
|
|
var RawKeyPTR = Marshal.StringToHGlobalAnsi(RawKey);
|
|
|
|
var ptr = Decryption.make_key_combined(RawKeyPTR, MagicChar);
|
|
|
|
byte[] Key = new byte[257];
|
|
Marshal.Copy(ptr, Key, 0, 256);
|
|
Marshal.FreeHGlobal(RawKeyPTR);
|
|
|
|
DecryptionKey = Key;
|
|
Logger.Log($"First 16-Bytes of key: {DecryptionKey.GetHex(16)}",true,ConsoleColor.Yellow);
|
|
File.WriteAllBytes($"{Program.DumpPath}\\key.bin", DecryptionKey);
|
|
}
|
|
|
|
|
|
public static byte[] DecodeMode3(byte[] ChunkData, int ChunkSize,int ChunkID)
|
|
{
|
|
var reader = new ByteIO(ChunkData);
|
|
var DecompressedSize = reader.ReadUInt32();
|
|
|
|
var chunkData = reader.ReadBytes((int)reader.Size());
|
|
if (ChunkID % 2 != 0)
|
|
{
|
|
chunkData[0] ^= (byte)(((byte)ChunkID & 0xFF) ^ ((byte)ChunkID >> 0x8));
|
|
}
|
|
var rawData = DecodeChunk(chunkData, ChunkSize);
|
|
var data = new ByteIO(rawData);
|
|
var compressed_size = data.ReadUInt32();
|
|
|
|
return Decompressor.decompress_block(data, (int)compressed_size, (int)DecompressedSize);
|
|
}
|
|
public static byte[] DecodeChunk(byte[] ChunkData, int ChunkSize)
|
|
{
|
|
IntPtr InputChunkPtr = Marshal.AllocHGlobal(ChunkData.Length);
|
|
Marshal.Copy(ChunkData, 0, InputChunkPtr, ChunkData.Length);
|
|
|
|
IntPtr KeyPtr = Marshal.AllocHGlobal(DecryptionKey.Length);
|
|
Marshal.Copy(DecryptionKey, 0, KeyPtr, DecryptionKey.Length);
|
|
|
|
var OutputChunkPtr = decode_chunk(InputChunkPtr, ChunkSize, MagicChar, KeyPtr);
|
|
|
|
byte[] DecodedChunk = new byte[ChunkSize];
|
|
Marshal.Copy(OutputChunkPtr, DecodedChunk,0,ChunkSize);
|
|
|
|
Marshal.FreeHGlobal(InputChunkPtr);
|
|
Marshal.FreeHGlobal(KeyPtr);
|
|
|
|
return DecodedChunk;
|
|
}
|
|
|
|
|
|
|
|
[DllImport("Decrypter-x64.dll", EntryPoint = "decode_chunk", CharSet = CharSet.Auto)]
|
|
public static extern IntPtr decode_chunk(IntPtr chunk_data, int chunk_size, byte magic_char,IntPtr wrapper_key);
|
|
[DllImport("Decrypter-x64.dll", EntryPoint = "make_key", CharSet = CharSet.Auto)]
|
|
public static extern IntPtr make_key(IntPtr c_title, IntPtr c_copyright, IntPtr c_project, byte magic_char);
|
|
[DllImport("Decrypter-x64.dll", EntryPoint = "make_key_combined", CharSet = CharSet.Auto)]
|
|
public static extern IntPtr make_key_combined(IntPtr data, byte magic_char);
|
|
}
|
|
}
|