diff --git a/ArcFormats/CatSystem/ArcINT.cs b/ArcFormats/CatSystem/ArcINT.cs index a69bcab9..c8c68429 100644 --- a/ArcFormats/CatSystem/ArcINT.cs +++ b/ArcFormats/CatSystem/ArcINT.cs @@ -27,9 +27,9 @@ using System; using System.IO; using System.Linq; using System.Text; +using System.ComponentModel; using System.ComponentModel.Composition; using System.Collections.Generic; -using System.Diagnostics; using Simias.Encryption; using System.Runtime.InteropServices; using GameRes.Formats.Strings; @@ -346,5 +346,82 @@ namespace GameRes.Formats.CatSystem } } } + + /// + /// Parse certain executable resources for encryption passphrase. + /// Returns null if no passphrase found. + /// + public static string GetPassFromExe (string filename) + { + var exe = NativeMethods.LoadLibraryEx (filename, IntPtr.Zero, 0x20); // LOAD_LIBRARY_AS_IMAGE_RESOURCE + if (IntPtr.Zero == exe) + throw new Win32Exception (Marshal.GetLastWin32Error()); + try + { + var code = GetResource (exe, "DATA", "V_CODE2"); + if (null == code || code.Length < 8) + return null; + var key = GetResource (exe, "KEY", "KEY_CODE"); + if (null != key) + { + for (int i = 0; i < key.Length; ++i) + key[i] ^= 0xCD; + } + else + { + key = Encoding.ASCII.GetBytes ("windmill"); + } + var blowfish = new Blowfish (key); + blowfish.Decipher (code, code.Length/8*8); + int length = Array.IndexOf (code, 0); + if (-1 == length) + length = code.Length; + return Encodings.cp932.GetString (code, 0, length); + } + finally + { + NativeMethods.FreeLibrary (exe); + } + } + + static byte[] GetResource (IntPtr exe, string name, string type) + { + var res = NativeMethods.FindResource (exe, name, type); + if (IntPtr.Zero == res) + return null; + var glob = NativeMethods.LoadResource (exe, res); + if (IntPtr.Zero == glob) + return null; + uint size = NativeMethods.SizeofResource (exe, res); + var src = NativeMethods.LockResource (glob); + if (IntPtr.Zero == src) + return null; + + var dst = new byte[size]; + Marshal.Copy (src, dst, 0, dst.Length); + return dst; + } + } + + static internal class NativeMethods + { + [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] + static internal extern IntPtr LoadLibraryEx (string lpFileName, IntPtr hReservedNull, uint dwFlags); + + [DllImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + static internal extern bool FreeLibrary (IntPtr hModule); + + [DllImport( "kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] + static internal extern IntPtr FindResource (IntPtr hModule, string lpName, string lpType); + + [DllImport("Kernel32.dll", SetLastError = true)] + static internal extern IntPtr LoadResource (IntPtr hModule, IntPtr hResource); + + [DllImport("Kernel32.dll", SetLastError = true)] + static internal extern uint SizeofResource (IntPtr hModule, IntPtr hResource); + + [DllImport("kernel32.dll")] + static internal extern IntPtr LockResource (IntPtr hResData); } } diff --git a/ArcFormats/CatSystem/WidgetINT.xaml b/ArcFormats/CatSystem/WidgetINT.xaml index 2bcb71cf..b80a0b6b 100644 --- a/ArcFormats/CatSystem/WidgetINT.xaml +++ b/ArcFormats/CatSystem/WidgetINT.xaml @@ -1,10 +1,21 @@ - + MaxWidth="280" Orientation="Vertical"> + + + + + + +