⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 endescrypt.~dpr

📁 加密和解密的算法
💻 ~DPR
字号:
library EnDescrypt;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  //ShareMem,
  SysUtils,
  Windows,
  Dialogs,
  Classes;

{$R *.res}
type
  TEnDeScrypt=Class
  private

  protected

  public
    //构造方法
    constructor Create;
    //析构方法
    destructor Destroy;override;
    function EnScrypt():string;virtual;
    function DeScrypt(DeData:string):string;virtual;
  end;
  //硬盘序列号加密
  TEnDeScryptHardDisk=Class(TEnDeScrypt)
  private
    function GetHardDiskSeriID():pchar;
  protected

  public
    function EnScrypt():string;override;
    function DeScrypt(DeData:string):string;override;
  end;
  //CPU序列号加密
  TEnDeScryptCPU=Class(TEnDeScrypt)
  private
    function GetCPUSeriID():pchar;
  protected

  public
    function EnScrypt():string;override;
    function DeScrypt(DeData:string):string;override;
  end;

var
  EnDeScryptHardDisk:TEnDeScryptHardDisk;
  EnDeScryptCPU:TEnDeScryptCPU;

//字符串加密函数的实现
function DataEncode(const s:string):Widestring;stdcall;export;
var
  i,c1,c2,c3:Integer;
  m,n:Integer;
const
   Data:string='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
begin
   Result:='';
   m:=1;
   n:=0;
   for i := 1 to (Length(s) div 3) do
   begin
      c1 := Ord(s[m]);
      c2 := Ord(s[m+1]);
      c3 := Ord(s[m+2]);
      m:=m+3;
      Result := Result+Data[(c1 shr 2)and $3F+1];
      Result := Result+Data[((c1 shl 4)and $30) or ((c2 shr 4)and $0F)+1];
      Result := Result+Data[((c2 shl 2)and $3C) or ((c3 shr 6)and $03)+1];
      Result := Result+Data[c3 and $3F+1];
      n:=n+4;
      if(n = 76)then
      begin
         n:=0;
         Result := Result+#13#10;
      end;
    end;
    if (Length(s) mod 3)=1 then
    begin
      c1 := Ord(s[m]);
      Result := Result+Data[(c1 shr 2)and $3F+1];
      Result := Result+Data[(c1 shl 4)and $30+1];
      Result := Result+'=';
      Result := Result+'=';
   end;
   if (Length(s) mod 3)=2 then
   begin
      c1 := Ord(s[m]);
      c2 := Ord(s[m+1]);
      Result := Result+ Data[(c1 shr 2)and $3F+1];
      Result := Result+ Data[((c1 shl 4)and $30) or ((c2 shr 4)and $0F)+1];
      Result := Result+Data[(c2 shl 2)and $3C+1];
      Result := Result+ '=';
   end;
end;

//字符串解密函数的实现
function DataDecode(const s:string):Widestring;stdcall;export;
var
 i,m,n:Integer;
 c1,c2,c3,c4:Integer;
const
   Data:string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
begin
   Result := '';
   n:=1;
   m:=Length(s);
   if s[m]='='then m:=m-1;
   if s[m]='='then m:=m-1;
   for i:=1 to m div 4 do
   begin
      c1:=Pos(s[n],Data)-1;
      c2:=Pos(s[n+1],Data)-1;
      c3:=Pos(s[n+2],Data)-1;
      c4:=Pos(s[n+3],Data)-1;
      n:=n+4;
      Result:=Result+Chr(((c1 shl 2)and $FC)or((c2 shr 4)and $3));
      Result:=Result+Chr(((c2 shl 4)and $F0)or((c3 shr 2)and $0F));
      Result:=Result+Chr(((c3 shl 6)and $C0)or c4);
   end;
   if m mod 4=2 then
   begin
      c1:=Pos(s[n],Data)-1;
      c2:=Pos(s[n+1],Data)-1;
      Result:=Result+Chr(((c1 shl 2)and $FC)or((c2 shr 4)and $3));
   end;
   if m mod 4=3 then
   begin
      c1:=Pos(s[n],Data)-1;
      c2:=Pos(s[n+1],Data)-1;
      c3:=Pos(s[n+2],Data)-1;
      Result:=Result+Chr(((c1 shl 2)and $FC)or((c2 shr 4)and $3));
      Result:=Result+Chr(((c2 shl 4)and $F0)or((c3 shr 2)and $0F));
   end;
