более того, буфер Data по адресу 00483FC0 да и сам алгоритм проверки тоже не изменили. все байт в байт.
итого кейген для сабжа имеет вид:
Код:
unit main; //на форме баттон и 4 спинедита
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin;
type
TForm1 = class(TForm)
Button1: TButton;
SpinEdit1: TSpinEdit;
SpinEdit2: TSpinEdit;
SpinEdit3: TSpinEdit;
SpinEdit4: TSpinEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
Data: array [1..400] of byte =(
$26, 00, 00, 00, $5B, 00, 00, 00, $62, 00, 00, 00, $36, 00, 00, 00, //&...[...b...6...
$34, 00, 00, 00, $60, 00, 00, 00, $13, 00, 00, 00, $35, 00, 00, 00, //4...`......5...
$19, 00, 00, 00, $54, 00, 00, 00, $3F, 00, 00, 00, $44, 00, 00, 00, //...T...?...D...
$4C, 00, 00, 00, $38, 00, 00, 00, $5D, 00, 00, 00, $33, 00, 00, 00, //L...8...]...3...
$56, 00, 00, 00, $61, 00, 00, 00, $42, 00, 00, 00, $21, 00, 00, 00, //V...a...B...!...
$3E, 00, 00, 00, $2D, 00, 00, 00, $23, 00, 00, 00, $0E, 00, 00, 00, //>...-...#......
$1E, 00, 00, 00, $5F, 00, 00, 00, $57, 00, 00, 00, $12, 00, 00, 00, //..._...W......
$1B, 00, 00, 00, $17, 00, 00, 00, $22, 00, 00, 00, $58, 00, 00, 00, //......"...X...
$2C, 00, 00, 00, $63, 00, 00, 00, $5C, 00, 00, 00, $18, 00, 00, 00, //,...c...\......
$37, 00, 00, 00, $41, 00, 00, 00, $59, 00, 00, 00, $4D, 00, 00, 00, //7...A...Y...M...
$15, 00, 00, 00, $5A, 00, 00, 00, $53, 00, 00, 00, $0B, 00, 00, 00, //...Z...S......
$05, 00, 00, 00, $1C, 00, 00, 00, $10, 00, 00, 00, $2E, 00, 00, 00, //.............
$49, 00, 00, 00, $40, 00, 00, 00, $0D, 00, 00, 00, $07, 00, 00, 00, //I...@..........
$50, 00, 00, 00, $3D, 00, 00, 00, $32, 00, 00, 00, $46, 00, 00, 00, //P...=...2...F...
$0A, 00, 00, 00, $43, 00, 00, 00, $2B, 00, 00, 00, $00, 00, 00, 00, //....C...+.......
$3B, 00, 00, 00, $48, 00, 00, 00, $5E, 00, 00, 00, $4E, 00, 00, 00, //;...H...^...N...
$51, 00, 00, 00, $1F, 00, 00, 00, $20, 00, 00, 00, $3A, 00, 00, 00, //Q...... ...:...
$01, 00, 00, 00, $2A, 00, 00, 00, $45, 00, 00, 00, $55, 00, 00, 00, //...*...E...U...
$4A, 00, 00, 00, $02, 00, 00, 00, $52, 00, 00, 00, $27, 00, 00, 00, //J......R...'...
$03, 00, 00, 00, $4B, 00, 00, 00, $08, 00, 00, 00, $3C, 00, 00, 00, //...K......<...
$0F, 00, 00, 00, $14, 00, 00, 00, $24, 00, 00, 00, $25, 00, 00, 00, //......$...%...
$28, 00, 00, 00, $29, 00, 00, 00, $16, 00, 00, 00, $1D, 00, 00, 00, //(...).........
$1A, 00, 00, 00, $11, 00, 00, 00, $2F, 00, 00, 00, $39, 00, 00, 00, //....../...9...
$09, 00, 00, 00, $47, 00, 00, 00, $06, 00, 00, 00, $4F, 00, 00, 00, //....G......O...
$04, 00, 00, 00, $31, 00, 00, 00, $0C, 00, 00, 00, $30, 00, 00, 00); //...1.......0...
var
Form1: TForm1;
implementation
{$R *.dfm}
function Generate(first, second, third, fourth :word): word;
begin
asm
PUSH ESI
PUSH ECX
PUSH ECX
MOV DX, second
AND fourth, 0
CMP DX, 270Fh
JA @ending
MOV AX, third
CMP AX, 270Fh
JA @ending
XOR ECX, ECX
MOV CX, first
CMP CX, 715h
MOV esi, ECX //!!!
JNZ @next
CMP DX, 1C1Eh
JNZ @next
CMP AX, 159Dh
JNZ @next
@fail:
PUSH -2
JMP @ending2
@next:
CMP CX, 71Ah
JNZ @next2
CMP DX, 1009h
JNZ @next2
CMP AX, 15h
JE @fail
@next2:
CMP CX, 714h
JNZ @main
CMP DX, 1321h
JNZ @main
CMP AX, 0B6Ch
JE @fail
@main:
PUSH EBX
PUSH EBP
PUSH EDI
MOVZX EDI,AX
MOVZX EAX,DX
MOV esi, EAX //!!!
PUSH 64h
POP EBX
MOV EAX,EDI
CDQ
IDIV EBX
PUSH 0Ah
POP EBP
MOVZX ECX, CX
PUSH 64h
MOV EBX, EAX
MOV EAX, ECX
CDQ
IDIV EBP
ADD EBX, esi
ADD EAX, EBX
ADD EAX, EDI
CDQ
POP EDI
IDIV EDI
MOV EAX, esi
PUSH 64h
POP EBX
PUSH 64h
POP EBP
PUSH EBP
MOV DI, WORD PTR DS:[EDX*4 + Data]
CDQ
IMUL DI,DI,64h
IDIV EBX
MOV EBX, EAX
MOV EAX, ECX
CDQ
IDIV EBP
ADD EBX, ECX
POP ECX
ADD EAX, EBX
CDQ
IDIV ECX
ADD DI, WORD PTR DS:[EDX*4 + Data]
MOV DX, DI
POP EDI
POP EBP
POP EBX
CMP first, 77Bh
MOV fourth, DX //result
JE @fail2
CMP first, 77Ah
JE @fail2
XOR EAX, EAX
INC EAX
JMP @end
@fail2:
PUSH 2
@ending2:
POP EAX
JMP @end
@ending:
OR EAX, -1h
@end:
MOV CX, fourth
MOV RESULT, CX
POP ECX
POP ECX
POP ESI
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
label
next_iteration;
var
first, second, third, fourth: word;
begin
randomize;
next_iteration:
first := random(9999); //генерируем 4 случайных числа
second := random(9999);
third := random(9999);
fourth := random(9999);
if first div $A <> $B5 then goto next_iteration; //вот эта ОГРОМНАЯ разница в коде между двумя продуктами
if first = $77B then goto next_iteration; //эти значения не следует брать, т.к. они используются только в
if first = $77A then goto next_iteration; //education и academic version, а нам нужна FULL
SpinEdit1.Value := first;
SpinEdit2.Value := second;
SpinEdit3.Value := third;
SpinEdit4.Value := Generate(first, second, third, fourth);
end;
end.
|