diff --git a/Novetus/Novetus.Bootstrapper/NovetusLaunch.cs b/Novetus/Novetus.Bootstrapper/NovetusLaunch.cs index a243af9..433625d 100644 --- a/Novetus/Novetus.Bootstrapper/NovetusLaunch.cs +++ b/Novetus/Novetus.Bootstrapper/NovetusLaunch.cs @@ -1,8 +1,8 @@ -using NLog; +#region Usings +using NLog; using System; -using System.Collections.Generic; -using System.Linq; using System.Windows.Forms; +#endregion namespace Novetus.Bootstrapper { diff --git a/Novetus/NovetusCore/Imported/UHWIDEngine.cs b/Novetus/NovetusCore/Imported/UHWIDEngine.cs new file mode 100644 index 0000000..1821c7b --- /dev/null +++ b/Novetus/NovetusCore/Imported/UHWIDEngine.cs @@ -0,0 +1,179 @@ +#region Usings +using System; +using System.Management; +using System.Security.Cryptography; +using System.Text; +using System.IO; +using System.Runtime.InteropServices; +#endregion + +//https://github.com/davcs86/csharp-uhwid +//merged into one class +namespace UHWID +{ + #region UHWIDEngine + public static class UHWIDEngine + { + public static string SimpleUid { get; private set; } + + public static string AdvancedUid { get; private set; } + + static UHWIDEngine() + { + var volumeSerial = DiskId.GetDiskId(); + var cpuId = CpuId.GetCpuId(); + var windowsId = WindowsId.GetWindowsId(); + SimpleUid = volumeSerial + cpuId; + AdvancedUid = SimpleUid + windowsId; + } + } + #endregion + + #region DiskId + internal class DiskId + { + public static string GetDiskId() + { + return GetDiskId(""); + } + private static string GetDiskId(string diskLetter) + { + //Find first drive + if (string.IsNullOrEmpty(diskLetter)) + { + foreach (var compDrive in DriveInfo.GetDrives()) + { + if (compDrive.IsReady) + { + diskLetter = compDrive.RootDirectory.ToString(); + break; + } + } + } + if (!string.IsNullOrEmpty(diskLetter) && diskLetter.EndsWith(":\\")) + { + //C:\ -> C + diskLetter = diskLetter.Substring(0, diskLetter.Length - 2); + } + var disk = new ManagementObject(@"win32_logicaldisk.deviceid=""" + diskLetter + @":"""); + disk.Get(); + + var volumeSerial = disk["VolumeSerialNumber"].ToString(); + disk.Dispose(); + + return volumeSerial; + } + } + #endregion + + #region CpuId + internal static class CpuId + { + + [DllImport("user32", EntryPoint = "CallWindowProcW", CharSet = CharSet.Unicode, SetLastError = true, + ExactSpelling = true)] + private static extern IntPtr CallWindowProcW([In] byte[] bytes, IntPtr hWnd, int msg, [In, Out] byte[] wParam, + IntPtr lParam); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern bool VirtualProtect([In] byte[] bytes, IntPtr size, int newProtect, out int oldProtect); + + const int PAGE_EXECUTE_READWRITE = 0x40; + + public static string GetCpuId() + { + var sn = new byte[8]; + + return !ExecuteCode(ref sn) ? "ND" : string.Format("{0:X8}{1:X8}", BitConverter.ToUInt32(sn, 4), BitConverter.ToUInt32(sn, 0)); + } + + private static bool ExecuteCode(ref byte[] result) + { + /* The opcodes below implement a C function with the signature: + * __stdcall CpuIdWindowProc(hWnd, Msg, wParam, lParam); + * with wParam interpreted as an 8 byte unsigned character buffer. + * */ + + var isX64Process = IntPtr.Size == 8; + byte[] code; + + if (isX64Process) + { + code = new byte[] + { + 0x53, /* push rbx */ + 0x48, 0xc7, 0xc0, 0x01, 0x00, 0x00, 0x00, /* mov rax, 0x1 */ + 0x0f, 0xa2, /* cpuid */ + 0x41, 0x89, 0x00, /* mov [r8], eax */ + 0x41, 0x89, 0x50, 0x04, /* mov [r8+0x4], edx */ + 0x5b, /* pop rbx */ + 0xc3, /* ret */ + }; + } + else + { + code = new byte[] + { + 0x55, /* push ebp */ + 0x89, 0xe5, /* mov ebp, esp */ + 0x57, /* push edi */ + 0x8b, 0x7d, 0x10, /* mov edi, [ebp+0x10] */ + 0x6a, 0x01, /* push 0x1 */ + 0x58, /* pop eax */ + 0x53, /* push ebx */ + 0x0f, 0xa2, /* cpuid */ + 0x89, 0x07, /* mov [edi], eax */ + 0x89, 0x57, 0x04, /* mov [edi+0x4], edx */ + 0x5b, /* pop ebx */ + 0x5f, /* pop edi */ + 0x89, 0xec, /* mov esp, ebp */ + 0x5d, /* pop ebp */ + 0xc2, 0x10, 0x00, /* ret 0x10 */ + }; + } + + var ptr = new IntPtr(code.Length); + + if (!VirtualProtect(code, ptr, PAGE_EXECUTE_READWRITE, out _)) + Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); + + ptr = new IntPtr(result.Length); + return CallWindowProcW(code, IntPtr.Zero, 0, result, ptr) != IntPtr.Zero; + + } + } + #endregion + + #region WindowsId + internal class WindowsId + { + public static string GetWindowsId() + { + var windowsInfo = ""; + var managClass = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_OperatingSystem"); + + var managCollec = managClass.Get(); + + var is64Bits = !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432")); + + foreach (var o in managCollec) + { + var managObj = (ManagementObject)o; + windowsInfo = managObj.Properties["Caption"].Value + Environment.UserName + (string)managObj.Properties["Version"].Value; + break; + } + windowsInfo = windowsInfo.Replace(" ", ""); + windowsInfo = windowsInfo.Replace("Windows", ""); + windowsInfo = windowsInfo.Replace("windows", ""); + windowsInfo += (is64Bits) ? " 64bit" : " 32bit"; + + //md5 hash of the windows version + var md5Hasher = MD5.Create(); + var wi = md5Hasher.ComputeHash(Encoding.Default.GetBytes(windowsInfo)); + var wiHex = BitConverter.ToString(wi).Replace("-", ""); + return wiHex; + } + } + #endregion +} \ No newline at end of file diff --git a/Novetus/NovetusCore/NovetusCore.projitems b/Novetus/NovetusCore/NovetusCore.projitems index 9fa3d72..4deaccd 100644 --- a/Novetus/NovetusCore/NovetusCore.projitems +++ b/Novetus/NovetusCore/NovetusCore.projitems @@ -22,6 +22,7 @@ + diff --git a/Novetus/NovetusCore/StorageAndFunctions/GlobalFuncs.cs b/Novetus/NovetusCore/StorageAndFunctions/GlobalFuncs.cs index af3101f..25ce223 100644 --- a/Novetus/NovetusCore/StorageAndFunctions/GlobalFuncs.cs +++ b/Novetus/NovetusCore/StorageAndFunctions/GlobalFuncs.cs @@ -1280,27 +1280,8 @@ public class GlobalFuncs public static string GenerateAndReturnTripcode() { - //https://stackoverflow.com/questions/10546055/how-to-generate-a-system-pc-laptop-hardware-unique-id-in-c/50907399#50907399 - - ManagementObjectCollection mbsList = null; - ManagementObjectSearcher mbs = new ManagementObjectSearcher("Select * From Win32_processor"); - mbsList = mbs.Get(); - string id = ""; - foreach (ManagementObject mo in mbsList) - { - id = mo["ProcessorID"].ToString(); - } - - ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_BaseBoard"); - ManagementObjectCollection moc = mos.Get(); - string motherBoard = ""; - foreach (ManagementObject mo in moc) - { - motherBoard = (string)mo["SerialNumber"]; - } - - string uniqueSystemId = id + motherBoard; - return uniqueSystemId; + //Powered by https://github.com/davcs86/csharp-uhwid + return UHWID.UHWIDEngine.AdvancedUid; } public static GlobalVars.LauncherState GetStateForType(ScriptType type) diff --git a/Novetus/NovetusLauncher/Forms/LauncherForm/LauncherFormShared.cs b/Novetus/NovetusLauncher/Forms/LauncherForm/LauncherFormShared.cs index 023709e..c13e198 100644 --- a/Novetus/NovetusLauncher/Forms/LauncherForm/LauncherFormShared.cs +++ b/Novetus/NovetusLauncher/Forms/LauncherForm/LauncherFormShared.cs @@ -509,7 +509,6 @@ namespace NovetusLauncher if (gameType == ScriptType.Client && GlobalVars.LocalPlayMode && FormStyle != Settings.Style.Stylish) { GeneratePlayerID(); - GenerateTripcode(); } else { @@ -1021,12 +1020,6 @@ namespace NovetusLauncher PlayerIDTextBox.Text = Convert.ToString(GlobalVars.UserConfiguration.UserID); } - public void GenerateTripcode() - { - GlobalVars.UserConfiguration.PlayerTripcode = GlobalFuncs.GenerateAndReturnTripcode(); - PlayerTripcodeLabel.Text = GlobalVars.UserConfiguration.PlayerTripcode; - } - public async void InstallAddon() { AddonLoader addon = new AddonLoader(ConsoleBox);