|
Познавший АНТИЧАТ
Регистрация: 26.11.2004
Сообщений: 1,367
Провел на форуме: 4226592
Репутация:
2175
|
|
Вся "красота" функции заключается в математических операциях над первыми тремя введенными числами и записи просчитанного валидного для них четвертого (.text:00425306 mov [esi+6], di).
Как мы помним, по адресу 00425351 (cmp di, [esi+6] ; сравниваем 4 ворд с результатом функции) происходит окончательная их проверка. Так что для создания кейгена достаточно "понять" алгоритм проверок и преобразовать его на любой любимый язык. Но можно сделать проще, просто рипнув эту функцию и использовав ее для своих нужд (я употребил плагин для ольки AsmToClipboard -> Copy Fixed Asm To Clipboard).
При этих манипуляциях не стоит забывать, что для правильной работы рипнутого кода в качестве ассемблерной вставки, например, в делфи, нужно корректно заменить используемые в функции указатели на данные на передаваемые ей в своей функции соответствующие переменные, поменять адреса меток на их символьные аналоги и самое важное - что в даной функции используется внешняя таблица констант:
Код:
004252D9 |. 66:8B3C95 203E>MOV DI,WORD PTR DS:[EDX*4+463E20] ; ТУТ
004252E1 |. 99 CDQ
004252E2 |. 66:6BFF 64 IMUL DI,DI,64
004252E6 |. F7FB IDIV EBX
004252E8 |. 8BD8 MOV EBX,EAX
004252EA |. 8BC1 MOV EAX,ECX
004252EC |. 99 CDQ
004252ED |. F7FD IDIV EBP
004252EF |. 03D9 ADD EBX,ECX
004252F1 |. 59 POP ECX
004252F2 |. 03C3 ADD EAX,EBX
004252F4 |. 99 CDQ
004252F5 |. F7F9 IDIV ECX
004252F7 |. 66:033C95 203E>ADD DI,WORD PTR DS:[EDX*4+463E20] ; И ТУТ
чтобы сделать полностью рабочий кейген нужно рипнуть и эту таблицу. Для этого щелкаем в ольке на строке
"004252D9 |. 66:8B3C95 203E>MOV DI,WORD PTR DS:[EDX*4+463E20] ; ТУТ" и жмем Follow in dump -> Address Constant
и получаем в окне дампов начало искомой таблицы (00463E20).
Код:
00463E20 26 00 00 00 5B 00 00 00 62 00 00 00 36 00 00 00 &...[...b...6...
00463E30 34 00 00 00 60 00 00 00 13 00 00 00 35 00 00 00 4...`......5...
00463E40 19 00 00 00 54 00 00 00 3F 00 00 00 44 00 00 00 ...T...?...D...
00463E50 4C 00 00 00 38 00 00 00 5D 00 00 00 33 00 00 00 L...8...]...3...
00463E60 56 00 00 00 61 00 00 00 42 00 00 00 21 00 00 00 V...a...B...!...
00463E70 3E 00 00 00 2D 00 00 00 23 00 00 00 0E 00 00 00 >...-...#......
00463E80 1E 00 00 00 5F 00 00 00 57 00 00 00 12 00 00 00 ..._...W......
00463E90 1B 00 00 00 17 00 00 00 22 00 00 00 58 00 00 00 ......"...X...
00463EA0 2C 00 00 00 63 00 00 00 5C 00 00 00 18 00 00 00 ,...c...\......
00463EB0 37 00 00 00 41 00 00 00 59 00 00 00 4D 00 00 00 7...A...Y...M...
00463EC0 15 00 00 00 5A 00 00 00 53 00 00 00 0B 00 00 00 ...Z...S......
00463ED0 05 00 00 00 1C 00 00 00 10 00 00 00 2E 00 00 00 .............
00463EE0 49 00 00 00 40 00 00 00 0D 00 00 00 07 00 00 00 I...@..........
00463EF0 50 00 00 00 3D 00 00 00 32 00 00 00 46 00 00 00 P...=...2...F...
00463F00 0A 00 00 00 43 00 00 00 2B 00 00 00 00 00 00 00 ....C...+.......
00463F10 3B 00 00 00 48 00 00 00 5E 00 00 00 4E 00 00 00 ;...H...^...N...
00463F20 51 00 00 00 1F 00 00 00 20 00 00 00 3A 00 00 00 Q...... ...:...
00463F30 01 00 00 00 2A 00 00 00 45 00 00 00 55 00 00 00 ...*...E...U...
00463F40 4A 00 00 00 02 00 00 00 52 00 00 00 27 00 00 00 J......R...'...
00463F50 03 00 00 00 4B 00 00 00 08 00 00 00 3C 00 00 00 ...K......<...
00463F60 0F 00 00 00 14 00 00 00 24 00 00 00 25 00 00 00 ......$...%...
00463F70 28 00 00 00 29 00 00 00 16 00 00 00 1D 00 00 00 (...).........
00463F80 1A 00 00 00 11 00 00 00 2F 00 00 00 39 00 00 00 ....../...9...
00463F90 09 00 00 00 47 00 00 00 06 00 00 00 4F 00 00 00 ....G......O...
00463FA0 04 00 00 00 31 00 00 00 0C 00 00 00 30 00 00 00 ...1.......0...
копируем дамп по адрес 463FB0 (ровно 400 байт, которые имеют визуально схожую структуру).
Забив в своем кейгене дамп в отдельную таблицу, получаем примерно такое:
Код:
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 <> $BF 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.
gl hf!
|