📄 endescrypt.~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 + -