Februari 1999

"SuperJPG 3.x"

(  KeyGenZ  )

Win '95 PROGRAM Win Code Reversing  

 

oleh

flag eRRatum & CHuPaCaBRa 

 

 

[eKH]

   

 

Program Target

SuperJPG 3.x
772 Kb
http://www.midnightblue.com/superjpg/

 
 

Tools Used:

SoftICE 3.24 ( Kraking )
Turbo C / C++ ( KeyGenZ )

 

Rating

Easy (   )  Medium ( X )  Hard (    )  Pro (    ) 

There is a crack, a crack in everything. That's how the light gets in.

 


    "SuperJPG 3.x"

( KeyGenZ )

oleh

flag eRRatum & CHuPaCaBRa 
 

Intro

Hallo again... :-)

Another KeyGenZ Tutorial. SuperJPG 3.x adalah salah satu program yang menjadi target dalam Kraking Challange yang diadakan oleh anak - anak eKH. Program ini memmpunyai tipe proteksi yang sederhana, tapi cukup bagus buat dijadiin contoh dalam tutorial KeyGenZ :-)

Tutorial ini disusun oleh flag eRRatum ( KeyGenZ Routine ) dan CHuPaCaBRa ( Essay ).

Pengenalan Program

Sekilas mengenai SuperJPG :

"SuperJPG is a revolutionary image file browser, viewer and cataloging utility. It features ultra fast thumbnail and image loading, drag and drop sorting, and directory management features "

Program ini dapat digunakan selama 30 hari atau 50 kali penggunaan ( salah satu yang lebih dulu ), bagi Unregister User. Untuk User yang sudah membayar, akan diberikan sebuah PassCode ( terdiri dari 2 bagian ) yang dapat dimasukan melalui Registration Box ( menu File >> Register ).

Essay 

Ok....let's krak this program :-)
Berikut data yang aku masukan ke dalam Registration Box :
	Register Name : CHuPaCaBRa
	PassCode      : 123456 - 87654321

Sebelum menekan tombol Enter,terlebih dulu kita siapkan BreakPoint yang sesuai. Pasang BreakPoint seperti biasanya, "GetWindowTextA", "GetDlgItemTextA" dan "GetDlgItemInt". Setelah semuanya siap, tekan Enter dan tak berapa lama kemudian kita akan terlempar ke dalam SoftICE, tepat di daalam GetWindowTextA. Tekan F12 satu kali agar keluar dari rutin tersebut dan masuk ke badan program.

:00494A07 FF15E00C5100  Call dword ptr [00510CE0]
:00494A0D 6AFF 		push FFFFFFFF            	==> Kita di Sini
:00494A0F 8B4D10 	mov  ecx, dword ptr [ebp+10]
:00494A12 E86A90FFFF 	call 0048DA81
:00494A17 EB0B 		jmp  00494A24

Setelah melewati Rutin Call di Offset 00494A12 ( Tekan F10 ), cek isi ECX sekarang.

:d ecx
017F:010126FC 	43487550 61436142-52610030 8D0A00A0 	CHuPaCaBRa.0....

Ternyata ECX berisi nama yang kita masukan, pasang BreakPoint di lokasi memory tersebut. ( BPM 017F:010126FC ). Dengan demikian SoftICE akan berak ketika program mengakses Nama kita. Tekan F5 satu kali dan liat hasilnya.

Ternyata SoftICE kembali berak di dalam GetWindowTextA. Tekan F12 dan trace seperti langkah di atas. Setelah kita mengetik D ECX akan tampak keadaan memory seperti di bawah ini :

:d ecx
017F:01012718 	31323334 35360001 - 750A00A0 B4310101 	123456..u....1..

Hmm...ternyata program berikutnya membaca bagian pertama dari s/n yang kita masukan.Pasang lagi BreakPoint di lokasi memory tersebut ( BPM 017F:01012718 ). Ok sekarang tekan lagi F5 satu kali dengan harapan program akan berhenti pada saat sedang mengakses nama kita.

* Reference To: USER32.CharUpperA, Ord:0028h
|
:0048DB19 FF15380C5100  Call dword ptr [00510C38]
:0048DB1F 5E 		pop  esi
:0048DB20 C3 		ret

Fungsi di atas berguna untuk merubah nama kita menjadi Huruf Besar. Tekan F10 terus sampai menemukan listing berikut ini :

:0043222B 8B85D0FEFFFF 	mov  eax, dword ptr [ebp+FFFFFED0] 
:00432231 8B8DCCFEFFFF 	mov  ecx, dword ptr [ebp+FFFFFECC] 
:00432237 50 		push eax
:00432238 51 		push ecx
:00432239 E8C2F9FFFF 	call 00431C00

Sebelum melewati Call di atas, ada baiknya kita periksa dulu register - register yang baru di-push ke dalam stack ( liat offset di atasnya ) karena isi dari register - register itu yang akan berpengaruh di dalam Call tersebut.

Ternyata EAX = '123456' dan ECX = 'CHuPaCaBRa' . Kalo begitu, Call tersebut kemungkinan besar adalah Call yang penting. Untuk itu kita harus masuk ke dalam Call tersebut ( tekan F8 ). Kita akan sampai di sini :

:00431C00 8B542404      mov  edx, dword ptr [esp+04]  ==> EDX = 'CHuPaCaBRa'
:00431C04 81EC00010000  sub  esp, 00000100
:00431C0A B84D28D207    mov  eax, 07D2284D
:00431C0F 90            nop
:00431C10 8D4C2400      lea  ecx, dword ptr [esp]
:00431C14 53            push ebx
:00431C15 56            push esi
:00431C16 8A1A          mov  bl, byte ptr [edx]	 ==> BL = Karakter pertama
						          dari Nama
:00431C18 84DB          test bl, bl		 ==> BL = ' ' ???
:00431C1A 7419          je 00431C35		 ==> Lompat, jika BL = ' '
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431C33(C)
|
:00431C1C 8A1A          mov bl, byte ptr [edx]   ==> BL = Karakter nama
:00431C1E 80FB61        cmp bl, 61		 ==> BL < 61h (= 'a') ?
:00431C21 7C08          jl  00431C2B		 ==> Jika Ya, Lompat !
:00431C23 80FB7A        cmp bl, 7A		 ==> BL > 7Ah (= 'z') ?
:00431C26 7F03          jg  00431C2B		 ==> Jika Ya, Lompat !
:00431C28 80EB20        sub bl, 20               ==> BL = BL - 20h

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00431C21(C), :00431C26(C)
|
:00431C2B 8819          mov  byte ptr [ecx], bl  ==> ECX = BL
:00431C2D 42            inc  edx		 ==> EDX = EDX + 1
:00431C2E 41            inc  ecx		 ==> ECX = ECX + 1
:00431C2F 8A1A          mov  bl, byte ptr [edx]  ==> BL  = Karakter Nama
:00431C31 84DB          test bl, bl		 ==> BL  = 0 ???
:00431C33 75E7          jne 00431C1C             ==> Looping jika BL = 0

Setelah langkah di atas maka semua huruf kecil dari Nama yang kita masukan akan menjadi Huruf Besar.

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431C1A(C)
|
:00431C35 8D742408 	lea  esi, dword ptr [esp+08] ==> ESI = 'CHUPACABRA'
:00431C39 C60100 	mov  byte ptr [ecx], 00
:00431C3C 8A4C2408 	mov  cl, byte ptr [esp+08]   ==> CL = 'C'    
:00431C40 84C9 		test cl, cl        	     ==> Apakah CL = ' '
:00431C42 744E 		je 00431C92

Bagian program di atas bertugas untuk menyeleksi kembali, apakah User sudah memasukan nama, jika belum maka Program tidak perlu men-generate sebuah PassCode. Setelah yakin nama telah tersedia, program akan memulai penciptaan PassCode. Perhatikan listing berikut :

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431C90(C)
|
:00431C44 8A0E 	  	mov cl, byte ptr [esi]	   ;CL = Karakter Nama
:00431C46 80F920 	cmp cl, 20            	   ;CL = 20h (= ' ') ???
:00431C49 743F 		je 00431C8A		   ;Jika Ya, Lompat !
:00431C4B 80F92E 	cmp cl, 2E        	   ;CL = 2Eh (= '.') ???
:00431C4E 743A 		je 00431C8A		   ;Jika Ya, Lompat !
:00431C50 0FBED1 	movsx edx, cl              ;EDX = CL
:00431C53 8BCA 		mov ecx, edx               ;ECX = EDX
:00431C55 8D1CD2 	lea ebx, dword ptr [edx+8*edx] ;EBX = EDX + 8 * EDX
:00431C58 8D1459 	lea edx, dword ptr [ecx+2*ebx] ;EDX = ECX + 2 * EBX
:00431C5B C1E207 	shl edx, 07                ;EDX = SHL 07h kali
:00431C5E 03D1 		add edx, ecx               ;EDX = EDX + ECX
:00431C60 8D1C92 	lea ebx, dword ptr [edx+4*edx] ;EBX = EDX + 4 * EDX
:00431C63 8D14D9 	lea edx, dword ptr [ecx+8*ebx] ;EDX = ECX + 8 * EBX
:00431C66 8BC8 		mov ecx, eax               ;ECX = EAX
:00431C68 C1E105 	shl ecx, 05                ;ECX = SHL 05h kali
:00431C6B 03D1 		add edx, ecx               ;EDX = EDX + ECX
:00431C6D 8BC8 		mov ecx, eax               ;ECX = EAX
:00431C6F C1F807 	sar eax, 07                ;EAX = SAR 7 kali
:00431C72 81E100F80700 	and ecx, 0007F800          ;ECX = ECX and 0007F800h
:00431C78 C1E90B 	shr ecx, 0B                ;ECX = SHR 0Bh kali
:00431C7B C1E010 	shl eax, 10                ;EAX = SHL 10h kali
:00431C7E 33D1 	       	xor edx, ecx               ;EDX = EDX xor ECX
:00431C80 33D0 		xor edx, eax               ;EDX = EDX xor EAX
:00431C82 81E2FFFFFF00 	and edx, 00FFFFFF          ;EDX = EDX and 00FFFFFFh
:00431C88 8BC2 		mov eax, edx               ;EAX = EDX

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00431C49(C), :00431C4E(C)
|
:00431C8A 8A4E01 	mov  cl, byte ptr [esi+01] ;CL = Karakter berikutnya
:00431C8D 46 		inc  esi            	   ;ESI = ESI + 1
:00431C8E 84C9 		test cl, cl            	   ;CL = 0 ???
:00431C90 75B2 		jne 00431C44               ;Jika CL <> 0, Lompat !

Setelah semua karakter selesai di-olah apakah kita telah mendapatkan s/n-nya ??? Belum :-)

Masih ingat dengan '123456', bagian pertama dari s/n yang kita masukan ? Ternyata, selain nama, SuperJPG juga mengolah bagian pertama dari PassCode untuk menciptakan potongan PassCode berikutnya. Langkah - langkahnya sama peris dengan perhitungan di atas.

Perhatikan listing berikut ini :

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431C42(C)
|
:00431C92 8B942410010000 mov edx, dword ptr [esp+00000110] ;EDX = '123456'
:00431C99 8D4C2408 	 lea ecx, dword ptr [esp+08]       ;ECX = 'CHUPACABRA'
:00431C9D 803A00 	 cmp byte ptr [edx], 00    	   ;EDX = ' ' ?
:00431CA0 7419 		 je 00431CBB            	   ;Jika Ya, lompat !
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431CB9(C)
|
:00431CA2 8A1A 		mov  bl, byte ptr [edx]
:00431CA4 80FB61 	cmp  bl, 61
:00431CA7 7C08 		jl 00431CB1
:00431CA9 80FB7A 	cmp  bl, 7A
:00431CAC 7F03 		jg 00431CB1
:00431CAE 80EB20 	sub  bl, 20

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00431CA7(C), :00431CAC(C)
|
:00431CB1 8819 		mov  byte ptr [ecx], bl
:00431CB3 42 		inc  edx
:00431CB4 41 		inc  ecx
:00431CB5 8A1A 		mov  bl, byte ptr [edx]
:00431CB7 84DB 		test bl, bl
:00431CB9 75E7 		jne 00431CA2
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431CA0(C)
|
:00431CBB 8D742408      lea esi, dword ptr [esp+08] ==> ESI = '123456'
:00431CBF C60100        mov byte ptr [ecx], 00
:00431CC2 8A4C2408      mov cl, byte ptr [esp+08]
:00431CC6 84C9          test cl, cl
:00431CC8 7449          je 00431D13

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431D11(C)
|
:00431CCA 8A0E          mov cl, byte ptr [esi]
:00431CCC 80F920        cmp cl, 20
:00431CCF 743A          je 00431D0B
:00431CD1 0FBED1        movsx edx, cl
:00431CD4 8BCA          mov ecx, edx
:00431CD6 8D1CD2        lea ebx, dword ptr [edx+8*edx]
:00431CD9 8D1459        lea edx, dword ptr [ecx+2*ebx]
:00431CDC C1E207        shl edx, 07
:00431CDF 03D1          add edx, ecx
:00431CE1 8D1C92        lea ebx, dword ptr [edx+4*edx]
:00431CE4 8D14D9        lea edx, dword ptr [ecx+8*ebx]
:00431CE7 8BC8          mov ecx, eax
:00431CE9 C1E105        shl ecx, 05
:00431CEC 03D1          add edx, ecx
:00431CEE 8BC8          mov ecx, eax
:00431CF0 C1F807        sar eax, 07
:00431CF3 81E100F80700  and ecx, 0007F800
:00431CF9 C1E90B        shr ecx, 0B
:00431CFC C1E010        shl eax, 10
:00431CFF 33D1          xor edx, ecx
:00431D01 33D0          xor edx, eax
:00431D03 81E2FFFFFF00  and edx, 00FFFFFF
:00431D09 8BC2          mov eax, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431CCF(C)
|
:00431D0B 8A4E01        mov cl, byte ptr [esi+01]
:00431D0E 46            inc esi
:00431D0F 84C9          test cl, cl
:00431D11 75B7          jne 00431CCA
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431CC8(C)
|
:00431D13 0D0000A000 	or eax, 00A00000     	==> EAX = EAX or 00A00000h
:00431D18 5E 		pop esi
:00431D19 5B 		pop ebx
:00431D1A 81C400010000  add esp, 00000100
:00431D20 C3 		ret

