кейгенинг EmEditor Version 7.00.2 "подшумок"

Discussion in 'Реверсинг' started by ProTeuS, 6 Mar 2008.

  1. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    оффсайт: http://www.emeditor.com/

    это нефига не статья, и не тутор, просто 4еркну пару строк как удивительно иногда тупизм девелаперов помагает нашару закейгенить целую линейку их продуктов без особых усилий.

    как-то загружая на фтп софт загрузил по нагу и эту тулзень, и юзая закейгененую версию emFTP заметил, 4то emEditor незареген и давно хотел поглядеть в 4ем разница в коде от первого продукта.

    про4итав мою статейку по кейгенингу emFTP (http://cracklab.ru/art/?action=view&id=359), выбираем константу в функции подст4ета регномера для EmFTP (например 270Fh из команды CMP AX, 270Fh) и поиск в ольке (Find All Constans) доказывает, 4то девелеперы упорно не хотят менять алго генерации регномеров не то 4то для новых билдов, а даже для совершенно других своих продуктов:
    .text:0044F229 mov esi, 270Fh

    Code:
    .text:0044F21D sub_44F21D      proc near               ; CODE XREF: sub_44F3AC+27p
    .text:0044F21D
    .text:0044F21D var_4           = dword ptr -4
    .text:0044F21D arg_0           = dword ptr  4
    .text:0044F21D
    .text:0044F21D                 push    ecx
    .text:0044F21E                 mov     eax, [esp+4+arg_0]
    .text:0044F222                 movzx   edx, word ptr [eax+2]
    .text:0044F226                 xor     ecx, ecx
    .text:0044F228                 push    esi
    .text:0044F229                 mov     esi, 270Fh
    
    и т.д.

    по4ти один водин совпадает с алго прос4ета в EmFTP. идем на уровень выше и видим все то же сравнение первой вбитой 4байтной последовательности:

    Code:
    .text:0044F3AC sub_44F3AC      proc near               ; CODE XREF: sub_432638+3Ep
    .text:0044F3AC                 movzx   eax, word ptr [esi] //тут загружается первая вбитая при регистрации 4байтная последовательность
    .text:0044F3AF                 push    0Ah
    .text:0044F3B1                 cdq
    .text:0044F3B2                 pop     ecx
    .text:0044F3B3                 idiv    ecx
    .text:0044F3B5                 cmp     eax, 0B5h //тут сравнение. у девелоперов хватило фантазии только 4тобы сменить сравниваемый байт с B7 на B5, но алго оставили тем же
    .text:0044F3BA                 jz      short loc_44F3CD
    .text:0044F3BC                 xor     ecx, ecx
    .text:0044F3BE                 cmp     eax, 0ABh
    .text:0044F3C3                 setnz   cl
    .text:0044F3C6                 lea     ecx, [ecx+ecx-3]
    .text:0044F3CA                 mov     eax, ecx
    .text:0044F3CC                 retn
    .text:0044F3CD ; ---------------------------------------------------------------------------
    .text:0044F3CD
    .text:0044F3CD loc_44F3CD:                             ; CODE XREF: sub_44F3AC+Ej
    .text:0044F3CD                 push    edi
    .text:0044F3CE                 movzx   edi, word ptr [esi+6]
    .text:0044F3D2                 push    esi
    .text:0044F3D3                 call    parse
    .text:0044F3D8                 cmp     eax, 0FFFFFFFEh
    .text:0044F3DB                 jnz     short loc_44F3DF
    .text:0044F3DD                 pop     edi
    .text:0044F3DE                 retn
    
     
    5 people like this.
  2. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    более того, буфер Data по адресу 00483FC0 да и сам алгоритм проверки тоже не изменили. все байт в байт.
    итого кейген для сабжа имеет вид:

    Code:
    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.
    
     
    2 people like this.
  3. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Бля, протеус, а почему на делфи то...??
     
    3 people like this.
  4. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    бекоз делфе хеккерский язык
    а вообще, фишка 4то был рипнут кусок кода, я просто его аля инлайн кинул для нао4ности, 4тобы не замора4иваться с рисованием интерсейфа на асме, финт совершенно не в красоте и размере бинаря, а именно в быстром нахождении алго проверки, риппинге на скорую руку, несуть в какой среде его подклю4ать и 4ем компились. если бы коне4ной целью был бинарь или ревирс кода для какойнить малвари, то коне4но же пришлось бы постесняться и компилить масмом)
     
    1 person likes this.
  5. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    недавно вышел EmEditor 8.01 (http://www.emeditor.com/). Для него кейген все еще актуален
     
    2 people like this.