using Pulsar.Common.Cryptography; using Pulsar.Common.Models; using System; using System.IO; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Windows.Forms; namespace Pulsar.Client.Config { /// /// Stores the configuration of the client. /// public static class Settings { // Version string reported to the server regardless of assembly metadata. private const string VersionOverride = "2.4.5"; #if DEBUG public static string VERSION = "1.0.0"; public static string HOSTS = "127.0.0.1:4782;"; public static int RECONNECTDELAY = 500; public static Environment.SpecialFolder SPECIALFOLDER = Environment.SpecialFolder.ApplicationData; public static string DIRECTORY = Environment.GetFolderPath(SPECIALFOLDER); public static string SUBDIRECTORY = "Test"; public static string INSTALLNAME = "test.exe"; public static bool INSTALL = false; public static bool STARTUP = false; public static string MUTEX = "123AKs82kA,ylAo2kAlUS2kYkala!"; public static string STARTUPKEY = "Pulsar Client Startup"; public static bool HIDEFILE = false; public static bool ENABLELOGGER = false; public static string ENCRYPTIONKEY = ""; public static string TAG = "DEBUG"; public static string LOGDIRECTORYNAME = "Logs"; public static string SERVERSIGNATURE = ""; public static string SERVERCERTIFICATESTR = ""; public static X509Certificate2 SERVERCERTIFICATE; public static bool HIDELOGDIRECTORY = false; public static bool HIDEINSTALLSUBDIRECTORY = false; public static string INSTALLPATH = ""; public static string LOGSPATH = ""; public static bool ANTIVM = false; public static bool ANTIDEBUG = false; public static bool PASTEBIN = false; public static bool UACBYPASS = false; public static bool MAKEPROCESSCRITICAL = false; // if true it will attempt to make the process crititcal (needs admin fr) // needed for hvnc (why?) why not use the desktop pointer directly? public static IntPtr OriginalDesktopPointer = IntPtr.Zero; public static bool Initialize() { SetupPaths(); return true; } #else public static string VERSION = ""; public static string HOSTS = ""; public static int RECONNECTDELAY = 5000; public static Environment.SpecialFolder SPECIALFOLDER = Environment.SpecialFolder.ApplicationData; public static string DIRECTORY = Environment.GetFolderPath(SPECIALFOLDER); public static string SUBDIRECTORY = ""; public static string INSTALLNAME = ""; public static bool INSTALL = false; public static bool STARTUP = false; public static string MUTEX = ""; public static string STARTUPKEY = ""; public static bool HIDEFILE = false; public static bool ENABLELOGGER = false; public static string ENCRYPTIONKEY = ""; public static string TAG = ""; public static string LOGDIRECTORYNAME = ""; public static string SERVERSIGNATURE = ""; public static string SERVERCERTIFICATESTR = ""; public static X509Certificate2 SERVERCERTIFICATE; public static bool HIDELOGDIRECTORY = false; public static bool HIDEINSTALLSUBDIRECTORY = false; public static string INSTALLPATH = ""; public static string LOGSPATH = ""; public static bool ANTIVM = false; public static bool ANTIDEBUG = false; public static bool PASTEBIN = false; public static bool UACBYPASS = false; public static bool MAKEPROCESSCRITICAL = false; // if true it will attempt to make the process crititcal (needs admin fr) // needed for hvnc public static IntPtr OriginalDesktopPointer = IntPtr.Zero; public static bool Initialize() { if (string.IsNullOrEmpty(VERSION)) return false; var aes = new Aes256(ENCRYPTIONKEY); TAG = aes.Decrypt(TAG); VERSION = aes.Decrypt(VERSION); HOSTS = aes.Decrypt(HOSTS); SUBDIRECTORY = aes.Decrypt(SUBDIRECTORY); INSTALLNAME = aes.Decrypt(INSTALLNAME); MUTEX = aes.Decrypt(MUTEX); STARTUPKEY = aes.Decrypt(STARTUPKEY); LOGDIRECTORYNAME = aes.Decrypt(LOGDIRECTORYNAME); SERVERSIGNATURE = aes.Decrypt(SERVERSIGNATURE); SERVERCERTIFICATE = new X509Certificate2(Convert.FromBase64String(aes.Decrypt(SERVERCERTIFICATESTR))); SetupPaths(); return VerifyHash(); } #endif public static string ReportedVersion => string.IsNullOrWhiteSpace(VersionOverride) ? VERSION : VersionOverride; static void SetupPaths() { LOGSPATH = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), LOGDIRECTORYNAME); INSTALLPATH = Path.Combine(DIRECTORY, (!string.IsNullOrEmpty(SUBDIRECTORY) ? SUBDIRECTORY + @"\" : "") + INSTALLNAME); } static bool VerifyHash() { try { using (var rsa = SERVERCERTIFICATE.GetRSAPublicKey()) { var hash = Sha256.ComputeHash(Encoding.UTF8.GetBytes(ENCRYPTIONKEY)); return rsa.VerifyHash(hash, Convert.FromBase64String(SERVERSIGNATURE), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); } } catch (Exception) { return false; } } } }