Applet Headline Factory 4.00 |
W32Dasm 8.93 |
oleh
CHuPaCaBRa
Pengenalan Program |
Applet Headline Factory adalah program untuk pembuatan Java Applet.
Program ini memberi kesempatan pada User untuk memasukan Username dan Password melalui menu Help - Registration Information. Dengan Username dan Password tersebut, User dapat menggunakan semua fungsi dari Applet Headline Factory ini.
Sedikit berbeda dengan tutorial - tutorial-ku sebelumnya, untuk program ini, aku akan menggunakan W32Dasm 8.93 dan mengKraknya secara "Dead Listing"
Essay |
Sebelum melakukan apa - apa, coba masukan Username dan Password pada tempat yang telah disediakan dan perhatikan apa reaksi program selanjutnya. Ternyata jika kita memasukan Usernama dan Password yang tidak tepat, program akan menampilkan sebuah MessageBox dengan tulisan "Incorrect username and password".
Sekarang, setelah mengetahui rekasi program di atas, dissasembly file Applet Headline Factory.Exe dengan menggunakan W32Dasm. Setelah selesai, jangan lupa untuk mensave hasilnya terlebih dahulu sebelum menggunakannya. Proses dissasembly tadi akan menghasilkan 2 buah file dengan ukuran total 13.8 MB.
Oke, kita lanjutkan.......masih ingat pesan yang muncul setelah kita melakukan kesalahan memasukan Usernama dan Password tadi ??? Buka window String Data References ( menu : Refs - String Data References ), sebuah window baru akan muncul dengan sederetan string - string yang ada pada program tersebut. Tugas kamu selanjutnya adalah mencari String "Incorrect username and password" tadi di antara deretan String - string tersebut.
"ImmGetContext" "ImmGetConversionStatus" "ImmIsIME" "ImmNotifyIME" "ImmReleaseContext" "ImmSetCompositionFontA" "ImmSetCompositionWindow" "ImmSetConversionStatus" "ImmSetOpenStatus" "Incorrect username and password." "InitCommonControlsEx" "InitializeFlatSB" "Internet Explorer " "IsControl" "j_j" "jpeg" "jpg"
Klik 2 kali pada string tersebut dan kamu akan "dibawa" menuju baris - baris perintah yang bertugas untuk menampilkan tulisan tersebut.
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:0048E284(C), :0048E2AC(C) | * Possible StringData Ref from Code Obj ->"Incorrect username and password." | :0048E33A B83CE44800 mov eax, 0048E43C :0048E33F E84856FCFF call 0045398C
Perhatikan Offset yang aku beri warna merah, di atas. Maksud dari potongan program ini adalah, baris - baris perintah yang menampilkan string "Incorrect....." tersebut dijalankan setelah melalui 2 buah Unconditional Jump yang ada di Offset 0048E284 dan 0048E2AC. Kalo begitu, kita harus tahu kenapa perintah Unconditional Jump di kedua atau salah satu Offset tersebut "memutuskan" untuk menampilkan string itu.
Gunakan fungsi W32Dasm untuk melompat ke Offset tertentu dengan memilih menu Goto - Goto Code Location, masukan lokasi Offset yang menjadi tujuan kita, untuk pertama kali, aku memasukan Offset 0048E284.
* Possible StringData Ref from Code Obj ->"h9ea7" | :0048E278 BA68E34800 mov edx, 0048E368 ;EDX = "h9ea7" :0048E27D E812ABF7FF call 00408D94 :0048E282 85C0 test eax, eax :0048E284 0F85B0000000 jne 0048E33A
Terlihat bahwa, program akan menampilkan string MessageBox jika Test EAX dinyatakan gagal. Hasil dari EAX itu sendiri, berasal dari Rutin Call di atasnya. Sebagai newbie, aku langsung pengen masuk ke dalam Rutin Call tersebut, tetapi tunggu dulu......perhatikan StringData yang ada di atas Rutin Call tersebut....."h9ea7". StringData apa lagi ini ??? Aku langsung bisa menebak apa yang harus User inputkan, pasti "h9ea7". Tapi untuk lebih yakin, aku akan memeriksa isi Rutin Call yang ada di bawahnya :
* Referenced by a CALL at Addresses: |:0048E27D , :0048E2A5 | :00408D94 57 push edi :00408D95 56 push esi :00408D96 89D7 mov edi, edx ;EDI = EDX ( EDX = "h9ea7" ) :00408D98 89C6 mov esi, eax ;ESI = EAX :00408D9A B9FFFFFFFF mov ecx, FFFFFFFF :00408D9F 31C0 xor eax, eax :00408DA1 F2 repnz :00408DA2 AE scasb :00408DA3 F7D1 not ecx :00408DA5 89D7 mov edi, edx ;EDI = EDX :00408DA7 31D2 xor edx, edx * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00408DCF(C) | :00408DA9 F3 repz :00408DAA A6 cmpsb ;Penting !!! :00408DAB 7424 je 00408DD1 :00408DAD 8A46FF mov al, byte ptr [esi-01] :00408DB0 80F861 cmp al, 61 ;AL lebih kecil dari 61h ( = a ) ??? :00408DB3 7208 jb 00408DBD :00408DB5 80F87A cmp al, 7A ;AL lebih besar dari 7Ah ( = z ) ??? :00408DB8 7703 ja 00408DBD :00408DBA 80E820 sub al, 20 ;AL = AL - 20h * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00408DB3(C), :00408DB8(C) | :00408DBD 8A57FF mov dl, byte ptr [edi-01] :00408DC0 80FA61 cmp dl, 61 ;DL lebih kecil dari 61h ( = a ) ??? :00408DC3 7208 jb 00408DCD :00408DC5 80FA7A cmp dl, 7A ;DL lebih besar dari 7Ah ( = z ) ??? :00408DC8 7703 ja 00408DCD :00408DCA 80EA20 sub dl, 20 ;DL = DL - 20h * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00408DC3(C), :00408DC8(C) | :00408DCD 29D0 sub eax, edx ;EAX = EAX - EDX :00408DCF 74D8 je 00408DA9 ;Jika EAX = 0, lompat ke 00408DA9 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00408DAB(C) | :00408DD1 5E pop esi :00408DD2 5F pop edi :00408DD3 C3 ret
Perhatikan baris yang aku beri tanda "Penting !!!", perintah CMPSB itulah yang memberi petunjuk penting. Perintah CMPSB adalah perintah untuk membandingkan 2 buah string, byte-per-byte. String mana yang dibandingkan ??? String yang dibandingkan pada perintah CMPSB ini adalah string yang tersimpan di dalam Register EDI dan ESI.
Seperti yang telah kita ketahui sebelumnya, EDX menyimpan string "h9ea7" ( liat Offset 0048E278 ). Pada Offset 00408D96, Register EDI diisi dengan string yang terdapat pada register EDX, ini berarti EDI sekarang menampung "h9ea7". Lalu apa yang ada di ESI ??? ESI menyimpan nilai yang sama dengan yang ada di EAX, karena aku sekarang menggunakan W32Dasm, aku tak bisa tau pasti apa yang ada di dalam ESI ato EAX tapi secara logika, tentunya ESI dan EAX menyimpan salah satu String ( nama ato password ) yang kita masukan dan dengan sedikit "meraba-raba", aku kira yang ada di dalam ESI adalah Username yang diinputkan oleh User.
Pada saat perintah CMPSB dijalankan, kedua string yang ada di dalam EDI dan ESI akan dibandingkan, jika keduanya sama, maka username tersebut langsung dianggap valid. Tapi bagaimana dengan password-nya ???
Setelah kembali ke Rutin Call pemanggilnya, kamu bisa meliat perintah - perintah selanjutnya :
:0048E28A 8D55FC lea edx, dword ptr [ebp-04] :0048E28D 8B8318030000 mov eax, dword ptr [ebx+00000318] :0048E293 E89034FAFF call 00431728 :0048E298 8B45FC mov eax, dword ptr [ebp-04] :0048E29B E8D05CF7FF call 00403F70 * Possible StringData Ref from Code Obj ->"to78r" | :0048E2A0 BA70E34800 mov edx, 0048E370 :0048E2A5 E8EAAAF7FF call 00408D94 :0048E2AA 85C0 test eax, eax * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0048E245(C) | :0048E2AC 0F8588000000 jne 0048E33A
Pada Offset 0048E2A0 terdapat StringData lain, sekarang adalah "to78r". Rutin Call di bawahnya adalah Rutin Call yang sama dengan yang telah kita liat tadi, karena itu aku ngak perlu lagi meneliti lebih dalam ke Rutin Call tersebut. Aku langsung bisa menduga bahwa Password yang harus kita masukan adalah "to78r".
K R A K |
Username : h9ea7
Password : to78r
Catatan |
Ini adalah sistem proteksi yang sangat lemah, dengan mudah kita bisa mengKrak-nya. Sistem Proteksi seperti ini disebut Hardcoded yaitu sebuah Sistem Proteksi yang hanya memakai satu s/n atau kode tertentu yang dimasukan ke dalam programnya, untuk digunakan oleh semua user.
© Juni1999