Disclaimer
For Educational Purpose Only. Penulis tidak bertangungjawab atas penggunaan ataupun penyalahgunaan tutorial ini. Use at your own risk.
Latar Belakang
Tutorial ini dibuat karena kebetulan penulis tidak menggunakan OS Proprietary, dan beberapa saat yang lalu harus melakukan reversing terhadap sebuah aplikasi sehingga mau tidak mau, reversing tersebut dilakukan menggunakan GNU/Linux.
Target
PDF Camp (http://www.verypdf.com/)
Tools
- UPX (http://upx.sf.net/)
- IDA Pro versi Linux (http://www.hex-rays/idapro/)
- Setjangkir kopi pahit (*optional bikin sendiri)
Langkah-langkah
- Install pdf camp di komputer yang menggunakan Windows(R)
- Browse ke direktori tempat aplikasinya ter-install misalnya “\Program Files\verypdf\pdfcamp”
- Cari sub direktori pada direktori instalasi tersebut yang namanya “drivers”
- Pada direktori drivers, terdapat file bernama “pdfui.dll”. nah, file tersebut yang akan kita reverse karena di dalamnya berisi intan dan permata…weleh maksudnya di dalam file tersebut terdapat fungsi registrasi :D
- Ok, sekarang kita akan mereverse “pdfui.dll” di GNU/Linux, jadi langkah berikut dilakukan di GNU/Linux.
- File “pdfui.dll” dikompres menggunakan UPX, jadi kita terlebih dahulu harus melakukan dekompresi dengan perintah:
upx -d pdfui.dll

- Setelah dekompresi selesai, maka kita akan me-load “pdfui.dll” ke IDA Pro untuk selanjutnya di-disassembly. Untuk itu, gunakan perintah:
idal pdfui.dll

- Selanjutnya perhatikan jendela disassembly IDA Pro. Kita akan berada pada entry point “pdfui.dll”. Scroll sedikit ke bawah, hingga menemukan string yang akan ditampilkan pada messagebox jika registrasi berhasil. String tersebut adalah:
“Thank you selected our products.”

- String yang kita cari berada pada offset 0x902062EB. Selanjutnya kita scroll ke atas lagi untuk mencari fungsi yang menghitung serial serta BAD jump yang akan menampilkan messagebox jika registrasi gagal.
- Pada offset 0×90206268 kita bisa melihat BAD jump yang akan menampilkan message box jika registrasi gagal.

- Nah, ini dia messagebox yang akan ditampilkan jika registrasi gagal

- Ok, sekarang kita kembali ke BAD jump yang tadi. Di atas BAD jump tersebut ada CALL ke fungsi pengecekan pertama.

- Tekan enter untuk mengikuti arah instruksi CALL tersebut, maka kita akan sampai pada pengecekan pertama. Fungsi pengecekan ini akan memeriksa jumlah karakter pada serial yang kita masukkan. Serial yang valid adalah jika jumlah karakternya lebih dari 13 karakter.

- Setelah pengecekan berhasil (jumlah karakter pada serial lebih dari 13 karakter) maka kita akan dibawa ke fungsi pengecekan serial selanjutnya yaitu dengan adanya instruksi CALL ke offset 0×90208530

- Nah pada offset tersebut terdapat fungsi / subrutin berikut ini ( lengkap dengan penjelasan yang asal-asalan :p ) :
; ; +--------------------------------------------------------------+ ; | This file is generated by The Interactive Disassembler (IDA) | ; | Copyright (c) 2004 by DataRescue sa/nv, | ; +--------------------------------------------------------------+ ; --------------- S U B R O U T I N E --------------------------------------- sub_90208530 proc near ; CODE XREF: sub_902085C0+21^p var_18 = dword ptr -18h ; buffer lokal var_C = dword ptr -0Ch ; buffer lokal arg_0 = dword ptr 4 ; parameter 1 (serial) sub esp, 18h ; alokasi buffer lokal push esi ; simpan esi mov esi, [esp+1Ch+arg_0] ; esi = parameter 1 lea edx, [esp+1Ch+var_18] ; edx = buffer lokal push edi ; simpan edi mov al, [esi] ; al = serial[0] ? mov cl, [esi+1] ; cl = serial[1] ? mov byte ptr [esp+20h+var_C], al ; simpan serial[0] xor al, al ; kosongkan al push edx ; edx = parameter untuk atoi mov byte ptr [esp+24h+var_C+1], al ; isi buffer lokal dengan al mov byte ptr [esp+24h+var_18], cl ; isi buffer lokal dengan cl mov byte ptr [esp+24h+var_18+1], al ; isi buffer lokal dengan al call atoi ; ubah edx menjadi integer/bilangan mov edi, eax ; edi = serial[1] lea eax, [esp+24h+var_C] ; eax = serial[0] push eax ; eax = parameter untuk atoi call atoi ; ubah eax menjadi integer/bilangan add edi, eax ; edi = serial[1] + serial[0] add esp, 8 ; seimbangkan stack cmp edi, 8 ; serial[0] + serial[1] = 8 jz short loc_9020857A ; jika benar, *LANJUTKAN* pop edi ; kembalikan edi xor eax, eax ; eax = 0 *SERIAL SALAH* pop esi ; kembalikan esi add esp, 18h ; seimbangkan stack retn 4 ; keluar dari fungsi ; --------------------------------------------------------------------------- loc_9020857A: ; CODE XREF: sub_90208530+3E^j cmp byte ptr [esi+2], 56h ; serial[2] = 56h = ASCII("V") jz short loc_9020858A ; jika benar, *LANJUTKAN* pop edi ; kembalikan edi xor eax, eax ; eax = 0 *SERIAL SALAH* pop esi ; kembalikan esi add esp, 18h ; seimbangkan stack retn 4 ; keluar dari fungsi ; --------------------------------------------------------------------------- loc_9020858A: ; CODE XREF: sub_90208530+4E^j cmp byte ptr [esi+3], 32h ; serial[3] = 32h = ASCII("2") jz short loc_9020859A ; jika benar, *LANJUTKAN* pop edi ; kembalikan edi xor eax, eax ; eax = 0 *SERIAL SALAH* pop esi ; kembalikan esi add esp, 18h ; seimbangkan stack retn 4 ; keluar dari fungsi loc_9020859A: ; CODE XREF: sub_90208530+5E^j cmp byte ptr [esi+5], 31h ; serial[5] = 31h = ASCII("1") jz short loc_902085AA ; jika benar, *LANJUTKAN* pop edi ; kembalikan edi xor eax, eax ; eax = 0 *SERIAL SALAH* pop esi ; kembalikan esi add esp, 18h ; seimbangkan stack retn 4 ; keluar dari fungsi ; --------------------------------------------------------------------------- loc_902085AA: ; CODE XREF: sub_90208530+6E^j mov cl, [esi+0Fh] ; cl = serial[0x0F] xor eax, eax ; eax = 0 cmp cl, 38h ; serial[0x0F] = 38h = ASCII("8") pop edi ; kembalikan edi setz al ; set al=1 jika serial benar pop esi ; kembalikan esi add esp, 18h ; seimbangkan stack retn 4 ; keluar dari fungsi sub_90208530 endp ; --------------------------------------------------------------------------- - Bagi yang tidak hafal ASCII hexcode, bisa menggunakan python untuk mencari tahu karakter yang ada pada perhitungan tersebut.

- Ok, jadi sampai di sini kita bisa mengambil kesimpulan bahwa:
- jumlah karakter pada serial adalah 16 karakter
- angka pada karakter pertama dan kedua jika dijumlahkan nilainya 8
- karakter ke-3 pada serial adalah huruf “V”
- karakter ke-4 pada serial adalah angka “2″
- karakter ke-6 pada serial adalah angka “1″
- karakter ke-16 (terakhir) pada serial adalah angka “8″
- contoh serial yang valid adalah: 62V2x1xxxxxxxxx8
- Sekian tutorial kali ini, mohon dikoreksi jika ada kesalahan khususnya pada keterangan kode disassembly. Dan maaf jika tutorial kali ini cukup membingungkan karena memang tutorial ini bukan ditujukan untuk pemula
Ucapan Terima Kasih
- Tuhan Yang Maha Esa
- NitrouZ, dylavig, 4NV|E, movzx, lucuBRB, orakanggo, pinczakko, hddstudio, segenap crew SBKJ dan InRev, serta semuanya yang tidak sempat saya sebutkan satu persatu, dan juga Anda yang telah membaca tutorial sederhana ini :)>-




muaknyus oom!
:D tambah lagi dooong.. :D
keren nih :)>- :D tks
wew,, gw mah biasa maen lompat2an JE, JNE, JZ, JMP, dll aja,, ga sampe dapet gitu :D
Loh, IDA kan gak gratis. Hahaha, ngebajak sawah yaaaa? Gapapa, untuk belajar sih.
Btw, punya tutorial untuk assembly x64 gak? Kalo punya ebook atau tutorial mengenai bahasa assembly x64 bagi2 dunkz. Thanks!
#1: terima kasih ^:)^ nanti saya usahakan buat tutorial reversing lagi jika ada waktu luang :)
#2: thanks bro dylavig :D wah, ditunggu tutorial dari bro juga :)
#3: kalau menurut teman saya dulu, membuat key generator adalah langkah terbaik jika dibandingkan dengan hard patching.
#4: iya Om :”> IDA nya tidak gratis. maafkan saya, soalnya hanya itu yang bisa saya gunakan dalam tempo yang sesingkat-singkatnya. kebetulan saya belum punya tutorial untuk x86_64 … nanti kalau ada akan saya share :) terima kasih ^:)^
kya… keren om ndru :genit:
baru baca :genit:
nambah ilmu lagi nih,..,., manstab.,., :D