From 53c7e45e2ef2634f27d6893febe6757f1e61c4af Mon Sep 17 00:00:00 2001 From: 1987kostya Date: Fri, 1 Jan 2021 16:19:18 +0600 Subject: [PATCH] GUI cleanup --- CTFAK/CTFAK.csproj | 2 +- CTFAK/GUI/MainForm.Designer.cs | 2 +- CTFAK/GUI/MainForm.cs | 282 +++++++++++---------------------- CTFAK/MMFParser/EXE/EXE.cs | 53 +++---- CTFAK/Utils/Decryption.cs | 72 +++++++-- CTFAK/Utils/Helper.cs | 6 + Dependencies/Decrypter-x64.dll | Bin 19456 -> 19456 bytes 7 files changed, 180 insertions(+), 237 deletions(-) diff --git a/CTFAK/CTFAK.csproj b/CTFAK/CTFAK.csproj index e3ece02..e1e9076 100644 --- a/CTFAK/CTFAK.csproj +++ b/CTFAK/CTFAK.csproj @@ -8,7 +8,7 @@ Debug AnyCPU {86D99F9E-98FB-4E50-AB68-F5C115850C33} - WinExe + Exe CTFAK CTFAK v4.7.2 diff --git a/CTFAK/GUI/MainForm.Designer.cs b/CTFAK/GUI/MainForm.Designer.cs index bb3e0c6..68fa57f 100644 --- a/CTFAK/GUI/MainForm.Designer.cs +++ b/CTFAK/GUI/MainForm.Designer.cs @@ -752,7 +752,7 @@ this.Icon = ((System.Drawing.Icon) (resources.GetObject("$this.Icon"))); this.Location = new System.Drawing.Point(15, 15); this.Name = "MainForm"; - this.Text = "DotNetCTFDumper"; + this.Text = "CTFAK"; this.Load += new System.EventHandler(this.MainForm_Load); this.ChunkCombo.ResumeLayout(false); this.tabControl1.ResumeLayout(false); diff --git a/CTFAK/GUI/MainForm.cs b/CTFAK/GUI/MainForm.cs index b7328cd..d69dacb 100644 --- a/CTFAK/GUI/MainForm.cs +++ b/CTFAK/GUI/MainForm.cs @@ -17,13 +17,15 @@ using CTFAK.MMFParser.EXE.Loaders.Banks; using CTFAK.MMFParser.EXE.Loaders.Objects; using CTFAK.MMFParser.Translation; using CTFAK.Utils; -using Animation = CTFAK.MMFParser.EXE.Loaders.Objects.Animation; -using AnimationDirection = CTFAK.MMFParser.EXE.Loaders.Objects.AnimationDirection; namespace CTFAK.GUI { public partial class MainForm : Form { + public delegate void IncrementSortedProgressBar(int all); + + public delegate void SaveHandler(int index, int all); + public static bool IsDumpingImages; public static bool IsDumpingSounds; public static bool IsDumpingMusics; @@ -32,12 +34,14 @@ namespace CTFAK.GUI public static bool BreakMusics; public static bool Loaded; public static Color ColorTheme = Color.FromArgb(223, 114, 38); - - public delegate void SaveHandler(int index, int all); - public delegate void IncrementSortedProgressBar(int all); + private bool _breakAnim; + private bool _isAnimRunning; + private bool _isAudioPlaying; + private SoundPlayer _soundPlayer; + public MainForm(Color color) { @@ -52,27 +56,20 @@ namespace CTFAK.GUI if (item is Button) item.BackColor = Color.FromArgb(30, 30, 30); if (item is Label) - { //item.BackColor = Color.Transparent; item.Refresh(); - } } foreach (TabPage tabPage in tabControl1.TabPages) + foreach (Control item in tabPage.Controls) { - foreach (Control item in tabPage.Controls) - { - item.ForeColor = ColorTheme; - if (!(item is PictureBox) && !(item is TabPage)&&!(item is Label)) item.BackColor = Color.Black; - if (item is Button) item.BackColor = Color.FromArgb(30, 30, 30); - - if (item is Label) - { - //item.BackColor = Color.Transparent; - item.Refresh(); - } + item.ForeColor = ColorTheme; + if (!(item is PictureBox) && !(item is TabPage) && !(item is Label)) item.BackColor = Color.Black; + if (item is Button) item.BackColor = Color.FromArgb(30, 30, 30); - } + if (item is Label) + //item.BackColor = Color.Transparent; + item.Refresh(); } foreach (var item in ChunkCombo.Items) @@ -87,16 +84,17 @@ namespace CTFAK.GUI hexBox1.SelectionBackColor = Color.FromArgb(ColorTheme.R / 4, ColorTheme.G / 4, ColorTheme.B / 4); hexBox1.ShadowSelectionColor = Color.FromArgb(150, ColorTheme.R / 4, ColorTheme.G / 4, ColorTheme.B / 4); label1.Text = Settings.DumperVersion; + Text = Settings.DumperVersion; - Pame2Mfa.OnMessage += (obj) => + Pame2Mfa.OnMessage += obj => { var date = DateTime.Now; - string msg = (string) obj; + var msg = (string) obj; mfaLogBox.AppendText(msg.Length > 0 ? $"[{date.Hour,2}:{date.Minute,2}:{date.Second,2}:{date.Millisecond,3}] {msg}\r\n" : "\r\n"); }; - this.Closing += (a, e) => + Closing += (a, e) => { var dlg = MessageBox.Show("Are you sure you want to exit?", "Exiting", MessageBoxButtons.YesNo); if (dlg == DialogResult.Yes) Environment.Exit(0); @@ -104,40 +102,27 @@ namespace CTFAK.GUI }; KeyPreview = true; tabControl1.Selecting += tabControl1_Selecting; - //tabControl1.TabPages.Remove(mfaTab); - - } private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e) { if (!Loaded) - { if (e.TabPage != mainTab) e.Cancel = true; - } - //_soundPlayer.Stop(); - + //_soundPlayer.Stop(); } - private void openFileDialog1_FileOk(object sender, CancelEventArgs e) { var worker = new BackgroundWorker(); worker.DoWork += (workSender, workE) => { - if(File.Exists(openFileDialog1.FileName)) StartReading(); + if (File.Exists(openFileDialog1.FileName)) StartReading(); else throw new NotImplementedException("File not found"); - - }; - worker.RunWorkerCompleted += (workSender, workE) => - { - - AfterLoad(); - }; - + worker.RunWorkerCompleted += (workSender, workE) => { AfterLoad(); }; + worker.RunWorkerAsync(); } @@ -151,12 +136,11 @@ namespace CTFAK.GUI loadingLabel.Visible = false; listBox1.Items.Clear(); var console = new MainConsole(); - this.Location= new Point(0,0); - this.Size= new Size(this.Size.Width-100,Screen.PrimaryScreen.Bounds.Height-120); + Location = new Point(0, 0); + Size = new Size(Size.Width - 100, Screen.PrimaryScreen.Bounds.Height - 120); console.Show(); - console.Location = new Point(this.Location.X+this.Size.Width-15,0); - console.Size=new Size(console.Size.Width,this.Size.Height); - + console.Location = new Point(Location.X + Size.Width - 15, 0); + console.Size = new Size(console.Size.Width, Size.Height); } @@ -178,24 +162,16 @@ namespace CTFAK.GUI musicsButton.Visible = false; dumpSortedBtn.Visible = false; Loaded = false; - - - } private void treeView1_AfterDblClick(object sender, EventArgs e) { ChunkCombo.Show(Cursor.Position); - } private void treeView1_RightClick(object sender, MouseEventArgs e) { - if ((e.Button & MouseButtons.Right) != 0) - { - ChunkCombo.Show(Cursor.Position); - } - + if ((e.Button & MouseButtons.Right) != 0) ChunkCombo.Show(Cursor.Position); } private void ChunkCombo_ItemSelected(object sender, ToolStripItemClickedEventArgs e) @@ -204,11 +180,7 @@ namespace CTFAK.GUI { case "saveChunkBtn": var chunk = ((ChunkNode) treeView1.SelectedNode).chunk; - if (chunk != null) - { - chunk.Save(); - } - + chunk?.Save(); break; case "viewHexBtn": ShowHex(); @@ -233,7 +205,6 @@ namespace CTFAK.GUI listBox1.Items.Clear(); if (nodeChunk != null) { - listBox1.Items.Add($"Name: {nodeChunk.Name}"); listBox1.Items.Add($"Id: {nodeChunk.Id} - 0x{nodeChunk.Id:X4}"); listBox1.Items.Add($"Flag: {nodeChunk.Flag}"); @@ -265,7 +236,6 @@ namespace CTFAK.GUI public void AfterLoad() { - Logger.Log("Loading GUI"); //GameData gameData = null; var exe = Exe.Instance; @@ -275,13 +245,11 @@ namespace CTFAK.GUI treeView1.Nodes.Clear(); foreach (var item in gameData.GameChunks.Chunks) { - - string ActualName = item.Name; + var ActualName = item.Name; if (item.Loader is Frame frm) ActualName = ActualName + " " + frm.Name; - ChunkNode newNode = Helper.GetChunkNode(item, ActualName); + var newNode = Helper.GetChunkNode(item, ActualName); treeView1.Nodes.Add(newNode); if (item.Loader is Frame frame) - { foreach (var frmChunk in frame.Chunks.Chunks) { var frameNode = Helper.GetChunkNode(frmChunk); @@ -290,27 +258,21 @@ namespace CTFAK.GUI { var objs = frame.Chunks.GetChunk(); if (objs != null) - { foreach (var frmitem in objs.Items) { var objNode = new ChunkNode(frmitem.Name, frmitem); frameNode.Nodes.Add(objNode); } - } } } - } else if (item.Loader is FrameItems items) - { foreach (var key in items.ItemDict.Keys) { var frameItem = items.ItemDict[key]; var objNode = new ChunkNode($"{(Constants.ObjectType) frameItem.ObjectType} - {frameItem.Name}", frameItem); newNode.Nodes.Add(objNode); - } - } } FolderBTN.Visible = true; @@ -378,10 +340,7 @@ namespace CTFAK.GUI SortedProgressBar.Visible = true; SortedProgressBar.Maximum = all; SortedProgressBar.Value += 1; - if (SortedProgressBar.Value >= SortedProgressBar.Maximum) - { - SortedProgressBar.Visible = false; - } + if (SortedProgressBar.Value >= SortedProgressBar.Maximum) SortedProgressBar.Visible = false; } @@ -391,7 +350,6 @@ namespace CTFAK.GUI } - private void soundsButton_Click(object sender, EventArgs e) { if (Exe.Instance.GameData.GameChunks.GetChunk() == null) return; @@ -400,7 +358,6 @@ namespace CTFAK.GUI SetSoundElements(true); IsDumpingSounds = true; Backend.DumpSounds(this, true, true); - } else { @@ -418,8 +375,6 @@ namespace CTFAK.GUI SetImageElements(true); IsDumpingImages = true; Backend.DumpImages(this, true, true); - - } else { @@ -444,7 +399,6 @@ namespace CTFAK.GUI IsDumpingMusics = false; SetMusicElements(false); } - } @@ -476,7 +430,7 @@ namespace CTFAK.GUI { if ((ChunkNode) treeView1.SelectedNode != null) { - var node = ((ChunkNode) treeView1.SelectedNode); + var node = (ChunkNode) treeView1.SelectedNode; HexViewForm hexform = null; hexform = new HexViewForm(node.chunk.ChunkData, node.chunk.RawData, ColorTheme, @@ -484,11 +438,9 @@ namespace CTFAK.GUI hexform.Show(); } - } - private void dumpSortedBtn_Click(object sender, EventArgs e) { imageBar.Visible = true; @@ -500,7 +452,6 @@ namespace CTFAK.GUI var bank = Exe.Instance.GameData.GameChunks.GetChunk(); bank.SaveImages = false; bank.Read(); - }; worker.RunWorkerCompleted += (senderA, eA) => { @@ -512,11 +463,6 @@ namespace CTFAK.GUI } - - - - - private void dumpMFAButton_Click(object sender, EventArgs e) { var worker = new BackgroundWorker(); @@ -526,17 +472,13 @@ namespace CTFAK.GUI Logger.Log("MFA Done", true, ConsoleColor.Yellow); var res = MessageBox.Show("Dump Extensions?", "Finished", MessageBoxButtons.YesNo); if (res == DialogResult.Yes) - { foreach (var item in Exe.Instance.PackData.Items) { item.Dump(); Pame2Mfa.Message("Dumping " + item.PackFilename); } - } - Process.Start($"{Settings.DumpPath}"); - }; worker.RunWorkerAsync(); @@ -561,9 +503,8 @@ namespace CTFAK.GUI try { - var previewKey = Decryption.MakeKeyFromComb(rawData, (byte) int.Parse((charBox.Text))); + var previewKey = Decryption.MakeKeyFromComb(rawData, (byte) int.Parse(charBox.Text)); hexBox1.ByteProvider = new DynamicByteProvider(previewKey); - } catch { @@ -574,10 +515,7 @@ namespace CTFAK.GUI public void InitPackDataTab() { packDataListBox.Items.Clear(); - foreach (var item in Exe.Instance.PackData.Items) - { - packDataListBox.Items.Add(item.PackFilename); - } + foreach (var item in Exe.Instance.PackData.Items) packDataListBox.Items.Add(item.PackFilename); UpdatePackInfo(0); } @@ -603,10 +541,7 @@ namespace CTFAK.GUI private void dumpAllPackButton_Click(object sender, EventArgs e) { - foreach (var item in Exe.Instance.PackData.Items) - { - item.Dump(); - } + foreach (var item in Exe.Instance.PackData.Items) item.Dump(); } private void packDataDialog_FileOk(object sender, CancelEventArgs e) @@ -615,8 +550,10 @@ namespace CTFAK.GUI item.Dump(packDataDialog.FileName); } - private void packDataListBox_SelectedIndexChanged(object sender, EventArgs e) => + private void packDataListBox_SelectedIndexChanged(object sender, EventArgs e) + { UpdatePackInfo(packDataListBox.SelectedIndex); + } private void plusCharBtn_Click(object sender, EventArgs e) { @@ -631,9 +568,10 @@ namespace CTFAK.GUI InitKeyTab(); } - private void charBox_TextChanged(object sender, EventArgs e) => InitKeyTab(); - - + private void charBox_TextChanged(object sender, EventArgs e) + { + InitKeyTab(); + } public void InitImages() @@ -642,13 +580,12 @@ namespace CTFAK.GUI var bank = Exe.Instance.GameData.GameChunks.GetChunk(); var items = bank.Images.ToList(); var filtered = items.OrderBy(x => x.Value.Handle); - foreach (Frame frame in Exe.Instance.GameData.Frames) + foreach (var frame in Exe.Instance.GameData.Frames) { var frameNode = new ChunkNode(frame.Name, frame); imagesTreeView.Nodes.Add(frameNode); if (frame.Objects != null) - { - foreach (ObjectInstance objInst in frame.Objects.Items) + foreach (var objInst in frame.Objects.Items) { var objInstNode = new ChunkNode(objInst.FrameItem.Name, objInst); frameNode.Nodes.Add(objInstNode); @@ -656,20 +593,19 @@ namespace CTFAK.GUI if (loader is ObjectCommon common) { if (common.Animations != null) - { foreach (var pair in common.Animations.AnimationDict) { var animNode = new ChunkNode($"Animation {pair.Key}", pair.Value); objInstNode.Nodes.Add(animNode); foreach (var dir in pair.Value.DirectionDict) - { if (pair.Value.DirectionDict.Count > 1) { - var dirNode = new ChunkNode($"Direction {pair.Value.DirectionDict.ToList().IndexOf(dir)}",dir.Value); + var dirNode = new ChunkNode( + $"Direction {pair.Value.DirectionDict.ToList().IndexOf(dir)}", + dir.Value); animNode.Nodes.Add(dirNode); - for (int a = 0; a < dir.Value.Frames.Count; a++) + for (var a = 0; a < dir.Value.Frames.Count; a++) { - var animFrame = dir.Value.Frames[a]; bank.Images.TryGetValue(animFrame, out var img); if (img != null) @@ -677,14 +613,12 @@ namespace CTFAK.GUI var animFrameNode = new ChunkNode(a.ToString(), img); dirNode.Nodes.Add(animFrameNode); } - } } else { - for (int a = 0; a < dir.Value.Frames.Count; a++) + for (var a = 0; a < dir.Value.Frames.Count; a++) { - var animFrame = dir.Value.Frames[a]; bank.Images.TryGetValue(animFrame, out var img); if (img != null) @@ -692,17 +626,13 @@ namespace CTFAK.GUI var animFrameNode = new ChunkNode(a.ToString(), img); animNode.Nodes.Add(animFrameNode); } - } } - - } } - } } else if (loader is Backdrop backdrop) { - bank.Images.TryGetValue(backdrop.Image,out var img); + bank.Images.TryGetValue(backdrop.Image, out var img); if (img != null) { var backdropNode = new ChunkNode("Image", img); @@ -710,14 +640,9 @@ namespace CTFAK.GUI } } } - } } } - private bool _breakAnim; - private bool _isAnimRunning; - private SoundPlayer _soundPlayer; - private void advancedPlayAnimation_Click(object sender, EventArgs e) { if (((ChunkNode) imagesTreeView.SelectedNode).loader is Animation anim) @@ -730,17 +655,15 @@ namespace CTFAK.GUI { _isAnimRunning = true; var animThread = new Thread(PlayAnimation); - List frames = new List(); + var frames = new List(); foreach (var dir in anim.DirectionDict) { foreach (var frame in dir.Value.Frames) - { frames.Add(Exe.Instance.GameData.GameChunks.GetChunk().Images[frame].Bitmap); - } - animThread.Start(new Tuple,AnimationDirection>(frames,dir.Value)); + animThread.Start(new Tuple, AnimationDirection>(frames, dir.Value)); break; } - } + } } else if (((ChunkNode) imagesTreeView.SelectedNode).loader is AnimationDirection dir) { @@ -752,41 +675,41 @@ namespace CTFAK.GUI { _isAnimRunning = true; var animThread = new Thread(PlayAnimation); - List frames = new List(); + var frames = new List(); foreach (var frame in dir.Frames) { - - frames.Add(Exe.Instance.GameData.GameChunks.GetChunk().Images[frame].Bitmap); - - animThread.Start(new Tuple,AnimationDirection>(frames,dir)); + frames.Add(Exe.Instance.GameData.GameChunks.GetChunk().Images[frame].Bitmap); + + animThread.Start(new Tuple, AnimationDirection>(frames, dir)); break; } } - - - - } - } + public void PlayAnimation(object o) { - var (frames,anim) = (Tuple,AnimationDirection>) o; - var fps = (float)anim.MaxSpeed; - float delay = 1f/fps; - int i = 0; - if (anim.Repeat > 0&& anim.Frames.Count>1) + var (frames, anim) = (Tuple, AnimationDirection>) o; + var fps = (float) anim.MaxSpeed; + var delay = 1f / fps; + var i = 0; + if (anim.Repeat > 0 && anim.Frames.Count > 1) { - foreach (Bitmap frame in frames) + foreach (var frame in frames) { imageViewPictureBox.Image = frame; imageViewerInfo.Text = $"Current frame: {frames.IndexOf(frame)}\nAnimation Speed: {fps}"; - Thread.Sleep((int) (delay*1500)); + Thread.Sleep((int) (delay * 1500)); } + _isAnimRunning = false; - try {Thread.CurrentThread.Abort();} - catch {} - + try + { + Thread.CurrentThread.Abort(); + } + catch + { + } } else { @@ -795,25 +718,18 @@ namespace CTFAK.GUI var frame = frames[i]; imageViewPictureBox.Image = frame; imageViewerInfo.Text = $"Current frame: {i.ToString()}\nAnimation Speed: {fps}"; - Thread.Sleep((int) (delay*1500)); + Thread.Sleep((int) (delay * 1500)); i++; if (i == frames.Count) i = 0; if (_breakAnim) { _isAnimRunning = false; _breakAnim = false; - if(Thread.CurrentThread.IsAlive) Thread.CurrentThread.Abort(); + if (Thread.CurrentThread.IsAlive) Thread.CurrentThread.Abort(); break; - } - - } } - - - - } private void advancedTreeView_AfterSelect(object sender, TreeViewEventArgs e) @@ -821,23 +737,16 @@ namespace CTFAK.GUI var node = e.Node; if (((ChunkNode) node).loader is ImageItem) { - var img = ((ImageItem) ((ChunkNode) node).loader); + var img = (ImageItem) ((ChunkNode) node).loader; imageViewPictureBox.Image = img.Bitmap; } - } - public void InitPlugins() { PluginAPI.PluginAPI.InitializePlugins(); - foreach (var plugin in PluginAPI.PluginAPI.Plugins) - { - pluginsList.Items.Add(plugin.Name); - - } - + foreach (var plugin in PluginAPI.PluginAPI.Plugins) pluginsList.Items.Add(plugin.Name); } private void activatePluginBtn_Click(object sender, EventArgs e) @@ -845,47 +754,39 @@ namespace CTFAK.GUI PluginAPI.PluginAPI.ActivatePlugin(PluginAPI.PluginAPI.Plugins[pluginsList.SelectedIndex]); } - public void InitSounds() { var bank = Exe.Instance.GameData.GameChunks.GetChunk(); if (bank == null) return; - foreach (SoundItem soundItem in bank.Items) - { - soundList.Nodes.Add(new ChunkNode(soundItem.Name,soundItem)); - } - _soundPlayer = new SoundPlayer(new MemoryStream(Exe.Instance.GameData.GameChunks.GetChunk().Items[0].Data)); - + foreach (var soundItem in bank.Items) soundList.Nodes.Add(new ChunkNode(soundItem.Name, soundItem)); + _soundPlayer = + new SoundPlayer(new MemoryStream(Exe.Instance.GameData.GameChunks.GetChunk().Items[0].Data)); } - - private bool _isAudioPlaying; private void playSoundBtn_Click(object sender, EventArgs e) { - _soundPlayer.Stream = new MemoryStream(Exe.Instance.GameData.GameChunks.GetChunk().Items[soundList.SelectedNode.Index].Data); + _soundPlayer.Stream = new MemoryStream(Exe.Instance.GameData.GameChunks.GetChunk() + .Items[soundList.SelectedNode.Index].Data); _soundPlayer.Play(); } private void soundList_AfterSelect(object sender, TreeViewEventArgs e) { - } - + protected override void OnKeyDown(KeyEventArgs e) { if (tabControl1.SelectedTab == imgViewerTab) - { if (e.Control) { - var node = (ChunkNode)imagesTreeView.SelectedNode; - var path = $"{Settings.ImagePath}\\{Helper.GetTreePath(imagesTreeView,(ChunkNode) imagesTreeView.SelectedNode)}"; + var node = (ChunkNode) imagesTreeView.SelectedNode; + var path = + $"{Settings.ImagePath}\\{Helper.GetTreePath(imagesTreeView, (ChunkNode) imagesTreeView.SelectedNode)}"; if (node == null) return; ImageDumper.SaveFromNode(node); - } - } } private void stopSoundBtn_Click(object sender, EventArgs e) @@ -893,9 +794,4 @@ namespace CTFAK.GUI _soundPlayer.Stop(); } } -} - - - - - +} \ No newline at end of file diff --git a/CTFAK/MMFParser/EXE/EXE.cs b/CTFAK/MMFParser/EXE/EXE.cs index 1f616b5..b0e4db8 100644 --- a/CTFAK/MMFParser/EXE/EXE.cs +++ b/CTFAK/MMFParser/EXE/EXE.cs @@ -1,70 +1,66 @@ using System; -using System.IO; using CTFAK.Utils; namespace CTFAK.MMFParser.EXE { public class Exe { - public PackData PackData; - public GameData GameData; public static Exe Instance; + public GameData GameData; + public PackData PackData; + public void ParseExe(ByteReader exeReader) { - Logger.Log($"Executable: {Settings.GameName}\n", true, ConsoleColor.DarkRed); - string sig = exeReader.ReadAscii(2); + var sig = exeReader.ReadAscii(2); Logger.Log("EXE Header: " + sig, true, ConsoleColor.Yellow); - if (sig != "MZ") - { - Logger.Log("Invalid executable signature",true,ConsoleColor.Red); - } + if (sig != "MZ") Logger.Log("Invalid executable signature", true, ConsoleColor.Red); - exeReader.Seek(60, SeekOrigin.Begin); + exeReader.Seek(60); - UInt16 hdrOffset = exeReader.ReadUInt16(); + var hdrOffset = exeReader.ReadUInt16(); - exeReader.Seek(hdrOffset, SeekOrigin.Begin); - string peHdr = exeReader.ReadAscii(2); + exeReader.Seek(hdrOffset); + var peHdr = exeReader.ReadAscii(2); Logger.Log("PE Header: " + peHdr, true, ConsoleColor.Yellow); exeReader.Skip(4); - UInt16 numOfSections = exeReader.ReadUInt16(); + var numOfSections = exeReader.ReadUInt16(); exeReader.Skip(16); - int optionalHeader = 28 + 68; - int dataDir = 16 * 8; + var optionalHeader = 28 + 68; + var dataDir = 16 * 8; exeReader.Skip(optionalHeader + dataDir); - int possition = 0; - for (int i = 0; i < numOfSections; i++) + var possition = 0; + for (var i = 0; i < numOfSections; i++) { - long entry = exeReader.Tell(); + var entry = exeReader.Tell(); - string sectionName = exeReader.ReadAscii(); + var sectionName = exeReader.ReadAscii(); if (sectionName == ".extra") { exeReader.Seek(entry + 20); - possition = (int)exeReader.ReadUInt32(); + possition = (int) exeReader.ReadUInt32(); break; } if (i >= numOfSections - 1) { exeReader.Seek(entry + 16); - uint size = exeReader.ReadUInt32(); - uint address = exeReader.ReadUInt32(); - possition = (int)(address + size); + var size = exeReader.ReadUInt32(); + var address = exeReader.ReadUInt32(); + possition = (int) (address + size); break; } exeReader.Seek(entry + 40); } - exeReader.Seek((int)possition); - UInt16 firstShort = exeReader.PeekUInt16(); + exeReader.Seek(possition); + var firstShort = exeReader.PeekUInt16(); Logger.Log("First Short: " + firstShort.ToString("X2"), true, ConsoleColor.Yellow); if (firstShort == 0x7777) Settings.Old = false; else Settings.Old = true; @@ -76,8 +72,6 @@ namespace CTFAK.MMFParser.EXE GameData = new GameData(); GameData.Read(exeReader); Console.ForegroundColor = ConsoleColor.DarkGreen; - - } else { @@ -88,7 +82,6 @@ namespace CTFAK.MMFParser.EXE Console.ForegroundColor = ConsoleColor.DarkGreen; Logger.Log("Failed to find PackData header!\n", true, ConsoleColor.Red); } - } } -} +} \ No newline at end of file diff --git a/CTFAK/Utils/Decryption.cs b/CTFAK/Utils/Decryption.cs index 1ca6cea..e2c9036 100644 --- a/CTFAK/Utils/Decryption.cs +++ b/CTFAK/Utils/Decryption.cs @@ -1,32 +1,77 @@ using System; +using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; +using System.Text; namespace CTFAK.Utils { static class Decryption { private static byte[] _decryptionKey; - public static byte MagicChar = 54; + public static byte MagicChar = 0; - public static void MakeKey(string data1, string data2, string data3) + public static byte[] FixString(byte[] bytes) { - var rawKey = ""; - rawKey += data1; - rawKey += data2; - rawKey += data3; - Logger.Log("Combined data " + rawKey, true, ConsoleColor.Yellow); - var rawKeyPtr = Marshal.StringToHGlobalAnsi(rawKey); + List newBytes = new List(); + foreach (byte b in bytes) + { + if(b!=0) newBytes.Add(b); + } - var ptr = Decryption.make_key_combined(rawKeyPtr, MagicChar); + return bytes; //newBytes.ToArray(); - byte[] key = new byte[256]; - Marshal.Copy(ptr, key, 0, 256); - Marshal.FreeHGlobal(rawKeyPtr); + } + public static void MakeKey(string data1, string data2, string data3) + { + + var russian = false; + IntPtr keyPtr=new IntPtr(); + if (russian) + { + + var fixed1 = FixString(Encoding.Unicode.GetBytes(data1)); + var data1Ptr = Marshal.AllocHGlobal(fixed1.Length); + Marshal.Copy(fixed1,0,data1Ptr,fixed1.Length); + + var fixed2 = FixString(Encoding.Unicode.GetBytes(data2)); + var data2Ptr = Marshal.AllocHGlobal(fixed2.Length); + Marshal.Copy(fixed2,0,data2Ptr,fixed2.Length); + + var fixed3 = FixString(Encoding.Unicode.GetBytes(data3)); + var data3Ptr = Marshal.AllocHGlobal(fixed3.Length); + Marshal.Copy(fixed3,0,data1Ptr,fixed3.Length); + + + keyPtr = make_key_w(data1Ptr,data2Ptr,data3Ptr,MagicChar); + Marshal.FreeHGlobal(data1Ptr); + Marshal.FreeHGlobal(data2Ptr); + Marshal.FreeHGlobal(data3Ptr); + } + else + { + var rawKey = ""; + rawKey += data1; + rawKey += data2; + rawKey += data3; + Logger.Log("Combined data " + rawKey, true, ConsoleColor.Yellow); + keyPtr = Marshal.StringToHGlobalAnsi(rawKey); + keyPtr = make_key_combined(keyPtr, MagicChar); + + + } + byte[] key = new byte[256]; + Marshal.Copy(keyPtr, key, 0, 256); _decryptionKey = key; + + + + + Logger.Log($"First 16-Bytes of key: {_decryptionKey.GetHex(16)}", true, ConsoleColor.Yellow); + Logger.Log(Encoding.Unicode.GetString(_decryptionKey)); File.WriteAllBytes($"{Settings.DumpPath}\\key.bin", _decryptionKey); } @@ -90,6 +135,9 @@ namespace CTFAK.Utils [DllImport(_dllPath, EntryPoint = "make_key", CharSet = CharSet.Auto)] public static extern IntPtr make_key(IntPtr cTitle, IntPtr cCopyright, IntPtr cProject, byte magicChar); + [DllImport(_dllPath, EntryPoint = "make_key_w", CharSet = CharSet.Unicode)] + public static extern IntPtr make_key_w(IntPtr cTitle, IntPtr cCopyright, IntPtr cProject, byte magicChar); + [DllImport(_dllPath, EntryPoint = "make_key_combined", CharSet = CharSet.Auto)] public static extern IntPtr make_key_combined(IntPtr data, byte magicChar); diff --git a/CTFAK/Utils/Helper.cs b/CTFAK/Utils/Helper.cs index bc556df..146cfa6 100644 --- a/CTFAK/Utils/Helper.cs +++ b/CTFAK/Utils/Helper.cs @@ -167,6 +167,12 @@ namespace CTFAK.Utils return colors; } + public static bool ContainsUnicodeCharacter(string input) + { + const int MaxAnsiCode = 255; + + return input.Any(c => c > MaxAnsiCode); + } public static void CheckPattern(object source, object pattern) { diff --git a/Dependencies/Decrypter-x64.dll b/Dependencies/Decrypter-x64.dll index faa7151a9f05ae82c687b8e916f5dfdbc5d474ab..3f9367982e4da720ed0211e34c4091fab698b2b9 100644 GIT binary patch delta 7083 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 I^G3P<1~D=Kg#Z8m delta 7150 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 V?cKfimA(9>+L!9PXU^}J{uhN|O6C9n