end;


constructor TEnDeScrypt.Create;
begin
  inherited;
  
end;

destructor TEnDeScrypt.Destroy;
begin

  inherited;
end;

function TEnDeScrypt.EnScrypt():string;
begin
end;

function TEnDeScrypt.DeScrypt(DeData:string):string;
begin
end;

function TEnDeScryptHardDisk.EnScrypt():string;
var
  HardDiskSeriID,EnScryptData:string;
begin
  HardDiskSeriID:=Trim(StrPas(GetHardDiskSeriID()));
  EnScryptData:=DataEncode(HardDiskSeriID);
  Result:=EnScryptData;
end;

function TEnDeScryptHardDisk.DeScrypt(DeData:string):string;
var
  DeScryptData:string;
begin
  DeScryptData:=DataDecode(DeData);
  Result:=DeScryptData;
end;


function TEnDeScryptCPU.EnScrypt():string;
var
  CPUSeriID,EnScryptData:string;
begin
  CPUSeriID:=Trim(StrPas(GetCPUSeriID()));
  EnScryptData:=DataEncode(CPUSeriID);
  Result:=EnScryptData;
end;

function TEnDeScryptCPU.DeScrypt(DeData:string):string;
var
  DeScryptData:string;
begin
  DeScryptData:=DataDecode(DeData);
end;

//获得硬盘序列号
function TEnDeScryptHardDisk.GetHardDiskSeriID():Pchar;
const IDENTIFY_BUFFER_SIZE = 512;
type
   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 for future use. Must be zero.
  end;
  TSendCmdInParams=packed record
    // Buffer size in bytes
    cBufferSize:DWORD;
    // Structure with drive register values.
    irDriveRegs:TIDERegs;
    // Physical drive number to send command to (0,1,2,3).
    bDriveNumber:BYTE;
    bReserved:array[0..2] of Byte;
    dwReserved:array[0..3] of DWORD;
    bBuffer:array[0..0] of Byte; // Input buffer.
  end;
  TIdSector=packed record
    wGenConfig:Word;
    wNumCyls:Word;
    wReserved:Word;
    wNumHeads:Word;
    wBytesPerTrack:Word;
    wBytesPerSector:Word;
    wSectorsPerTrack:Word;
    wVendorUnique:array[0..2] of Word;
    sSerialNumber:array[0..19] of CHAR;
    wBufferType:Word;
    wBufferSize:Word;
    wECCSize:Word;
    sFirmwareRev:array[0..7] of Char;
    sModelNumber:array[0..39] of Char;
    wMoreVendorUnique:Word;
    wDoubleWordIO:Word;
    wCapabilities:Word;
    wReserved1:Word;
    wPIOTiming:Word;
    wDMATiming:Word;
    wBS:Word;
    wNumCurrentCyls:Word;
    wNumCurrentHeads:Word;
    wNumCurrentSectorsPerTrack:Word;
    ulCurrentSectorCapacity:DWORD;
    wMultSectorStuff:Word;
    ulTotalAddressableSectors:DWORD;
    wSingleWordDMA:Word;
    wMultiWordDMA:Word;
    bReserved:array[0..127] of BYTE;
  end;
  PIdSector=^TIdSector;
  TDriverStatus=packed record
    //驱动器返回的错误代码,无错则返回0
    bDriverError:Byte;
    //IDE出错寄存器的内容,只有当bDriverError 为 SMART_IDE_ERROR 时有效
    bIDEStatus:Byte;
    bReserved:array[0..1] of Byte;
    dwReserved:array[0..1] of DWORD;
  end;
  TSendCmdOutParams=packed record
    //bBuffer的大小
    cBufferSize:DWORD;
    //驱动器状态
    DriverStatus:TDriverStatus;
    //用于保存从驱动器读出的数据的缓冲区,实际长度由cBufferSize决定
    bBuffer:array[0..0] of BYTE;
  end;
