function GetCpuId:longint;assembler;register; var temp:longint; begin asm PUSH EBX PUSH EDI MOV EDI,EAX MOV EAX,1 DW $A20F MOV TEMP,EDX POP EDI POP EBX end; result:=temp; end;
----------------------------------------------
//获得CPU信息的过程,用汇编代码写的 procedure GetCpuID; asm PUSH EAX MOV EAX, 1 DW $A20F //汇编指令CPUID的机器代码 MOV Stepping, AL AND Stepping, 0FH //取得CPU STEPPING数送入到变量Stepping中 AND AL, 0F0H SHR AL, 4 MOV Model, AL //取得CPU MODEL数送入到变量Model中 SHR AX, 8 AND AL, 0FH MOV Family, AL //取得CPU FAMILYG数送入到变量Family中 POP EAX end;
//RSA的加密和解密函数,等价于(m^e) mod n(即m的e次幂对n求余) function Encrypt_Decrypt(m: Int64; e: Int64=$2C86F9; n: Int64=$69AAA0E3): Int64; var a, b, c: Int64; begin a:=m; b:=e; c:=1; while b<>0 do if (b mod 2)=0 then begin b:=b div 2; a:=(a * a) mod n; end else begin b:=b - 1; c:=(a * c) mod n; end; Result:=c; end;
procedure TForm1.GetKeySpeedButtonClick(Sender: TObject); var ID, UserName, CpuVer: String; s: Array [1..4] of Cardinal; temp, Num1, Num2: Cardinal; Code1, Code2: Int64; i, ascii: Byte; Reg: TRegistry; begin if (Edit1.Text=') and (CheckBox1.Checked=False) then Application.MessageBox('请输入注册申请码!', '警告', MB_OK); if (Edit1.Text=') and (CheckBox1.Checked=True) then Application.MessageBox('请输入注册者姓名!', '警告', MB_OK); if (CheckBox1.Checked=true) and (Edit1.Text<>') then begin UserName:=Edit1.Text; //从Edit1.Text中取得用户名 GetCpuID; //调用过程GetCpuID CpuVer:='Level '+IntToStr(Family)+' Rev. '+IntToStr(Model)+'.'+IntToStr(Stepping); temp:=1; i:=1; while UserName[i]<>#0 do begin ascii:=ord(UserName[i]); //函数ord()的作用为取得字符的ASCII码 temp:=(temp*ascii+$D0878) mod $F4240; inc(i); end; i:=1; while CpuVer[i]<>#0 do begin ascii:=ord(CpuVer[i]); temp:=(temp*ascii+$2597D) mod $F4240; inc(i); end; ID:=IntToStr(temp); end; if (CheckBox1.Checked=false) and (Edit1.Text<>') then ID:=Edit1.Text; ID:=ID+'1234567'; SetLength(ID, 8); //把字符串ID长度变为8个,并把后面的字符截掉
//下面四行语句是把字符串'You are big pig.'的内存数据送到变量s中 s[1]:=$20756f59; s[2]:=$20657261; s[3]:=$20676962; s[4]:=$2e676970; Num1:=0; for i:=4 downto 2 do Num1:=(Num1+ord(ID[i])) shl 8; Num1:=Num1+ord(ID[1]); Num2:=0; for i:=8 downto 6 do Num2:=(Num2+ord(ID[i])) shl 8; Num2:=Num2+ord(ID[5]); temp:=0; for i:=1 to 32 do begin temp:=temp+$9E3779B9; Num1:=Num1+(Num2 shl 4)+(s[1] xor Num2)+((Num2 shr 5) xor temp)+s[2]; Num2:=Num2+(Num1 shl 4)+(s[3] xor Num1)+((Num1 shr 5) xor temp)+s[4]; end;
Code1:=(Num1 mod $40000000) + 2; Code2:=($93E0014 shl 2)+ Num1 div $40000000 + 2; Code1:=Encrypt_Decrypt(Code1); code2:=Encrypt_Decrypt(Code2); if (CheckBox1.Checked=False) and (Edit1.Text<>') then begin Edit2.Text:=IntToHex(Code1, 8); Edit3.Text:=IntToHex(Code2, 8); end; if (CheckBox1.Checked=True) and (Edit1.Text<>') then begin Reg:=TRegistry.Create; Reg.RootKey:=HKEY_LOCAL_MACHINE; if Reg.OpenKey('Software\Wom', True) then begin Reg.DeleteValue('Masters'); Reg.WriteString('Register', UserName); Reg.WriteString('Register_1', IntToHex(Code1, 8)); Reg.WriteString('Register_2', IntToHex(Code2, 8)); end; Reg.Free; Application.MessageBox('自动注册完成!', '信息', MB_OK); end; end;
procedure TForm1.CheckBox1Click(Sender: TObject); begin if CheckBox1.Checked=true then begin GetKeySpeedButton.Caption:='自动注册'; Label1.Caption:='注册者姓名'; Edit1.MaxLength:=0; Label2.Visible:=false; Label3.Visible:=false; Edit2.Visible:=false; Edit3.Visible:=false; end else begin GetKeySpeedButton.Caption:='取得注册码'; Label1.Caption:='注册申请码'; Edit1.MaxLength:=8; Label2.Visible:=true; Label3.Visible:=true; Edit2.Visible:=true; Edit3.Visible:=true; end; end;
拷一段获取网卡号的程序给你参考 function LanCardID: string; //获取网卡物理地址 var guid: TGUID; i: integer; begin result := '; CoCreateGUID(guid); for i := Low(guid.D4)+2 to High(guid.D4) do begin result := result + IntToHex(guid.D4[i],2); end; end;
TIDERegs = packed record bFeaturesReg : Byte; // Used for specifying SMART "commands". bSectorCountReg : Byte; // IDE sector count register bSectorNumberReg : Byte; // IDE sector number register bCylLowReg : Byte; // IDE low order cylinder value bCylHighReg : Byte; // IDE high order cylinder value bDriveHeadReg : Byte; // IDE drive/head register bCommandReg : Byte; // Actual IDE command. bReserved : Byte; // reserved. Must be zero. end; IDEREGS = TIDERegs; PIDERegs = ^TIDERegs;
TSendCmdInParams = packed record cBufferSize : DWORD; irDriveRegs : TIDERegs; bDriveNumber : Byte; bReserved : Array[0..2] of Byte; dwReserved : Array[0..3] of DWORD; bBuffer : Array[0..0] of Byte; end; SENDCMDINPARAMS = TSendCmdInParams; PSendCmdInParams = ^TSendCmdInParams;
var hdidform: Thdidform; function GetIdeDiskSerialNumber : String;
implementation
{$R *.DFM} procedure ChangeByteOrder( var Data; Size : Integer ); var ptr : PChar; i : Integer; c : Char; begin ptr := @Data; for i := 0 to (Size shr 1)-1 do begin c := ptr^; ptr^ := (ptr+1)^; (ptr+1)^ := c; Inc(ptr,2); end; end;
function GetIdeDiskSerialNumber : String;
var hDevice : THandle; cbBytesReturned : DWORD; pInData : PSendCmdInParams; pOutData : Pointer; // PSendCmdOutParams Buffer : Array[0..BufferSize-1] of Byte; srbControl : TSrbIoControl absolute Buffer; begin Result := '; FillChar(Buffer,BufferSize,#0); if Win32Platform=VER_PLATFORM_WIN32_NT then begin // Windows NT, Windows 2000 // Get SCSI port handle hDevice := CreateFile( '\\.\Scsi0:', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 ); if hDevice=INVALID_HANDLE_VALUE then Exit; try srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL); System.Move('SCSIDISK',srbControl.Signature,8); srbControl.Timeout := 2; srbControl.Length := DataSize; srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY; pInData := PSendCmdInParams(PChar(@Buffer) +SizeOf(SRB_IO_CONTROL)); pOutData := pInData; with pInData^ do begin cBufferSize := IDENTIFY_BUFFER_SIZE; bDriveNumber := 0; with irDriveRegs do begin bFeaturesReg := 0; bSectorCountReg := 1; bSectorNumberReg := 1; bCylLowReg := 0; bCylHighReg := 0; bDriveHeadReg := $A0; bCommandReg := IDE_ID_FUNCTION; end; end; if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT, @Buffer, BufferSize, @Buffer, BufferSize, cbBytesReturned, nil ) then Exit; finally CloseHandle(hDevice); end; end else begin // Windows 95 OSR2, Windows 98 hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 ); if hDevice=INVALID_HANDLE_VALUE then Exit; try pInData := PSendCmdInParams(@Buffer); pOutData := @pInData^.bBuffer; with pInData^ do begin cBufferSize := IDENTIFY_BUFFER_SIZE; bDriveNumber := 0; with irDriveRegs do begin bFeaturesReg := 0; bSectorCountReg := 1; bSectorNumberReg := 1; bCylLowReg := 0; bCylHighReg := 0; bDriveHeadReg := $A0; bCommandReg := IDE_ID_FUNCTION; end; end; if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA, pInData, SizeOf(TSendCmdInParams)-1, pOutData, W9xBufferSize, cbBytesReturned, nil ) then Exit; finally CloseHandle(hDevice); end; end; with PIdSector(PChar(pOutData)+16)^ do begin ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber)); SetString(Result,sSerialNumber,SizeOf(sSerialNumber)); end; end;
END.
//win98要 c:\windows\system\的smartvsd.vxd //copy to c:\windows\system\iosubsys //reboot your computer and ok //2000 and nt do not need 得到硬盘物理序号:
一个例子: (******************************************************************************* * * * BIOS Help - read ROM BIOS on Windows 95/98/SE/ME/NT/2K/XP * * * * Copyright (C) 2001, Nico Bendlin (nico@bendlin.de) * * * * Compiler: Delphi 4.03/5.01/6.00 * * Version: 1.03, 2001-09-02 * * * *******************************************************************************)
{ postum scriptum: sorry for the bad english, i wrote it in a hurry }
unit BiosHelp;
{$ALIGN ON} {$MINENUMSIZE 4}
interface
uses Windows;
type PRomBiosDump = ^TRomBiosDump; TRomBiosDump = array [$000F0000..$000FFFFF] of Byte;
type TReadRomBiosMethod = ( rrbmAutomatic, { Autodetect OS type and use proper method } rrbmGeneric, { Use 16-bit COM program to dump the BIOS } rrbmMemory, { Read from memory (Win9x) } rrbmPhysical { Read from physical memory object (WinNT) } );
function GetRomBiosBuffer(const Dump: TRomBiosDump; Address: Pointer; var Buffer; BufferSize: Cardinal): Cardinal; function GetRomBiosString(const Dump: TRomBiosDump; Address: Pointer): string; function GetRomBiosLongLong(const Dump: TRomBiosDump; Address: Pointer): LONGLONG; function GetRomBiosDWord(const Dump: TRomBiosDump; Address: Pointer): DWORD; function GetRomBiosWord(const Dump: TRomBiosDump; Address: Pointer): Word; function GetRomBiosByte(const Dump: TRomBiosDump; Address: Pointer): Byte;
implementation
{############################################################################### # # # GENERIC METHOD # # # # Create an temporary folder, save an 16bit COM program (RomDump.com) into it, # # execute program redirected to an file (Rom.dmp, RomDump.com simply dumps the # # memory range F000:0000-F000:FFFF to STDOUT), read dump file into the buffer, # # and finally cleanup all temporary files and directories. # # # # (the function RomDumpCode is x86 specific, which i wrote to generate 16-bit # # code with the help of the 23-bit Delphi compiler, never try to execute the # # pseudo-code in your program! it will not work in 32-bit protected mode) # # # ###############################################################################}
{ *INTERNAL* - Pseudo 16-bit code }
type PRomDumpCodeInfo = ^TRomDumpCodeInfo; TRomDumpCodeInfo = (rdciStart, rdciEnd, rdciSize);
function _RomDumpCode(Info: TRomDumpCodeInfo): Pointer; var CodeStart: Pointer; CodeEnd: Pointer; begin asm JMP @@End
{ *BEGIN* 16-bit code } { -- never use it in your program! -- } { COM which writes ROM-BIOS to StdOut } @@Start: { Dump F000:0000-F000:FFFE } XOR eDX, eDX // DS = 0xF000 ; Data segment MOV DH, 0F0h MOV DS, eDX XOR eDX, eDX // DX = 0x0000 ; Data offset XOR eCX, eCX // CX = 0xFFFF ; Data length DEC eCX XOR eBX, eBX // BX = 0x0001 ; STDOUT (file handle) INC eBX MOV AH, 40h // DosCall(0x40) ; INT21, DOS_WRITE_TO_HANDLE INT 21h JC @@Exit // On error exit ; AL = Error code { Dump F000:FFFF } XOR eDX, eDX // DS = 0xF000 ; Data segment MOV DH, 0F0h MOV DS, eDX XOR eDX, eDX // DX = 0xFFFF ; Data offset DEC eDX XOR eCX, eCX // CX = 0x0001 ; Data length INC eCX MOV eBX, eCX // BX = 0x0001 ; STDOUT (file handle) MOV AH, 40h // DosCall(0x40) ; INT21, DOS_WRITE_TO_HANDLE INT 21h JC @@Exit // On error exit ; AL = Error code MOV AL, 0 // no error ; AL = 0 @@Exit: MOV AH, 4Ch // DosCall(0x4C) ; INT21, DOS_TERMINATE_EXE INT 21h @@End: { *END* 16-bit code }
MOV CodeStart, OFFSET @@Start MOV CodeEnd, OFFSET @@End end; case Info of rdciStart: Result := CodeStart; rdciEnd: Result := CodeEnd; rdciSize: Result := Pointer(Cardinal(CodeEnd) - Cardinal(CodeStart)); else Result := nil; end; end;
{ *INTERNAL* - Save 16-bit code to file }
function _RomDumpCodeToFile(const Filename: string): Boolean; var ComFile: THandle; Size: Cardinal; begin Result := False; ComFile := CreateFile(PChar(Filename), GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if ComFile <> INVALID_HANDLE_VALUE then try Result := WriteFile(ComFile, _RomDumpCode(rdciStart)^, Cardinal(_RomDumpCode(rdciSize)), Size, nil) and (Size = Cardinal(_RomDumpCode(rdciSize))); if not Result then DeleteFile(PChar(Filename)); finally CloseHandle(ComFile); end; end;
{ *INTERNAL* - Execute 16-bit code redirected to file }
function _RomDumpCodeExecute(const Com, Dmp: string; Timeout: DWORD): Boolean; var ComSpec: string; si: TStartupInfo; pi: TProcessInformation; begin Result := False; SetLength(ComSpec, MAX_PATH); SetLength(ComSpec, GetEnvironmentVariable('ComSpec', PChar(@ComSpec[1]), MAX_PATH)); if Length(ComSpec) > 0 then begin FillChar(si, SizeOf(TStartupInfo), 0); si.cb := SizeOf(TStartupInfo); si.dwFlags := STARTF_USESHOWWINDOW; si.wShowWindow := SW_HIDE; if CreateProcess(nil, PChar(ComSpec + ' /C ' + Com + ' > ' + Dmp), nil, nil, False, CREATE_NEW_CONSOLE or CREATE_NEW_PROCESS_GROUP, nil, nil, si, pi) then try Result := WaitForSingleObject(pi.hProcess, Timeout) <> WAIT_TIMEOUT; finally CloseHandle(pi.hProcess); CloseHandle(pi.hThread); end; end; end;
function DirectoryExists(const Dir: string): Boolean; var Attr: DWORD; begin Attr := GetFileAttributes(PChar(Dir)); Result := (Attr <> $FFFFFFFF) and (Attr and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY); end;
{ Get BIOS dump the generic way }
function ReadRomBios16(var Buffer: TRomBiosDump; Timeout: DWORD): Boolean; const TempSub = '~RomDmp'; ComName = 'RomDump.com'; DmpName = 'Rom.dmp'; var TempPath: string; TempDir: string; TempIdx: Integer; TempIdxStr: string; ComFile: string; DmpFile: string; DmpHandle: THandle; Written: DWORD; begin Result := False; SetLength(TempPath, MAX_PATH); SetLength(TempPath, GetTempPath(MAX_PATH, PChar(@TempPath[1]))); if Length(TempPath) > 0 then begin if (TempPath[Length(TempPath)] <> '\') then TempPath := TempPath + '\'; TempIdx := 0; repeat Inc(TempIdx); Str(TempIdx, TempIdxStr); TempDir := TempPath + TempSub + TempIdxStr; until not DirectoryExists(TempDir); if CreateDirectory(PChar(TempDir), nil) then try TempDir := TempDir + '\'; ComFile := TempDir + ComName; DmpFile := TempDir + DmpName; if _RomDumpCodeToFile(ComFile) then try if _RomDumpCodeExecute(ComFile, DmpFile, Timeout) then begin DmpHandle := CreateFile(PChar(DmpFile), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); if DmpHandle <> INVALID_HANDLE_VALUE then try FillChar(Buffer, SizeOf(TRomBiosDump), 0); Result := ReadFile(DmpHandle, Buffer, SizeOf(TRomBiosDump), Written, nil) and (Written = SizeOf(TRomBiosDump)); finally CloseHandle(DmpHandle); end; end; finally DeleteFile(PChar(DmpFile)); DeleteFile(PChar(ComFile)); end; finally RemoveDirectory(PChar(TempDir)); end; end; end;
{############################################################################### # # # DIRECT METHOD (Win9x) # # # # Due to the fact that Windows 95/98/ME maps the BIOS into every Win32 process # # for read access it is very simple to fill the buffer from memory. # # # ###############################################################################}
function ReadRomBios9x(var Buffer: TRomBiosDump): Boolean; begin Result := False; try FillChar(Buffer, SizeOf(TRomBiosDump), 0); Move(Pointer(Low(TRomBiosDump))^, Buffer, SizeOf(TRomBiosDump)); Result := True; except // ignore exceptions end end;
{############################################################################### # # # PHYSICAL MEMORY METHOD (WinNT) # # # # On Windows NT the ROM BIOS is only available through the named kernel object # # '\Device\PhysicalMemory'. Because it is impossible to open kernel objects in # # user mode with standard Win32 API functions we make use of NT's nativeAPI in # # NtDll.dll ("NT-Layer") namely ZwOpenSection. # # # # (note: mostly there are two versions of every function ZwXxx and NtXxx. The #
# only difference in kernel mode is that the NtXxx version works in conside- # # ration to security while ZwXxx not. But in user mode both work like NtXxx.) # # # # At first the section is opened with ZwOpenSection. Normally we would proceed # # ZwMapViewOfSection, ZwUnmapViewOfSection, and NtClose. But the functions are # # more complex and there is no needing for it. With the handle (because we are # # in the "very simple" user mode =) we now use MapViewOfFile, UnmapViewOfFile, # # and CloseHandle to map an memory window (the ROM BIOS) into our process. # # # # Due to the fact that ZwOpenSection returns NT error-codes in case of failure # # we have to translate it to an Win32 error-code (RtlNtStatusToDosError). # # All NT specific functions are dynamically loaded -- because the applications # # should start on Win9x systems =) # # # ###############################################################################}
{ For more information see Windows 2000/XP DDK } { It works on Windows NT 4.0 too, use NtDll.dll }
var ZwOpenSection: TFNZwOpenSection; RtlNtStatusToDosError: TFNRtlNtStatusToDosError;
function ReadRomBiosNt(var Buffer: TRomBiosDump; Timeout: DWORD): Boolean; var NtLayer: HMODULE; Status: NTSTATUS; Section: THandle; View: Pointer; begin Result := False; NtLayer := GetModuleHandle(ntdll); if NtLayer = 0 then SetLastError(ERROR_CALL_NOT_IMPLEMENTED) else begin if not Assigned(ZwOpenSection) then ZwOpenSection := GetProcAddress(NtLayer, 'ZwOpenSection'); if not Assigned(RtlNtStatusToDosError) then RtlNtStatusToDosError := GetProcAddress(NtLayer, 'RtlNtStatusToDosError'); if not (Assigned(ZwOpenSection) and Assigned(RtlNtStatusToDosError)) then SetLastError(ERROR_CALL_NOT_IMPLEMENTED) else begin Status := ZwOpenSection(Section, ObjectPhysicalMemoryAccessMask, @ObjectPhysicalMemoryAttributes); case Status of STATUS_SUCCESS: try View := MapViewOfFile(Section, ObjectPhysicalMemoryAccessMask, 0, Low(TRomBiosDump), SizeOf(TRomBiosDump)); if Assigned(View) then try FillChar(Buffer, SizeOf(TRomBiosDump), 0); Move(View^, Buffer, SizeOf(TRomBiosDump)); Result := True; finally UnmapViewOfFile(View); end; finally CloseHandle(Section); end; STATUS_ACCESS_DENIED: Result := ReadRomBios16(Buffer, Timeout); else SetLastError(RtlNtStatusToDosError(Status)) end; end; end; end; {############################################################################### # # # ReadRomBios # # # ###############################################################################}
function ReadRomBios(var Dump: TRomBiosDump; Method: TReadRomBiosMethod; Timeout: DWORD = INFINITE): Boolean; begin Result := False; case Method of rrbmAutomatic: if (Integer(GetVersion) < 0) then try Result := ReadRomBios9x(Dump); except Result := ReadRomBios16(Dump, Timeout); end else Result := ReadRomBiosNt(Dump, Timeout); rrbmGeneric: Result := ReadRomBios16(Dump, Timeout); rrbmMemory: Result := ReadRomBios9x(Dump); rrbmPhysical: Result := ReadRomBiosNt(Dump, Timeout); else SetLastError(ERROR_INVALID_PARAMETER); end; end;
{############################################################################### # # # Utilities to simplify the access to data as generic standard types # # # ###############################################################################}
function GetRomBiosBuffer(const Dump: TRomBiosDump; Address: Pointer; var Buffer; BufferSize: Cardinal): Cardinal; begin Result := 0; if (Cardinal(Address) >= Low(TRomBiosDump)) and (Cardinal(Address) <= High(TRomBiosDump)) then begin Result := BufferSize; if (Cardinal(Address) + BufferSize > High(TRomBiosDump)) then Result := High(TRomBiosDump) - Cardinal(Address) + 1; Move(Dump[Cardinal(Address)], Buffer, Result); end; end;
谢谢bios, 但是我那个GetIdeDiskSerialNumber 函数我下载测试过,在Win200 SERVER 和WINXP下得到的是空百,其他系统都没有问题. 能告诉我原因吗 ?
----------------------------------------------
I just loving Delphi
– Vi gör rundvandring i fabriken och tittar på säkerhet,resor Japan arbetsmiljö och arbetsförhållanden i stort.resor PeruVileverantörer. resor KinaKan vi hjälpa dem att leder detta också till en lägre produktionskostnad.resor Vietnam från design, inköp, logistik och produktion. Alla avdelningar kan bidra på något sätt. En framtagen hållbarhetsstrategi integreras nu i hela företaget och den ska in som en arbetet utåt.Övertid är ett problem som vi ofta stöter på.Kina resor också. Japan ResorDet är inte såFlyg Beijing Plaggen är exempel ur en ny kollektion,Peru Resor som Flyg Shanghaiär ett svillkor,Flyg Hongkong me
----------------------------------------------
-