Tutorial Cracking : SuperJPG v3.x
|
Target : SuperJPG v3.x
Tool : SoftIce v4.05
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 :-)
|