Keygenning Keygenme by TDC 2005 – RIP ASM


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


Kali ini saya akan membahas bagaimana membuat keygen dengan meng-rip code asm dari target KeygenMe By TDC 2005.

  • Target: keygenme-tdc.exe
  • Protection: Serial
  • Compiller: MASM32 / TASM32
  • Level: Easy
  • Tools: Ollydbg v1.10
  • Skills: ASM, Delphi, Reverse, Logic

{image: Key Generator ME by TDC}

Key Generator ME by TDC

Ok, sekarang load targetnya ke Ollydbg, lalu jalankan (F9). Isi aja semua, min length name 3 char dan max length name 9 char, lalu klik “Register”. Dan pastinya akan muncul pesan, yg mengatakan bahwa: “Sorry, try again or click hints if you want”

Sekarang breakpoint sebelum pesan “badboyz” tersebut keluar, tepatnya di address “00401179″, sebagaimana terlihat pada gambar di bawah ini (klik untuk memperbesar).

{image: Breakpoint}

Breakpoint

0040118D   .  83F8 00      cmp eax,0
00401190   .  75 14        jnz short keygenme.004011A6
00401192   .  68 83634000  push keygenme.00406383    ; ASCII "Registered"
00401197   .  6A 70        push 70
00401199   .  FF75 08      push dword ptr ss:[ebp+8]
0040119C   .  E8 C5010000  call <jmp.&user32.SetDlgItemTextA>
004011A1   .  E9 08010000  jmp keygenme.004012AE
004011A6   >  68 92614000  push keygenme.00406192    ; ASCII "Sorry, try again
                                                     or click hints if you want."
004011AB   .  6A 6C        push 6C
004011AD   .  FF75 08      push dword ptr ss:[ebp+8]
004011B0   .  E8 B1010000  call <jmp.&user32.SetDlgItemTextA>
004011B5   .  68 8E634000  push keygenme.0040638E    ; ASCII "Unregistered"
004011BA   .  6A 70        push 70
004011BC   .  FF75 08      push dword ptr ss:[ebp+8]
004011BF   .  E8 A2010000  call <jmp.&user32.SetDlgItemTextA>

Nah itu dia yg menentukan apakah serial yg kita input sama dengan serial yg sebenarnya. Jika serial yg kita sama maka EAX = 0, tapi jika tidak maka EAX = FFFFFFFF. Sekarang kita lihat algo/loopnya, di dalam call yang tadi diberi breakpoint tersebut, yaitu:

004012B6  |.  68 70644000   	push keygenme.00406470
004012BB  |.  E8 DC000000  	call
004012C0  |.  8BD0          		mov edx,eax
004012C2  |.  33C9         		xor ecx,ecx
004012C4  |.  33DB         		xor ebx,ebx
004012C6  |>  0FB681 706440	movzx eax,byte ptr ds:[ecx+406470]
004012CD  |.  83C0 0A       	add eax,0A
004012D0  |.  03D8          		add ebx,eax
004012D2  |.  41            		inc ecx
004012D3  |.  3BCA          		cmp ecx,edx
004012D5  |.^ 75 EF         	jnz short keygenme.004012C6
004012D7  |.  33C9          		xor ecx,ecx
004012D9  |.  53            		push ebx
004012DA  |.  33DB          		xor ebx,ebx
004012DC  |.  81C3 596F7500 	add ebx,756F59
004012E2  |.  53            		push ebx
004012E3  |.  33DB          		xor ebx,ebx
004012E5  |.  81C3 616C6D00 	add ebx,6D6C61
004012EB  |.  53            		push ebx
004012EC  |.  33DB          		xor ebx,ebx
004012EE  |.  81C3 6F737400 	add ebx,74736F
004012F4  |.  53            		push ebx
004012F5  |.  33DB          		xor ebx,ebx
004012F7  |.  81C3 64696400 	add ebx,646964
004012FD  |.  53            		push ebx
004012FE  |.  33DB          		xor ebx,ebx
00401300  |.  81C3 69742100 	add ebx,217469
00401306  |.  53           		push ebx
00401307  |.  33DB          		xor ebx,ebx
00401309  |.  81C3 21212100 	add ebx,212121
0040130F  |.  53            		push ebx
00401310  |.  33DB          		xor ebx,ebx
00401312  |.  5B            		pop ebx
00401313  |.  5B            		pop ebx
00401314  |.  5B            		pop ebx
00401315  |.  5B            		pop ebx
00401316  |.  5B            		pop ebx
00401317  |.  5B            		pop ebx
00401318  |.  5B            		pop ebx
00401319  |.  69DB 697A0000 	imul ebx,ebx,7A69
0040131F  |.  53           		push ebx
00401320  |.  68 DB634000   	push keygenme.004063DB   ; ASCII "%d"

Setelah di analisa, maka hasilnya:

  • name di isi ke 00406470 (push keygenme.00406470)
  • length name di isi ke EDX (mov edx,eax)
  • ambil setiap byte dari name lalu di isi ke EAX (movzx eax,byte ptr ds:[ecx+406470])
  • dijumlahkan dengan $0A (add eax,0A)
  • dijumlahkan lagi dengan nilai dari EBX
  • lalu dikalikan dengan $7A69
  • hasilnya di format %d
  • dan hasilnya itu adalah real serial-nya

Dan ini dia source code keygen dengan meng-rip asm / Inline ASM

————- [ 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
if (len<=3) or (len>=9) then begin
edit2.Text:='more name 3 char and less name 9 char...';
end else begin
asm
Pushad
        mov edi,name
        mov edx,len
        xor ecx,ecx
        xor ebx,ebx
@keygenme_004012C6:
        movzx eax,byte ptr ds:[ecx+edi]
        add eax,$0A
        add ebx,eax
        inc ecx
        cmp ecx,edx
jnz @keygenme_004012C6
        xor ecx,ecx
        push ebx
        xor ebx,ebx
        add ebx,$0756F59
        push ebx
        xor ebx,ebx
        add ebx,$06D6C61
        push ebx
        xor ebx,ebx
        add ebx,$074736F
        push ebx
        xor ebx,ebx
        add ebx,$0646964
        push ebx
        xor ebx,ebx
        add ebx,$0217469
        push ebx
        xor ebx,ebx
        add ebx,$0212121
        push ebx
        xor ebx,ebx
        pop ebx
        pop ebx
        pop ebx
        pop ebx
        pop ebx
        pop ebx
        pop ebx
        imul ebx,ebx,$07A69
        mov serial,ebx
Popad
end;
edit2.Text:=format('%d',[serial]);
end;
end;


//E.O.F