Keygenning MFC-Anwendung Crme V1


  • Ray-29/B.U.G
  • ray_stv29[~@t~]yahoo˳co[~d.t~]id
  • Wednesday, February 9th, 2011
  • CopyLEFT (c) 2011++ www.spyrozone.net All Rights Reserved


Kali ini saya akan membahas bagaimana membuat keygen dari target MFC-Anwendung crme1. Tentunya itulah tidak mudah dibandingkan dengan teknik patching. Dengan dukungan dan masukan dari teman2, semua mastah dan team reverse engineering, yaitu diantaranya: bo3l4q, GrindStone, Jowy, k3p06, Yohukm, Ortega, Apakekdah, IUG, IDSH, KocokJaya, Unregistered, X-Code, Spyrozone, Coder, CiS, iNFECTiON, dll. Akhirnya dapat membuat keygen, walaupun belum hebat2 banget :)

{images: crackme #1}

crackme #1

  • Target : MFC-Anwendung crme1
  • Protection : Serial
  • Compiller : Microsoft Visual C++ 6.0
  • Level : Easy
  • Tools : Ollydbg v1.10
  • Skills : ASM, Delphi, Reverse, Logic

Ok, sekarang load targetnya ke Ollydbg, lalu jalankan (F9). Isi aja semua, lalu klik “Register”. Dan pastinya akan muncul pesan, yg mengatakan bahwa serial yang kita input salah, seperti yang terlihat pada gambar di bawah ini:

{images: Pesan Error}

Pesan Error

Sekarang breakpoint sebelum pesan “badboyz” tersebut, tepatnya di address “004013C5″

{images: Breakpoint}

Breakpoint

004013FE    3BC3              cmp eax,ebx
00401400    75 1E             jnz short crme1.00401420
00401402    68 68304000     push crme1.00403068  ; ASCII "Yippie"
00401407    68 4C304000     push crme1.0040304C  ; ASCII "Programm ist registriert"
0040140C    8BCF            mov ecx,edi
0040140E    E8 45020000     call <jmp.&MFC42.#4224_CWnd::MessageBoxA>
00401413    6A 00           push 0
00401415    8BCF            mov ecx,edi
00401417    E8 48020000     call <jmp.&MFC42.#6334_CWnd::UpdateData>
0040141C    5F              pop edi
0040141D    5E              pop esi
0040141E    5B              pop ebx
0040141F    C3              retn
00401420    68 38304000     push crme1.00403038   ; ASCII "neinneinnein ..."
00401425    68 20304000     push crme1.00403020   ; ASCII "das war wohl nix ..."
0040142A    8BCF            mov ecx,edi
0040142C    E8 27020000     call <jmp.&MFC42.#4224_CWnd::MessageBoxA>
00401431    6A 00           push 0

Nah itu dia yg menentukan apakah serial yg kita input sama dengan serial yg sebenarnya. Sekarang kita lihat algo/loopnya, sebelum code tersebut, yaitu:

004013DB    50              	push eax
004013DC    8BCE            	mov ecx,esi
004013DE    E8 7B020000    	call
004013E3    8B16            	mov edx,ds:[esi]
004013E5    33C9            	xor ecx,ecx
004013E7    8B52 F8         	mov edx,ds:[edx-8]
004013EA    85D2            	test edx,edx
004013EC    7E 0B           	jle short crme1.004013F9
004013EE    0FBE3401        	movsx esi,byte ptr ds:[ecx+eax]
004013F2    03DE            	add ebx,esi
004013F4    41              	inc ecx
004013F5    3BCA            	cmp ecx,edx
004013F7  ^ 7C F5           	jl short crme1.004013EE
004013F9    8B47 64         	mov eax,ds:[edi+64]
004013FC    6A 00           	push 0

Setelah di analisa, maka hasilnya:

  • name di isi ke EAX
  • length name di isi ke EDX (mov edx,ds:[edx-8])
  • ambil setiap byte dari name lalu di isi ke ESI (movsx esi,byte ptr ds:[ecx+eax])
  • dijumlahkan nilai dari EBX dengan nilai ESI (add ebx,esi)
  • maka real serial-nya akan tersimpan di EBX

[ With Inline ASM In Delphi ]

procedure TForm1. Button1Click(Sender: TObject);
var
len,serial:integer;
name:string;
begin
name:=edit1.Text;
len:=length(name);
if name='' then begin
edit2.Text:='please insert your name...';
end else begin
asm
Pushad
mov eax,name
mov edx,len
xor ecx,ecx
xor ebx,ebx
@loop:
movsx esi,byte ptr ds:[ecx+eax]
add ebx,esi
mov serial,ebx
inc ecx
cmp ecx,edx
jl @loop
Popad
end;
edit2.Text:=inttostr(serial);
end;
end;

Dan ini dia source code keygen-nya:

[ With Out Inline ASM In Delphi ]

procedure TForm1.Button2Click(Sender: TObject);
var
len,count,serial,i:integer;
name:string;
begin
name:=edit1.Text;
len:=length(name);
if name='' then begin
edit2.Text:='please insert your name...';
end else begin
serial:=$0;
for i:=0 to len do begin
count:=ord(name[i]);
serial:=serial+count;
end;
edit2.Text:=inttostr(serial);
end;
end;

Thanks – N – Enjoy
( RaY-29 )


//E.O.F