[转载]计算机起码需要的方法
//生成机器码所需要的方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Management; using System.Runtime.InteropServices; namespace ConsoleAppTest { class WMI { public static string Disk = "Win32_DiskDrive"; public static string BIOS = "Win32_BIOS"; public static string Network = "Win32_NetworkAdapter"; public static string Board = "Win32_BaseBoard"; public static string CPU = "Win32_Processor"; public static string Memory = "Win32_MemoryDevice"; public static string PhysicalMedia = "Win32_PhysicalMedia"; public static string LogicalDisk = "Win32_LogicalDisk"; public static string BoardDevice = "Win32_OnBoardDevice"; public static string PhysicalMemory = "Win32_PhysicalMemory"; public static string id() { string str = AtapiDevice.GetHddInfo(0).SerialNumber; str += PropertyValue(Disk, "Caption") + "\r\n"; str += PropertyValue(BIOS, "ReleaseDate") + PropertyValue(BIOS, "SerialNumber") + PropertyValue(BIOS, "Manufacturer") + PropertyValue(BIOS, "SMBIOSBIOSVersion") + PropertyValue(BIOS, "SMBIOSMajorVersion") + PropertyValue(BIOS, "SMBIOSMinorVersio") + "\r\n"; str += PropertyValue(Network, "MACAddress") + "\r\n"; str += PropertyValue(Board, "Manufacturer") + PropertyValue(Board, "SerialNumber") + PropertyValue(Board, "Product") + PropertyValue(Board, "Version") + "\r\n"; str += PropertyValue(CPU, "ProcessorId") + PropertyValue(CPU, "Version") + "\r\n"; str += PropertyValue(LogicalDisk, "VolumeSerialNumber"); return str; } public static string AllKnownValues() { string str = null; Type t = typeof(WMI); System.Reflection.FieldInfo[] fs = t.GetFields(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public); foreach (System.Reflection.FieldInfo f in fs) { str += PropertyValues((string)f.GetValue(null)); } return str; } public static string PropertyValues(string typeName) { ManagementObjectSearcher s = new ManagementObjectSearcher( "root\\CIMV2", "SELECT * FROM " + typeName, new EnumerationOptions( null, System.TimeSpan.MaxValue, 1, true, true, true, true, false, true, true)); ManagementClass m = new ManagementClass(new ManagementPath(typeName)); string data = "-------------------------------" + typeName + "--------------------------------\r\n"; foreach (ManagementObject o in s.Get()) { foreach (PropertyData p in o.Properties) { try { data += p.Name + "=" + getArrayValues(o, p.Name) + "\r\n"; } catch { } } } return data; } private static string getArrayValues(ManagementObject m, string PropertyName) { string tmp = ""; try { object oo = m.GetPropertyValue(PropertyName); if (oo == null) return tmp; if (oo is Array) { foreach (object ooo in (Array)oo) { if (tmp == null) tmp = ooo.ToString(); else tmp += " -- " + ooo.ToString(); } } else tmp = oo.ToString(); } catch (Exception e) { tmp = ""; } if (tmp == null) tmp = ""; return tmp; } public static string PropertyValue(string typeName, string PropertyName) { ManagementClass m = new ManagementClass(new ManagementPath(typeName)); string data = null; foreach (ManagementObject o in m.GetInstances()) { try { object ob = getArrayValues(o, PropertyName); if (ob == null || ob.ToString().Trim() == "") continue; if (data == null) data = ob.ToString(); else data += "\t" + ob.ToString(); } catch { } } return data; } [Serializable] public struct HardDiskInfo { /// <summary> /// 型号 /// </summary> public string ModuleNumber; /// <summary> /// 固件版本 /// </summary> public string Firmware; /// <summary> /// 序列号 /// </summary> public string SerialNumber; /// <summary> /// 容量,以M为单位 /// </summary> public uint Capacity; } #region Internal Structs [StructLayout(LayoutKind.Sequential, Pack = 1)] internal struct GetVersionOutParams { public byte bVersion; public byte bRevision; public byte bReserved; public byte bIDEDeviceMap; public uint fCapabilities; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public uint[] dwReserved; // For future use. } [StructLayout(LayoutKind.Sequential, Pack = 1)] internal struct IdeRegs { public byte bFeaturesReg; public byte bSectorCountReg; public byte bSectorNumberReg; public byte bCylLowReg; public byte bCylHighReg; public byte bDriveHeadReg; public byte bCommandReg; public byte bReserved; } [StructLayout(LayoutKind.Sequential, Pack = 1)] internal struct SendCmdInParams { public uint cBufferSize; public IdeRegs irDriveRegs; public byte bDriveNumber; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] bReserved; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public uint[] dwReserved; public byte bBuffer; } [StructLayout(LayoutKind.Sequential, Pack = 1)] internal struct DriverStatus { public byte bDriverError; public byte bIDEStatus; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] bReserved; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public uint[] dwReserved; } [StructLayout(LayoutKind.Sequential, Pack = 1)] internal struct SendCmdOutParams { public uint cBufferSize; public DriverStatus DriverStatus; public IdSector bBuffer; } [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 512)] internal struct IdSector { public ushort wGenConfig; public ushort wNumCyls; public ushort wReserved; public ushort wNumHeads; public ushort wBytesPerTrack; public ushort wBytesPerSector; public ushort wSectorsPerTrack; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public ushort[] wVendorUnique; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public byte[] sSerialNumber; public ushort wBufferType; public ushort wBufferSize; public ushort wECCSize; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] sFirmwareRev; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)] public byte[] sModelNumber; public ushort wMoreVendorUnique; public ushort wDoubleWordIO; public ushort wCapabilities; public ushort wReserved1; public ushort wPIOTiming; public ushort wDMATiming; public ushort wBS; public ushort wNumCurrentCyls; public ushort wNumCurrentHeads; public ushort wNumCurrentSectorsPerTrack; public uint ulCurrentSectorCapacity; public ushort wMultSectorStuff; public uint ulTotalAddressableSectors; public ushort wSingleWordDMA; public ushort wMultiWordDMA; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] bReserved; } #endregion /// <summary> /// ATAPI驱动器相关 /// </summary> public class AtapiDevice { #region DllImport [DllImport("kernel32.dll", SetLastError = true)] static extern int CloseHandle(IntPtr hObject); [DllImport("kernel32.dll", SetLastError = true)] static extern IntPtr CreateFile( string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile); [DllImport("kernel32.dll")] static extern int DeviceIoControl( IntPtr hDevice, uint dwIoControlCode, IntPtr lpInBuffer, uint nInBufferSize, ref GetVersionOutParams lpOutBuffer, uint nOutBufferSize, ref uint lpBytesReturned, [Out] IntPtr lpOverlapped); [DllImport("kernel32.dll")] static extern int DeviceIoControl( IntPtr hDevice, uint dwIoControlCode, ref SendCmdInParams lpInBuffer, uint nInBufferSize, ref SendCmdOutParams lpOutBuffer, uint nOutBufferSize, ref uint lpBytesReturned, [Out] IntPtr lpOverlapped); const uint DFP_GET_VERSION = 0x00074080; const uint DFP_SEND_DRIVE_COMMAND = 0x0007c084; const uint DFP_RECEIVE_DRIVE_DATA = 0x0007c088; const uint GENERIC_READ = 0x80000000; const uint GENERIC_WRITE = 0x40000000; const uint FILE_SHARE_READ = 0x00000001; const uint FILE_SHARE_WRITE = 0x00000002; const uint CREATE_NEW = 1; const uint OPEN_EXISTING = 3; #endregion #region GetHddInfo /// <summary> /// 获得硬盘信息 /// </summary> /// <param name="driveIndex">硬盘序号</param> /// <returns>硬盘信息</returns> /// <remarks> /// 参考lu0的文章:http://lu0s1.3322.org/App/2k1103.html /// by sunmast for everyone /// thanks lu0 for his great works /// 在Windows 98/ME中,S.M.A.R.T并不缺省安装,请将SMARTVSD.VXD拷贝到%SYSTEM%\IOSUBSYS目录下。 /// 在Windows 2000/2003下,需要Administrators组的权限。 /// </remarks> /// <example> /// AtapiDevice.GetHddInfo() /// </example> public static HardDiskInfo GetHddInfo(byte driveIndex) { switch (Environment.OSVersion.Platform) { case PlatformID.Win32Windows: return GetHddInfo9x(driveIndex); case PlatformID.Win32NT: return GetHddInfoNT(driveIndex); case PlatformID.Win32S: throw new NotSupportedException("Win32s is not supported."); case PlatformID.WinCE: throw new NotSupportedException("WinCE is not supported."); default: throw new NotSupportedException("Unknown Platform."); } } #region GetHddInfo9x private static HardDiskInfo GetHddInfo9x(byte driveIndex) { GetVersionOutParams vers = new GetVersionOutParams(); SendCmdInParams inParam = new SendCmdInParams(); SendCmdOutParams outParam = new SendCmdOutParams(); uint bytesReturned = 0; IntPtr hDevice = CreateFile( @"\\.\Smartvsd", 0, 0, IntPtr.Zero, CREATE_NEW, 0, IntPtr.Zero); if (hDevice == IntPtr.Zero) { throw new Exception("Open smartvsd.vxd failed."); } if (0 == DeviceIoControl( hDevice, DFP_GET_VERSION, IntPtr.Zero, 0, ref vers, (uint)Marshal.SizeOf(vers), ref bytesReturned, IntPtr.Zero)) { CloseHandle(hDevice); throw new Exception("DeviceIoControl failed:DFP_GET_VERSION"); } // If IDE identify command not supported, fails if (0 == (vers.fCapabilities & 1)) { CloseHandle(hDevice); throw new Exception("Error: IDE identify command not supported."); } if (0 != (driveIndex & 1)) { inParam.irDriveRegs.bDriveHeadReg = 0xb0; } else { inParam.irDriveRegs.bDriveHeadReg = 0xa0; } if (0 != (vers.fCapabilities & (16 >> driveIndex))) { // We don't detect a ATAPI device. CloseHandle(hDevice); throw new Exception(string.Format("Drive {0} is a ATAPI device, we don't detect it", driveIndex + 1)); } else { inParam.irDriveRegs.bCommandReg = 0xec; } inParam.bDriveNumber = driveIndex; inParam.irDriveRegs.bSectorCountReg = 1; inParam.irDriveRegs.bSectorNumberReg = 1; inParam.cBufferSize = 512; if (0 == DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA, ref inParam, (uint)Marshal.SizeOf(inParam), ref outParam, (uint)Marshal.SizeOf(outParam), ref bytesReturned, IntPtr.Zero)) { CloseHandle(hDevice); throw new Exception("DeviceIoControl failed: DFP_RECEIVE_DRIVE_DATA"); } CloseHandle(hDevice); return GetHardDiskInfo(outParam.bBuffer); } #endregion #region GetHddInfoNT private static HardDiskInfo GetHddInfoNT(byte driveIndex) { GetVersionOutParams vers = new GetVersionOutParams(); SendCmdInParams inParam = new SendCmdInParams(); SendCmdOutParams outParam = new SendCmdOutParams(); uint bytesReturned = 0; // We start in NT/Win2000 IntPtr hDevice = CreateFile( string.Format(@"\\.\PhysicalDrive{0}", driveIndex), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero); if (hDevice == IntPtr.Zero) { throw new Exception("CreateFile faild."); } if (0 == DeviceIoControl( hDevice, DFP_GET_VERSION, IntPtr.Zero, 0, ref vers, (uint)Marshal.SizeOf(vers), ref bytesReturned, IntPtr.Zero)) { CloseHandle(hDevice); throw new Exception(string.Format("Drive {0} may not exists.", driveIndex + 1)); } // If IDE identify command not supported, fails if (0 == (vers.fCapabilities & 1)) { CloseHandle(hDevice); throw new Exception("Error: IDE identify command not supported."); } // Identify the IDE drives if (0 != (driveIndex & 1)) { inParam.irDriveRegs.bDriveHeadReg = 0xb0; } else { inParam.irDriveRegs.bDriveHeadReg = 0xa0; } if (0 != (vers.fCapabilities & (16 >> driveIndex))) { // We don't detect a ATAPI device. CloseHandle(hDevice); throw new Exception(string.Format("Drive {0} is a ATAPI device, we don't detect it.", driveIndex + 1)); } else { inParam.irDriveRegs.bCommandReg = 0xec; } inParam.bDriveNumber = driveIndex; inParam.irDriveRegs.bSectorCountReg = 1; inParam.irDriveRegs.bSectorNumberReg = 1; inParam.cBufferSize = 512; if (0 == DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA, ref inParam, (uint)Marshal.SizeOf(inParam), ref outParam, (uint)Marshal.SizeOf(outParam), ref bytesReturned, IntPtr.Zero)) { CloseHandle(hDevice); throw new Exception("DeviceIoControl failed: DFP_RECEIVE_DRIVE_DATA"); } CloseHandle(hDevice); return GetHardDiskInfo(outParam.bBuffer); } #endregion private static HardDiskInfo GetHardDiskInfo(IdSector phdinfo) { HardDiskInfo hddInfo = new HardDiskInfo(); ChangeByteOrder(phdinfo.sModelNumber); hddInfo.ModuleNumber = Encoding.ASCII.GetString(phdinfo.sModelNumber).Trim(); ChangeByteOrder(phdinfo.sFirmwareRev); hddInfo.Firmware = Encoding.ASCII.GetString(phdinfo.sFirmwareRev).Trim(); ChangeByteOrder(phdinfo.sSerialNumber); hddInfo.SerialNumber = Encoding.ASCII.GetString(phdinfo.sSerialNumber).Trim(); hddInfo.Capacity = phdinfo.ulTotalAddressableSectors / 2 / 1024; return hddInfo; } private static void ChangeByteOrder(byte[] charArray) { byte temp; for (int i = 0; i < charArray.Length; i += 2) { temp = charArray[i]; charArray[i] = charArray[i + 1]; charArray[i + 1] = temp; } } #endregion } } /* public class GenMachineKeyEx { public const string idKey = "{88E21C21-4C57-440e-8121-76C7E6D465E8}"; static string GenID { get { string id = WMI.id(); byte[] bs = CHATool.getMD5(id); if (bs.Length > 16) { Array.Resize(ref bs, 16); } id = HEXString.ToString(bs); bs = EM.SymmetricAlgorithmTool.EncryptData(bs, idKey); id = HEXString.ToString(bs); return id; } } public static string CreateMachineCode() { string id = GenMachineKeyEx.GenID; byte[] bs = EM.CHATool.getMD5(id); string str = HEXString.ToString(bs); return str; } } public class GenMachineKey { public const string idKey = "{88E21C21-4C57-440e-8121-76C7E6D465E8}"; public const string signKey = "0001000000ffffffff01000000000000000601000000084578706f6e656e740b0001000000ffffffff010000000000000004010000000c53797374656d2e496e74333201000000076d5f76616c75650008030000000b0001000000ffffffff01000000000000000f0100000003000000020100010b0001000000ffffffff01000000000000000601000000074d6f64756c75730b0001000000ffffffff010000000000000004010000000c53797374656d2e496e74333201000000076d5f76616c75650008800000000b0001000000ffffffff01000000000000000f010000008000000002b86deaaecd2fabcbd8d7f0e65eb0611c65cc0403e3a66b509186ea9a3549964c75b21037b4b89c289cc9143d68c881db5331bea3cc0f84e3de1ede90c05d49f412d9fe057430a5a46d121e6145fb7cf081fff1131f02f0c6cfe2b1c2336f210c0650763fad938b255f9c754f527b92de0e6d3309039cf3bdc3c428f1598e38830b0001000000ffffffff0100000000000000060100000001500b0001000000ffffffff010000000000000004010000000c53797374656d2e496e74333201000000076d5f76616c75650008400000000b0001000000ffffffff01000000000000000f010000004000000002eeccc2f61b8cac1501d66e3de857862d3b06dc3c44538e1dcd8feb316a08d80dd0e029547fe1a52026bf49a95a374d2a6a766385deafbdaf9e3419296580cddd0b0001000000ffffffff0100000000000000060100000001510b0001000000ffffffff010000000000000004010000000c53797374656d2e496e74333201000000076d5f76616c75650008400000000b0001000000ffffffff01000000000000000f010000004000000002c5b69dacd86b5b2857f2b0279ae317d4db22fdece7b6ee6a2b0945569331819d604f35a67bb85f334c8ab0ce8a70dee5ae031a5b65c9d576a3d34e49fb04a9df0b0001000000ffffffff010000000000000006010000000244500b0001000000ffffffff010000000000000004010000000c53797374656d2e496e74333201000000076d5f76616c75650008400000000b0001000000ffffffff01000000000000000f010000004000000002a8221556f098c0045e71dad6cdc2ea1ee883710721d86ea47f3a488f5727f8eee9551ae47ad1a5d098577086c39552487e02f319ab6bb33376411a42324c59250b0001000000ffffffff010000000000000006010000000244510b0001000000ffffffff010000000000000004010000000c53797374656d2e496e74333201000000076d5f76616c75650008400000000b0001000000ffffffff01000000000000000f0100000040000000025b2046202a47a0e64152ebf9f51b821a6b3dff87376d4b09c7f827eb3540761b110eb10da0ac63c4831cd14d00e5f0f62f73e2ac09883348d14d4d222ffe00450b0001000000ffffffff0100000000000000060100000008496e7665727365510b0001000000ffffffff010000000000000004010000000c53797374656d2e496e74333201000000076d5f76616c75650008400000000b0001000000ffffffff01000000000000000f0100000040000000023f45e1639ad2b861d3f02335f745d877709d6cc640043fe79edee9f89b4677f907705294666a2c5acede305dc361e1e8d8fc8322cf00d793ba43d2502a1cc5b00b0001000000ffffffff0100000000000000060100000001440b0001000000ffffffff010000000000000004010000000c53797374656d2e496e74333201000000076d5f76616c75650008800000000b0001000000ffffffff01000000000000000f0100000080000000027fecae060588f56ef5c002f6a7e34bd8b8bb646596384ee399adad78bd5187910d6a2f59945f20e202ae6efd917ad2a7e0f2f63b034618753e12c76a3c23f930c642e9f3f2e052ef482f306fdecc8d556f3316bdbbac9e65204b79f978b3ef3fb955b4a00f9af6eb1132bcc64505879f80e444598778f07ce69e98cfda373a110b0001000000ffffffff0100000000000000060100000003656e640b"; static string FileName = Path.GetDirectoryName(Application.ExecutablePath) + "\\licence.x"; static string GenID { get { string id = WMI.id(); byte[] bs = CHATool.getMD5(id); if (bs.Length > 16) { Array.Resize(ref bs, 16); } id = HEXString.ToString(bs); bs = EM.SymmetricAlgorithmTool.EncryptData(bs, idKey); id = HEXString.ToString(bs); return id; } } public static string CreateMachineCode() { string id = GenMachineKey.GenID; byte[] bs = EM.CHATool.getMD5(id); string str = HEXString.ToString(bs); return str; } public static void CreateMachineCodenFile(string id, string FileName) { byte[] bs = EM.CHATool.getMD5(id); string str = HEXString.ToString(bs); XMLDataClass.XMLDataObject pxml = new XMLDataClass.XMLDataObject(); pxml.SetValue("/root/authorization", str); pxml.Save(FileName); } public static void abort(string sign) { System.Threading.Thread.BeginCriticalRegion(); try { RSATool rsa = new RSATool(); rsa.PrivateKey = RSATool.StringToKey(signKey); byte[] bs = rsa.Decrypt(HEXString.ToBytes(sign)); sign = HEXString.ToString(bs); string sign1 = CreateMachineCode(); int x = 1 / string.Compare(sign1, sign); } catch { System.Threading.Thread.EndCriticalRegion(); return; } throw new Exception("这不是你的错!"); } public static void abort() { System.Threading.Thread.BeginCriticalRegion(); if (!File.Exists(FileName)) throw new Exception(); System.Threading.Thread.EndCriticalRegion(); XMLDataClass.XMLDataObject xml = XMLDataClass.XMLDataObject.Load(FileName); string sign = xml.GetValue("/root/authorization"); abort(sign); } public static bool check() { if (!File.Exists(FileName)) return false; XMLDataClass.XMLDataObject xml = XMLDataClass.XMLDataObject.Load(FileName); string credit = xml.GetValue("/root/authorization"); return check(credit); } public static bool checkTest(string sign) { if (!File.Exists(FileName)) return false; XMLDataClass.XMLDataObject xml = XMLDataClass.XMLDataObject.Load(FileName); string credit = xml.GetValue("/root/authorization"); return check(credit, sign); } public static bool check(string sign) { RSATool rsa = new RSATool(); rsa.PrivateKey = RSATool.StringToKey(signKey); byte[] bs = rsa.Decrypt(HEXString.ToBytes(sign)); sign = HEXString.ToString(bs); return check(sign, CreateMachineCode()); } public static bool check(string sign, string machineCode) { RSATool rsa = new RSATool(); rsa.PrivateKey = RSATool.StringToKey(signKey); byte[] bs = rsa.Decrypt(HEXString.ToBytes(sign)); sign = HEXString.ToString(bs); return (string.Compare(machineCode, sign) == 0); } static void threadExceptionEventHandler(object sender, ThreadExceptionEventArgs e) { Exception ee = (Exception)e.Exception; if (ee.Message == "这不是你的错!") { System.Diagnostics.Process.GetCurrentProcess().Kill(); } } static void unhandledExceptionEventHandler(object sender, UnhandledExceptionEventArgs e) { Exception ee = (Exception)e.ExceptionObject; if (ee.Message == "这不是你的错!") { System.Diagnostics.Process.GetCurrentProcess().Kill(); } } public static void go() { string str = ""; } static void ThreadProc() { Random r = new Random(60 * 1000); System.Threading.Thread.Sleep(r.Next(3 * 60 * 1000)); abort(); } static GenMachineKey() { System.Threading.Thread thread = new Thread(new ThreadStart(ThreadProc)); thread.IsBackground = true; thread.Start(); try { Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException); } catch { } Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(threadExceptionEventHandler); AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(unhandledExceptionEventHandler); } */ }
浙公网安备 33010602011771号