Показать сообщение отдельно

  #2  
Старый 14.08.2006, 15:55
ProTeuS
Познавший АНТИЧАТ
Регистрация: 26.11.2004
Сообщений: 1,367
Провел на форуме:
4226592

Репутация: 2175


Отправить сообщение для ProTeuS с помощью ICQ
По умолчанию

Вся "красота" функции заключается в математических операциях над первыми тремя введенными числами и записи просчитанного валидного для них четвертого (.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!