оффсайт: 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
более того, буфер 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.
бекоз делфе хеккерский язык а вообще, фишка 4то был рипнут кусок кода, я просто его аля инлайн кинул для нао4ности, 4тобы не замора4иваться с рисованием интерсейфа на асме, финт совершенно не в красоте и размере бинаря, а именно в быстром нахождении алго проверки, риппинге на скорую руку, несуть в какой среде его подклю4ать и 4ем компились. если бы коне4ной целью был бинарь или ревирс кода для какойнить малвари, то коне4но же пришлось бы постесняться и компилить масмом)