Определение данных процессора.
Однажды перед нами встал вопрос о том, как защитить наши программы на Delphi от незаконного распространения и выполнения их на других компьютерах. Был произведен поиск в интернете и найдены интересные, недокументированные команды. Они позволяют запросить данные текущего (на котором выполняется фрагмент программы) ядра процессора. На основании этих команд был сформирован модуль:
unit MCPU;
interface
type
TCPUIDArray=array[1..4] of Longint;
MyCPUInfo=record
cpuar:TCPUIDArray;
vnd:string;
end;
function GetCurCPUInfo:MyCPUInfo;
function CmpCPUInfo(ci,ca:MyCPUInfo):Boolean;
implementation
const
ID_BIT=$200000;
type
TVendor=array [0..11] of char;
function IsCPUID_Available : Boolean;assembler;register;
asm
PUSHFD
POP EAX
MOV EDX,EAX
XOR EAX,ID_BIT
PUSH EAX
POPFD
PUSHFD
POP EAX
XOR EAX,EDX
JZ @exit
MOV AL,True
@exit:
end;
function GetCPUID : TCPUIDARRAY; assembler;register;
asm
PUSH EBX
PUSH EDI
MOV EDI,EAX
MOV EAX,1
DW $A20F
STOSD
MOV EAX,EBX
STOSD
MOV EAX,ECX
STOSD
MOV EAX,EDX
STOSD
POP EDI
POP EBX
end;
function GetCPUVendor : TVendor; assembler;register;
asm
PUSH EBX
PUSH EDI
MOV EDI,EAX
MOV EAX,0
DW $A20F
MOV EAX,EBX
XCHG EBX,ECX
MOV ECX,4
@1:
STOSB
SHR EAX,8
LOOP @1
MOV EAX,EDX
MOV ECX,4
@2:
STOSB
SHR EAX,8
LOOP @2
MOV EAX,EBX
MOV ECX,4
@3:
STOSB
SHR EAX,8
LOOP @3
POP EDI
POP EBX
end;
function GetCurCPUInfo:MyCPUInfo;
var
ca:TCPUIDArray;
i:integer;
begin
if not IsCPUID_Available then Halt;
ca:=GetCPUID;
for i:=1 to 4 do Result.cpuar:=ca;
Result.vnd:=string(GetCPUVendor);
end;
function CmpCPUInfo(ci,ca:MyCPUInfo):Boolean;
var
i:integer;
begin
Result:=true;
for i:=1 to 4 do
if ci.cpuar[i]<>ca.cpuar[i] then Result:=False;
if ci.vnd<>ca.vnd then Result:=False;
end;
end.
В основной программе я подключал этот модуль и проводил проверку:
const MyCPU: MyCPUInfo=(cpuar:($00000671,$00000000,$00000000,$0383FBFF);vnd:'AuthenticAMD'); var MyCPUCurInfo:MyCPUInfo; begin … MyCPUCurInfo:=GetCurCPUInfo; if CmpCPUInfo(MyCPUCurInfo,MyCPU) … … end.
Замечание. Если у вас используется многоядерный процессор, учтите, что каждое ядро имеет свой отличный на 1-2 бита от других ядер номер.