var
  hDevice:Thandle;
  cbBytesReturned:DWORD;
  SCIP:TSendCmdInParams;
  aIdOutCmd:array[0..(SizeOf(TSendCmdOutParams)+IDENTIFY_BUFFER_SIZE-1)-1] of Byte;
  IdOutCmd:TSendCmdOutParams absolute aIdOutCmd;
  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;
begin
  Result:='';//如果出错则返回空串
  if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then
  begin // Windows NT, Windows 2000
    // 提示! 改变名称可适用于其它驱动器,如第二个驱动器: '\\.\PhysicalDrive1\'
    hDevice:=CreateFile('\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,
    FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0);
  end
  else //Version Windows 95 OSR2, Windows 98
    hDevice:=CreateFile('\\.\SMARTVSD',0,0,nil,CREATE_NEW,0,0);
  if hDevice=INVALID_HANDLE_VALUE then Exit;
  try
    FillChar(SCIP, SizeOf(TSendCmdInParams)-1,#0);
    FillChar(aIdOutCmd, SizeOf(aIdOutCmd),#0);
    cbBytesReturned:=0;
     // Set up data structures for IDENTIFY command.
    with SCIP do
    begin
      cBufferSize:=IDENTIFY_BUFFER_SIZE;
      // bDriveNumber := 0;
      with irDriveRegs do
      begin
        bSectorCountReg:=1;
        bSectorNumberReg:=1;
        // if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0
        // else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4);
        bDriveHeadReg:=$A0;
        bCommandReg:=$EC;
      end;
    end;
    if not DeviceIoControl(hDevice,$0007C088,@SCIP,SizeOf(TSendCmdInParams)-1,@aIdOutCmd,SizeOf(aIdOutCmd),cbBytesReturned,nil) then
      Exit;
  finally
    CloseHandle(hDevice);
  end;
  with PIdSector(@IdOutCmd.bBuffer)^ do
  begin
    ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber));
    (Pchar(@sSerialNumber)+SizeOf(sSerialNumber))^:= #0;
    Result:=Pchar(@sSerialNumber);
  end;
end;

//获得CPU序列号
function TEnDeScryptCPU.GetCPUSeriID():Pchar;
begin
end;

//动态库输出函数硬盘序列号
function GetHardDiskSeriID_Dll():WideString;stdcall;export;
begin
  Result:=Trim(StrPas(EnDeScryptHardDisk.GetHardDiskSeriID()));
  //Result:=EnDeScryptHardDisk.GetHardDiskSeriID();
end;

//动态库输出函数CPU序列号
function GetCPUSeriID_Dll():WideString;stdcall;export;
begin
  Result:=Trim(StrPas(EnDeScryptCPU.GetCPUSeriID()));
end;

//直接得到硬盘加密序列号(无参数型)
function GetEnscryptHard():WideString;stdcall;export;
var
  EnSrcyptHardDiskID:string;
begin
  EnSrcyptHardDiskID:=EnDeScryptHardDisk.EnScrypt();
  Result:=EnSrcyptHardDiskID
end;

//输入加密后的字符串得到解密后的硬盘序列号(参数:由GetEnscryptHard得到的加密字符串)
function GetDescryptHard(DeData:string):WideString;stdcall;export;
var
  DeSrcyptHardDiskID:string;
begin
  DeSrcyptHardDiskID:=EnDeScryptHardDisk.DeScrypt(DeData);
  Result:=DeSrcyptHardDiskID;
end;



exports
GetCPUSeriID_Dll,
GetHardDiskSeriID_Dll,
DataEncode,
DataDecode,
GetEnscryptHard,
GetDescryptHard;
begin
  //类初始化
  EnDeScryptHardDisk:=TEnDeScryptHardDisk.Create;
  EnDeScryptCPU:=TEnDeScryptCPU.Create;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -