📄 onguard.pas
字号:
Inc(II, 4);
end;
Transform(MD5.State, InBuf);
MDI := 0;
end;
end;
end;
function FinalizeMD5(var Context : TMD5Context) : TMD5Digest;
const
Padding: array [0..63] of Byte = (
$80, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00);
var
MD5 : TMD5ContextEx absolute Context;
InBuf : array [0..15] of DWord; {!!.07}
MDI : LongInt;
I : Word;
II : Word;
PadLen : Word;
begin
{save number of bits}
InBuf[14] := MD5.Count[0];
InBuf[15] := MD5.Count[1];
{compute number of bytes mod 64}
MDI := (MD5.Count[0] shr 3) and $3F;
{pad out to 56 mod 64}
if (MDI < 56) then
PadLen := 56 - MDI
else
PadLen := 120 - MDI;
UpdateMD5(Context, Padding, PadLen);
{append length in bits and transform}
II := 0;
for I := 0 to 13 do begin
InBuf[I] := (LongInt(MD5.Buf[II + 3]) shl 24) or
(LongInt(MD5.Buf[II + 2]) shl 16) or
(LongInt(MD5.Buf[II + 1]) shl 8) or
LongInt(MD5.Buf[II]);
Inc(II, 4);
end;
Transform(MD5.State, InBuf);
{store buffer in digest (Result)}
II := 0;
for I := 0 to 3 do begin
Result[II] := Byte(MD5.State[I] and $FF);
Result[II + 1] := Byte((MD5.State[I] shr 8) and $FF);
Result[II + 2] := Byte((MD5.State[I] shr 16) and $FF);
Result[II + 3] := Byte((MD5.State[I] shr 24) and $FF);
Inc(II, 4);
end;
end;
function HashMD5(const Buf; BufSize : LongInt) : TMD5Digest;
var
Context : TMD5Context;
begin
InitMD5(Context);
UpdateMD5(Context, Buf, BufSize);
Result := FinalizeMD5(Context);
end;
{message digest routines}
type
TMDContextEx = record
DigestIndex : LongInt;
Digest : array [0..255] of Byte;
KeyIndex : LongInt;
case Byte of
0: (KeyInts : array [0..3] of LongInt);
1: (Key : TKey);
end;
TBlock2048 = array [0..255] of Byte;
procedure InitTMD(var Context : TTMDContext);
var
ContextEx : TMDContextEx absolute Context;
begin
ContextEx.DigestIndex := 0;
TBlock2048(ContextEx.Digest) := TBlock2048(Pi2048);
ContextEx.KeyIndex := 0;
ContextEx.KeyInts[0] := $55555555;
ContextEx.KeyInts[1] := $55555555;
ContextEx.KeyInts[2] := $55555555;
ContextEx.KeyInts[3] := $55555555;
end;
procedure UpdateTMD(var Context : TTMDContext; const Buf; BufSize : LongInt);
var
ContextEx : TMDContextEx absolute Context;
BufBytes : TByteArray absolute Buf;
AA, BB : LongInt;
CC, DD : LongInt;
I, R : LongInt;
begin
for I := 0 to BufSize - 1 do
with ContextEx do begin
{update Digest}
Digest[DigestIndex] := Digest[DigestIndex] xor BufBytes[I];
DigestIndex := DigestIndex + 1;
if (DigestIndex = SizeOf(Digest)) then
DigestIndex := 0;
{update BlockKey}
Key[KeyIndex] := Key[KeyIndex] xor BufBytes[I];
KeyIndex := KeyIndex + 1;
if (KeyIndex = SizeOf(Key) div 2) then begin
AA := KeyInts[3];
BB := KeyInts[2];
CC := KeyInts[1];
DD := KeyInts[0];
{mix all the bits around for 4 rounds}
{achieves avalanche and eliminates funnels}
for R := 0 to 3 do begin
AA := AA + DD; DD := DD + AA; AA := AA xor (AA shr 7);
BB := BB + AA; AA := AA + BB; BB := BB xor (BB shl 13);
CC := CC + BB; BB := BB + CC; CC := CC xor (CC shr 17);
DD := DD + CC; CC := CC + DD; DD := DD xor (DD shl 9);
AA := AA + DD; DD := DD + AA; AA := AA xor (AA shr 3);
BB := BB + AA; AA := AA + BB; BB := BB xor (BB shl 7);
CC := CC + BB; BB := BB + CC; CC := CC xor (DD shr 15);
DD := DD + CC; CC := CC + DD; DD := DD xor (DD shl 11);
end;
KeyInts[0] := AA;
KeyInts[1] := BB;
KeyInts[2] := CC;
KeyInts[3] := DD;
KeyIndex := 0;
end;
end;
end;
procedure FinalizeTMD(var Context : TTMDContext; var Digest; DigestSize : LongInt);
const
Padding : array [0..7] of Byte = (1, 0, 0, 0, 0, 0, 0, 0);
var
ContextEx : TMDContextEx absolute Context;
I : Integer;
begin
{pad with "1", followed by as many "0"s as needed to fill the block}
UpdateTMD(Context, Padding, SizeOf(Padding) - ContextEx.KeyIndex);
{mix each block within Context with the key}
for I := 0 to (SizeOf(ContextEx.Digest) div SizeOf(TCode)) - 1 do
MixBlock(T128Bit(ContextEx.Key), PCode(@ContextEx.Digest[I * SizeOf(TCode)])^, True);
{return Digest of requested DigestSize}
{max digest is 2048-bit, although it could be greater if Pi2048 was larger}
Move(ContextEx.Digest, Digest, Min(SizeOf(ContextEx.Digest), DigestSize));
end;
{message digest hash}
procedure HashTMD(var Digest; DigestSize : LongInt; const Buf; BufSize : LongInt);
var
Context : TTMDContext;
begin
InitTMD(Context);
UpdateTMD(Context, Buf, BufSize);
FinalizeTMD(Context, Digest, DigestSize);
end;
{$IFDEF Win32}
{!!.05} {added}
function CreateMachineID(MachineInfo : TEsMachineInfoSet) : LongInt;
{ Obtains information from:
- Volume sizes (NOT free space)
- Volume serial numbers
- Registration name and company
- GetSystemInfo relevant info
- Network card ID (if available)
}
const
sCurVer = 'Software\Microsoft\Windows\CurrentVersion'; {!!.11}
sCurVerNT = 'Software\Microsoft\Windows NT\CurrentVersion'; {!!.11}
sRegOwner = 'RegisteredOwner'; {!!.11}
sRegOrg = 'RegisteredOrganization'; {!!.11}
type {!!.11}
TUuidCreateSequential = function (lpGUID : Pointer): HResult; stdcall; {!!.11}
var
hRPCTR4 : THandle; {!!.11}
UuidCreateSequential : TUuidCreateSequential; {!!.11}
I : DWord;
RegKey : HKEY;
GUID1 : TGUID;
GUID2 : TGUID;
Drive : AnsiChar;
SysInfo : TSystemInfo;
Context : TTMDContext;
UserInfoFound : Boolean; {!!.11}
Buf : array [0..1023] of Byte;
begin
InitTMD(Context);
{include user specific information}
if midUser in MachineInfo then begin
{!!.11}
UserInfoFound := False;
{ first look for registered info in \Windows\CurrentVersion }
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, sCurVer, 0,
KEY_QUERY_VALUE, RegKey) = ERROR_SUCCESS) then begin
I := SizeOf(Buf);
if RegQueryValueEx(RegKey, sRegOwner, nil, nil, @Buf, @I) = ERROR_SUCCESS then begin
UserInfoFound := True;
UpdateTMD(Context, Buf, I);
I := SizeOf(Buf);
if RegQueryValueEx(RegKey, sRegOrg, nil, nil, @Buf, @I) = ERROR_SUCCESS then
UpdateTMD(Context, Buf, I);
end;
RegCloseKey(RegKey); {!!.13}
end;
{!!.11}
{ if not found, then look in \Windows NT\CurrentVersion }
if not UserInfoFound then
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, sCurVerNT, 0,
KEY_QUERY_VALUE, RegKey) = ERROR_SUCCESS) then begin
I := SizeOf(Buf);
if RegQueryValueEx(RegKey, sRegOwner, nil, nil, @Buf, @I) = ERROR_SUCCESS then begin
UpdateTMD(Context, Buf, I);
I := SizeOf(Buf);
if RegQueryValueEx(RegKey, sRegOrg, nil, nil, @Buf, @I) = ERROR_SUCCESS then
UpdateTMD(Context, Buf, I);
end;
RegCloseKey(RegKey); {!!.13}
end;
end;
if midSystem in MachineInfo then begin
{include system specific information}
GetSystemInfo(SysInfo);
PDWord(@Buf[0])^ := SysInfo.dwOemId;
PDWord(@Buf[4])^ := SysInfo.dwProcessorType;
UpdateTMD(Context, Buf, 8);
end;
if midNetwork in MachineInfo then begin
{include network ID}
CoCreateGuid(GUID1);
CoCreateGuid(GUID2);
{!!.11}
{ use UuidCreateSequential instead of CoCreateGuid if available }
hRPCTR4 := LoadLibrary('rpcrt4.dll');
if (hRPCTR4 <> 0) then begin
@UuidCreateSequential := GetProcAddress(hRPCTR4, 'UuidCreateSequential');
if Assigned(UuidCreateSequential) then begin
UuidCreateSequential(@GUID1);
UuidCreateSequential(@GUID2);
end;
FreeLibrary(hRPCTR4); {!!.13}
end;
{!!.11}
{check to see if "network" ID is available}
if (GUID1.D4[2] = GUID2.D4[2]) and
(GUID1.D4[3] = GUID2.D4[3]) and
(GUID1.D4[4] = GUID2.D4[4]) and
(GUID1.D4[5] = GUID2.D4[5]) and
(GUID1.D4[6] = GUID2.D4[6]) and
(GUID1.D4[7] = GUID2.D4[7]) then
UpdateTMD(Context, GUID1.D4[2], 6);
end;
if midDrives in MachineInfo then begin
{include drive specific information}
for Drive := 'C' to 'Z' do begin
if (GetDriveType(PAnsiChar(Drive + ':\')) = DRIVE_FIXED) then begin
FillChar(Buf, Sizeof(Buf), 0);
Buf[0] := Byte(Drive);
{!!.16} {removed cluster information}
GetVolumeInformation(PAnsiChar(Drive + ':\'), nil, 0,
PDWord(@Buf[1]){serial number}, I{not used}, I{not used}, nil, 0);
UpdateTMD(Context, Buf, 5);
end;
end;
end;
FinalizeTMD(Context, Result, SizeOf(Result));
end;
{$ELSE}
function CreateMachineID(MachineInfo : TEsMachineInfoSet) : LongInt;
var
I : DWord;
RegKey : DWord;
GUID1 : TGUID;
GUID2 : TGUID;
Drive : Integer;
Context : TTMDContext;
Buf : array [0..1023] of Byte;
begin
InitTMD(Context);
{no user (midUser) information under Win16}
if midSystem in MachineInfo then begin
{include system specific information}
I := GetWindowsDirectory(@Buf, SizeOf(Buf));
UpdateTMD(Context, Buf, I);
I := GetSystemDirectory(@Buf, SizeOf(Buf));
UpdateTMD(Context, Buf, I);
PLongInt(@Buf[0])^ := GetWinFlags;
PLongInt(@Buf[4])^ := WinProcs.GetVersion;
UpdateTMD(Context, Buf, 8);
end;
if midNetwork in MachineInfo then begin
{include network ID}
CoCreateGuid(GUID1);
CoCreateGuid(GUID2);
{check to see if "network" ID is available}
if (GUID1.Data4[2] = GUID2.Data4[2]) and
(GUID1.Data4[3] = GUID2.Data4[3]) and
(GUID1.Data4[4] = GUID2.Data4[4]) and
(GUID1.Data4[5] = GUID2.Data4[5]) and
(GUID1.Data4[6] = GUID2.Data4[6]) and
(GUID1.Data4[7] = GUID2.Data4[7]) then
UpdateTMD(Context, GUID1.Data4[2], 6);
end;
if midDrives in MachineInfo then begin
{include drive specific information}
for Drive := 2 {C} to 25 {Z} do begin
if GetDriveType(Drive) = DRIVE_FIXED then begin
FillChar(Buf, Sizeof(Buf), 0);
Buf[0] := Drive;
{!!.06} {removed cluster information}
PLongInt(@Buf[1])^ := GetDiskSerialNumber(Chr(Drive+Ord('A')));{!!.06}
UpdateTMD(Context, Buf, 5);
end;
end;
end;
FinalizeTMD(Context, Result, SizeOf(Result));
end;
{$ENDIF}
{key generation routines }
procedure GenerateRandomKeyPrim(var Key; KeySize: Cardinal);
var
Bytes : TByteArray absolute Key;
I : Integer;
begin
Randomize;
for I := 0 to KeySize - 1 do
Bytes[I] := Random(256);
end;
procedure GenerateTMDKeyPrim(var Key; KeySize: Cardinal; const Str: string);
var
I : Integer;
S2 : string;
begin
{strip accented characters from the string} {!!.06}
S2 := Str; {!!.06}
for I := Length(S2) downto 1 do {!!.06}
if Ord(S2[I]) > 127 then {!!.06}
Delete(S2, I, 1); {!!.06}
HashTMD(Key, KeySize, S2[1], Length(S2)); {!!.06}
end;
procedure GenerateMD5KeyPrim(var Key: TKey; const Str: string);
var
D : TMD5Digest;
I : Integer;
S2 : string;
begin
{strip accented characters from the string} {!!.06}
S2 := Str; {!!.06}
for I := Length(S2) downto 1 do {!!.06}
if Ord(S2[I]) > 127 then {!!.06}
Delete(S2, I, 1); {!!.06}
D := HashMD5(S2[1], Length(S2)); {!!.06}
Key := TKey(D);
end;
{modifier routines}
function GenerateStringModifierPrim(const S : string) : LongInt;
var
I : Integer; {!!.06}
Sig : array [0..4] of AnsiChar;
S2 : string; {!!.06}
begin
FillChar(Sig, SizeOf(Sig), 0);
{strip accented characters from the string} {!!.06}
S2 := S; {!!.06}
for I := Length(S2) downto 1 do {!!.06}
if Ord(S2[I]) > 127 then {!!.06}
Delete(S2, I, 1); {!!.06}
StrPLCopy(Sig, AnsiUpperCase(S2), Min(4, Length(S2))); {!!.06}
Result := PLongInt(@Sig[0])^;
end;
function GenerateUniqueModifierPrim : LongInt;
var
ID : TGUID;
begin
CoCreateGuid(ID);
Mix128(T128Bit(ID));
Result := T128Bit(ID)[3];
end;
{!!.05} {revised}
function GenerateMachineModifierPrim : LongInt;
begin
Result := CreateMachineID([midUser, midSystem, {midNetwork,} midDrives]);
end;
function GenerateDateModifierPrim(D : TDateTime) : LongInt;
begin
Result := Trunc(D);
TLongIntRec(Result).Hi := TLongIntRec(Result).Lo xor $AAAA;
end;
procedure ApplyModifierToKeyPrim(Modifier : LongInt; var Key; KeySize : Cardinal);
begin
if Modifier <> 0 then
XorMem(Key, Modifier, Min(SizeOf(Modifier), KeySize));
end;
{*** TogCodeBase ***}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -