Februari 1999 |
"SuperJPG 3.x" ( KeyGenZ ) |
Win '95 PROGRAM Win Code Reversing |
|
oleh flag eRRatum & CHuPaCaBRa |
|
|
[eKH] |
|
Program Target SuperJPG 3.x |
||
Tools Used: SoftICE 3.24 ( Kraking ) |
||
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]