var
dword_406020, dword_406024, dword_406028: DWord;
Table1: array [0..15] of byte = ($0F, $00, $0E, $01, $0D, $02, $0C, $03, $0B, $04, $0A, $05, $09, $06, $08, $07);
Table2: array [0..49] of byte = ( $0A, $0B, $0C, $0D, $0E, $0F, $00, $01, $02, $03, $04, $05, $06, $07, $08, $09,
$07, $08, $06, $09, $05, $0A, $04, $0B, $03, $0C, $02, $0D, $01, $0E, $00, $0F,
$0B, $0C, $0D, $0E, $0F, $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0A,
$00, $00);
NichtGenauerAnalysierteFunktion: function (ConvertTable, PSerial1, PSerial2: Pointer; Serial3, Serial4: AnsiChar): DWord; cdecl;
function NichtGenauerAnalysierteFunktion_Stub(ConvertTable, PSerial1, PSerial2: Pointer; Serial3, Serial4: AnsiChar): DWord; cdecl;
asm
PUSH EBP
MOV EBP,ESP
PUSH EDI
PUSH ESI
PUSH EBX
SUB ESP,$8
MOV EAX,DWORD PTR SS:[EBP+$8]
MOV EDX,DWORD PTR SS:[EBP+$C]
MOV EBX,DWORD PTR SS:[EBP+$10]
MOVSX ECX,BYTE PTR SS:[EBP+$14]
MOV DWORD PTR SS:[EBP-$14],ECX
MOV ESI,ECX
AND ESI, $0F
MOV CL,BYTE PTR SS:[EBP+$14]
SAR CL,$4
MOVSX ECX,CL
MOVSX ECX,BYTE PTR DS:[EAX+ECX]
SHL ECX,$4
OR CL,BYTE PTR DS:[EAX+ESI]
XOR BYTE PTR DS:[EDX],CL
MOVSX ESI,BYTE PTR SS:[EBP+$18]
MOV EDI,ESI
AND EDI,$0F
MOV CL,BYTE PTR SS:[EBP+$18]
SAR CL,$4
MOVSX ECX,CL
MOVSX ECX,BYTE PTR DS:[EAX+ECX]
SHL ECX,$4
OR CL,BYTE PTR DS:[EAX+EDI]
XOR CL,BYTE PTR DS:[EBX]
MOV BYTE PTR DS:[EBX],CL
MOVSX EDX,BYTE PTR DS:[EDX]
MOVSX ECX,CL
MOV DWORD PTR DS:[dword_406020],EDX
MOV DWORD PTR DS:[dword_406024],ECX
MOV EAX,DWORD PTR DS:[dword_406028]
XOR EAX,$1
MOV DWORD PTR DS:[&dword_406028],EAX
MOV EDI,DWORD PTR SS:[EBP-$14]
SHL EDI,$8
LEA ESI,DWORD PTR DS:[EDI+ESI]
MOV EAX,EDX
SHL EAX,$18
LEA EAX,DWORD PTR DS:[ESI+EAX]
MOV EBX,ECX
SHL EBX,$10
ADD EAX,EBX
SHL EDX,$8
ADD ECX,EDX
IMUL ECX,ESI
XOR EAX,ECX
ADD ESP,$8
POP EBX
POP ESI
POP EDI
LEAVE
RETN
end;
function Keygen(Name: AnsiString): AnsiString;
var
Hash1, Hash2: DWord;
i: Integer;
begin
result := '';
NichtGenauerAnalysierteFunktion:= Pointer(DWord(@NichtGenauerAnalysierteFunktion_Stub) + 3); //Kill STACKFRAME!11
if ((Length(Name) mod 4) = 0) then
begin
for i := 0 to pred(Length(Name) div 4) do
begin
Hash1 := NichtGenauerAnalysierteFunktion(@Table1[0], @Name[(i*4) + 1], @Name[(i*4) + 2], Name[(i*4) + 3], Name[(i*4) + 4]);
Hash2 := NichtGenauerAnalysierteFunktion(@Table2[0], @Name[(i*4) + 3], @Name[(i*4) + 4], Name[(i*4) + 1], Name[(i*4) + 2]);
result := result + IntToHex(Hash1 + Hash2, 8);
end;
end;
end;