Setekah melakukan perhtiunga di atas, kita akan kembali ke Offset 0043223E  dan kemudian program akan membandingkan bagian kedua PassCode yang kita masukan dengan PassCode yang telah diciptakan program.

:00432239 E8C2F9FFFF 	call 00431C00
:0043223E 83C408 	add esp, 00000008    		  ==> Kita di sini.
:00432241 8B8DC8FEFFFF  mov ecx, dword ptr [ebp+FFFFFEC8] 
:00432247 3BC1 		cmp eax, ecx			  ==> Important Cmp
:00432249 0F85BE000000  jne 0043230D

Perhatikan Offset 00432247, di baris itu register EAX dan register ECX dibandingkan. Apa isi register itu ??? Kita akan melihatnya, seperti biasa, aku ketik D ECX, ternyata hasilnya tidak seperti ketika kita menggunakan perintah "D" ini di awal tutorial :

:d ecx
017F:05397FB1 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? 

Hmm......coba pakai perintah "?"

:? ecx
05397FB1 0087654321  "9&127;±" ==> ECX = 87654321
:? eax
00B84EBF 0012078783  "¸N¿"      ==> EAX = 12078783

Hehehe.....jelas sekarang PassCode apa yang harus aku masukan. Aku ulangi proses Registrasi, kali ini dengan memasukan PassCode yang benar :

     	Register Name : CHuPaCaBRa
	PassCode      : 123456 - 12078783
Hasilnya....Kraked :-)

K e y G e n Z 

Now It's time for fun ! The KeyGenZ Routine by flag eRRatum :
#include<stdio.h>
#include<conio.h>
#include<string.h>
main()
{
int i ;
char user[25],number[6] ;
unsigned long ecx=0,edx=0,eax=0x7d2284d,ebx=0 ;
clrscr() ;
printf("KeyGenerator SuperJPG 3.x by flag eRRatum\n") ;
printf("Visit our Page at http:\\\\all.at\\ekh\n") ;
printf("Please Enter Your UserName : ") ;
gets(user) ;
strupr(user) ;
printf("Please Enter 6 digit of number you like : ") ;
gets(number) ;
for (i=0;i<strlen(user);i++)
if (user[i]!=0x20 && user[i]!=0x2e)
{
edx=user[i] ; ecx=edx ;
ebx=9*edx ; edx=ecx+2*ebx ;
edx<<=7 ; edx+=ecx ;
ebx=5*edx ; edx=ecx+8*ebx ;
ecx=eax ; ecx<<=5 ;
edx+=ecx ; ecx=eax ;
eax>>=7 ; ecx&=0x7f800 ;
ecx>>=0xb ; eax<<=0x10 ;
edx^=ecx ; edx^=eax ;
edx&=0x00FFFFFF ; eax=edx ;
}
printf("This is your Passcode : %s-",number) ;
for (i=0;i<strlen(number);i++)
if (number[i]!=32)
{
ecx=number[i] ; edx=ecx ;
ebx=9*edx ; edx=2*ebx+ecx ;
edx<<=7 ; edx+=ecx ;
ebx=5*edx ; edx=8*ebx+ecx ;
ecx=eax ; ecx<<=5 ;
edx+=ecx ; ecx=eax ;
eax>>=7 ; ecx&=0x7f800 ;
ecx>>=0xb ; eax<<=0x10 ;
edx^=ecx ; edx^=eax ;
edx&=0xffffff ; eax=edx ;
}
eax|=0x00A00000 ;
printf("%lu\n",eax) ;
textcolor(LIGHTRED) ;
cprintf("Please Visit our page for more cracks.") ;
return (0) ;
}

Catatan Singkat 

.Well....that's it :-) Ngak terlalu sulit khan ???

Jenis "Key Generating" seperti yang ada digunakan SuperJPG ini yang sangat cucok untuk dibuat KeyGenZ-nya, karena  walaupun sedikit panjang tapi ngakt terlalu rumit. IMHO, SuperJPG lumayan bagus buat dijadiin latihan membuat KeyGenZ.

Kalo ada yang masih bingung mengenai tutorial ini, bisa langsung bertanya ke ekhmail@egroups.com ato ke Forum yang udah disediain di eKH's HomePage ( http://all.at/ekh )

C' U in another Tutorial :-)

GreetZ 

GreetZ untuk eKH's en SPX's member.

<*~ MTFBWY ~*>

 

Copyright 021999 - CHuPaCaBRa [eKH]