MeZon Team
ГлавнаяО насДокументацияКаталог статейСсылкиОбратная связь

Определение данных процессора.

Однажды перед нами встал вопрос о том, как защитить наши программы на 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 бита от других ядер номер.

 

Главная | Новости | О нас | Проекты | Документация | Каталог статей | Ссылки | Обратная связь
Каталог TUT.BY © 2002-2017 MeZon Team, Minsk, Republic of Belarus.
Meta Zone Web Engine v4.9
2017.08.19 06:44:45