Dasar – Dasar
Assembly
oleh
CHuPaCaBRa
Dalam mempelajari berbagai teknik – teknik Kraking yang
ada, seorang Kraker – baik newbie maupun master – tak akan terlepas dari
Assembly. Bahasa permrograman ini merupakan dasar yang penting bagi seseorang
untuk dapat mengKrak suatu program. Walaupun begitu, tidak semua hal yang ada di
dalam bahasa Assembly ini yang harus diketahui, bagi seorang newbie cukup dengan
dapat mengerti dasar – dasar Assembly serta logika yang baik sudah dapt mengKrak
program – program dengan Sistem Proteksi yang sederhana.
Di dalam tutorial ini, aku akan membahas beberapa
perintah penting yang merupakan dasar – dasar Assembly, perintah – perintah ini
akan sering ditemui ketika kamu mencoba mengKrak suatu program. Sebelum kita
melangkah lebih jauh ke bahasa Assembly, mungkin ada baiknya kalo aku
menjelaskan sedikit mengenai Register ( buat yang udah tau, bisa kamu lewati
).
Apa itu Register ? Register adalah sebagian tempat di
memory mikroprosesor yang dapat diakses dengan cepat. Di dalam register ini
disimpan nilai – nilai yang bagi kita para Kraker sangat penting untuk
diperhatikan.
Bagaimana melihat isi Register ? Dengan memakai SoftICE,
kamu dapat melihat berbagai perubahan yang terjadi dengan isi Register. Untuk
itu kamu perlu meng-aktif-kan “Register Window” yang ada di SoftICE dengan
mengetikkan perintah WR di dalam lingkungan SoftICE. Di “Register Window” akan
terlihat berbagai register beserta isinya. Register yang penting untuk
diperhatikan dalam Kraking adalah Register EAX, EBX, ECX, EDX, ESI, EDI, EBP,
ESP dam EIP.
EAX, EBX, ECX dan EDX disebut “General Purpose Register”.
Register ini merupakan Register 32-bit, jika kamu mengKrak program 16-bit maka
Register yang terlibat adalah AX, BX, CX dan DX. Register ini dapat dipecah -
pecah, seperti gambaran di bawah ini :
misalnya isi EAX adalah 00001234, maka
EAX = 00 00 12 34 ==> 32 bit
AX = 12 34 ==> 16 bit
AH = 12 ==> 8 bit
AL = 34 ==> 8 bit
Terlihat bahwa AX terdiri dari AH dan AL, H menunjukkan
High ( di bagian Kiri ) dan L berarti Low ( di bagian Kanan ).
ESI dan EDI adalah “Index Register”. Register ini
digunakan sebagai penunjuk terhadap suatu lokasi di memory dan biasanya
digunakan untuk operasi – operasi String.
EBP dan ESP adalah “Pointer Register”. Kedua Register ini
berpasangan dengan Register SS. Apabila ESP ( Stack Pointer ) berpasangan dengan
Register SS ( ESP : SS ) maka digunakan untuk menunjuk alamat pada Stack
sementara EBP ( Base Pointer ) akan berpasangan dengan Register SS ( EBP : SS )
untuk menunjuk pada alamat memory tempat data.
EIP adalah “Index Pointer Register” yang berpasangan
dengan CS ( CS : EIP ) untuk menunjuk pada alamat memory tempat perintah
selanjutnya yang akan di eksekusi.
Oke setelah penjelasan singkat mengenai Register di atas,
kita lanjutkan dengan penjelasan mengenai perintah – perintah dasar Assembly.
Perintah – perintah di bawah ini, disusun secara Alphabetical Order……
1. ADD ( ADD Binary Number
)
| Format | ADD Operand1, Operand2 |
| Fungsi | Menambahkan Operand1 dengan Operand2, hasilnya akan disimpan di dalam Operand1 |
| Kalimat Matematika | Operand1 = Operand1 + Operand2 |
| Contoh | MOV EAX, 00000001h ; Lihat perintah MOV ADD EAX, |
2. AND ( Logical AND )
| Format | AND Operand1, Operand2 |
| Fungsi | Melakukan Operasi Logika AND pada Operand1 dan Operand2, hasilnya akan disimpan di Operand1 |
| Kalimat Matematika | Operand1 = Operand1 AND Operand2 |
| Contoh | MOV EAX, 00001111b ; Lihat perintah MOV AND EAX, 11110000b ; |
3. CALL ( CALL A Procedure
)
| Format | CALL LokasiProcedure |
| Fungsi | Memanggil sebuah Procedure. |
| Kalimat Matematika | - |
| Contoh | CALL 12345678 ; Memanggil Procedure yang berada pada Offset 12345678 |
4. CDQ ( Convert Doubleword To Quadword
)
| Format | CDQ |
| Fungsi | Merubah nilai 32-bit dalam EAX menjadi 64-bit dalam EDX : EAX dengan cara mengosongkan isi EDX |
| Kalimat Matematika | - |
| Contoh | MOV EAX, 12345678h ; EAX = 12345678h CDQ |
5. CMP ( Compare )
| Format | CMP Operand1, Operand2 |
| Fungsi | Membandingkan Operand1 dengan Operand2, setelah perintah ini, biasanya akan diikuti dengan sebuah Condtional Jump yang akan menentukan jalur program berikutnya. |
| Kalimat Matematika | - |
| Contoh | MOV ECX, 0Ah ; EAX = 0Ah MOV EAX, 0Bh CMP EAX, ECX JE 12345678 |
6. DEC ( Decrement )
| Format | DEC Operand |
| Fungsi | Mengurangi nilai Operand dengan 1 |
| Kalimat Matematika | Operand1 = Operand1 – 1 |
| Contoh | MOV EAX, 0Ah ; EAX = 0000000Ah DEC EAX |
7. DIV ( Unsigned Division
)
| Format | DIV Operand |
| Fungsi | Membagi nilai yang ada di Register EAX dengan Operand2 |
| Kalimat Matematika | EAX = EAX DIV Operand |
| Contoh | MOV EAX, 0Ah ; EAX = 0000000Ah MOV EBX, 05h DIV EBX |
8. IDIV ( Signed – Integer -
Division )
| Format | IDIV Operand |
| Fungsi | Membagi nilai yang ada di Register EDX : EAX dengan Operand2, hasilnya akan disimpan di EAX sedang sisanya disimpan di EDX |
| Kalimat Matematika | EDX : EAX = EDX : EAX IDIV Operand |
| Contoh | MOV EDX, 00h ; EDX = 00000000h MOV EAX, 0Fh MOV EBX, 05h IDIV EBX |
9. IMUL ( Signed – Integer – Multiplication
)
| Format | IMUL Operand |
| Fungsi | Pada program 32 bit, IMUL ini digunakan untuk mengalikan antara nilai yang tersimpan di dalam Register EDX : EAX dengan Operand. Hasilnya akan disimpan di dalam EAX |
| Kalimat Matematika | EAX = EDX : EAX IMUL Operand |
| Contoh | MOV EDX, 00h ; EDX = 00000000h MOV EAX, 05h MOV EBX, 0Ah IMUL EBX |
10. Conditional Jump
Conditional Jump adalah perintah dalam Assembler yang
digunakan untuk menentukan alur program berikutnya. Conditional Jump ini
sebelumnya didahului oleh perintah CMP ( perhatikan contoh di penjelasan no.
5).
Ada berbagai macam Conditional Jump, di sini aku hanya
membahas beberapa Conditional Jump yang sering aku temui ketika mengKrak, untuk
perintah – perintah Conditional Jump lainnya, bisa kamu perdalam lagi di buku -
buku yang membahas Assembly. Untuk semua penjelasan Conditional Jump di bawah
ini, aku akan pake beberapa perintah yang ada sebelum perintah Conditional Jump
tersebut dieksekusi.
MOV EAX, 01h
; EAX =
00000001h
MOV EBX, 02h
; EBX =
00000002h
CMP EAX,
EBX ; Membandingkan
antara EAX dengan EBX
Format Conditional Jump | Fungsi |
| JA LokasiTujuan ( Jump If Above ) | Lompat ke LokasiTujuan jika EAX lebih besar dari EBX |
| JAE LokasiTujuan ( Jump If Above or Equal ) | Lompat ke LokasiTujuan jika EAX lebih besar atau sama dengan EBX |
| JNA LokasiTujuan ( Jump If Not Above ) | Lompat ke LokasiTujuan jika EAX tidak lebih besar dari EBX |
| JNAE LokasiTujuan ( Jump If Not Above or Equal ) | Lompat ke LokasiTujuan jika EAX tidak lebih besar atau sama dengan EBX |
| JB LokasiTujuan ( Jump If Below ) | Lompat ke LokasiTujuan jika EAX lebih kecil dari EBX |
| JBE LokasiTujuan ( Jump If Below or Equal ) | Fungsinya sama dengan perintah JNA |
| JNB LokasiTujuan ( Jump If Not Below ) | Fungsinya sama dengan perintah JAE |
| JNBE LokasiTujuan ( Jump If Not Below or Equal ) | Fungsinya sama dengan perintah JA |
| JE LokasiTujuan ( Jump If Equal ) | Lompat ke LokasiTujuan jika EAX sama dengan EBX |
| JNE LokasiTujuan ( Jump If Not Equal ) | Lompat ke LokasiTujuan jika EAX tidak sama dengan EBX |
| JG LokasiTujuan ( Jump If Greater ) | Lompat ke LokasiTujuan jika EAX lebih besar dari EBX |
| JGE LokasiTujuan ( Jump If Greater or Equal ) | Lompat ke LokasiTujuan jika EAX lebih besar atau sama dengan EBX |
| JNG LokasiTujuan ( Jump If Not Greater ) | Lompat ke LokasiTujuan jika EAX tidak lebih besar dari EBX |
| JNGE LokasiTujuan ( Jump If Not Greater or Equal ) | Lompat ke LokasiTujuan jika EAX tidak lebih besar atau sama dengan EBX |
| JL LokasiTujuan ( Jump If Less Than ) | Fungsinya sama dengan perintah JNGE |
| JLE LokasiTujuan ( Jump If Less or Equal ) | Fungsinya sama dengan perintah JNG |
| JNL LokasiTujuan ( Jump If Not Less Than ) | Fungsinya sama dengan perintah JGE |
| JNLE LokasiTujuan ( Jump If Not Less or Equal ) | Fungsinya sama dengan perintah JG |
| JZ LokasiTujuan ( Jump If Zero ) | Fungsinya sama dengan JE |
| JNZ LokasiTujuan ( Jump If Not Zero ) | Fungsinya sama dengan JNE |
11. JMP LokasiTujuan (
Unconditional Jump )
| Format | JMP LokasiTujuan |
| Fungsi | Perintah JMP ini berbeda dengan perintah – perintah Conditional Jump karena ia tidak memerlukan hasil perbandingan sebelum perintah ini dieksekusi. |
| Kalimat Matematika | - |
| Contoh | JMP 12345678 ; Lompat ke Offset 12345678 |
12. LEA ( Load Effective Address
)
| Format | LEA Operand1, LokasiMemory |
| Fungsi | Untuk mengambil Offset dari LokasiMemory dan menyimpannya di dalam Operand1 |
| Kalimat Matematika | - |
| Contoh | LEA EAX, |
13. MOV ( Move Data )
| Format | MOV Operand1, Operand2 |
| Fungsi | Menyalin isi dari Operand2 kedalam Operand1 |
| Kalimat Matematika | Operand1 = Operand2 |
| Contoh | MOV EAX, 0Ah ; EAX = 0000000Ah |
14. MUL ( Multiplication
)
| Format | MUL Operand |
| Fungsi | Mengalikan isi EAX dengan Operand, hasilnya akan disimapn di dalam EDX : EAX |
| Kalimat Matematika | EDX : EAX = EAX * Operand |
| Contoh | MOV EAX, 0Ah ; EAX = 0000000Ah MUL EAX, 05h |
15. NOP ( No Operation
)
| Format | NOP |
| Fungsi | Seperti namanya, NOP tidak melakukan Operasi apa – apa, walaupun begitu perintah ini memiliki peran yang cukup penting dalam Kraking. Seperti yang diketahui, salah satu teknik mengKrak sebuah Sistem Proteksi adalah Patching, dalam Patching ini, Kraker harus merubah perintah yang ada di dalam Sistem Proteksi tersebut agar dapat mengKraknya. Contoh sederhananya yaitu ketika ada sebuah Conditional Jump yang akan |
| Kalimat Matematika | - |
| Contoh | MOV EAX, 12345678 ; Offset 12345678 berisi S/N palsu MOV EBX, CMP EAX, EBX JNE 12344321 Offset berikutnya menyatakan bahwa S/N yang dimasukan adalah S/N yang Offset 12344321 menyatakan bahwa S/N yang kita masukan adalah S/N yang Listing di atas menunjukkan dengan jelas bagaimana S/N kita MOV EAX, MOV EBX, CMP EAX, EBX NOP |
16. OR ( Logical OR )
| Format | OR Operand1, Operand2 |
| Fungsi | Melakukan Operasi Logika OR terhadap Operand1 dan Operand2, hasilanya akan disimpan di dalam Operand1 |
| Kalimat Matematika | Operand1 = Operand1 OR Operand2 |
| Contoh | OR EAX, EBX |
17. POP ( POP from Stack
)
| Format | POP Operand |
| Fungsi | Mengambil isi dari Stack dan menyimpannya di dalam Operand |
| Kalimat Matematika | - |
| Contoh | POP EAX |
18. PUSH ( PUSH onto Stack
)
| Format | PUSH Operand |
| Fungsi | Memasukan nilai dari Operand ke dalam Stack |
| Kalimat Matematika | - |
| Contoh | PUSH EAX |
19. RET ( Return from Procedure
)
| Format | RET |
| Fungsi | Kembali ke Rutin pemanggil Procedure yang sedang berlangsung. |
| Kalimat Matematika | - |
| Contoh | 1234 : 00000001 CALL 00001000 ;Memanggil Procedure yang ada di Offset 00001000 1234 : 00000002 1234 : 00001000 RET |
20. SUB ( Subtract Binary Values
)
| Format | SUB Operand1, Operand2 |
| Fungsi | Mengurangkan nilai dari Operand1 dengan Operand2. Hasilnya kemudian disimpan di dalam Operand1 |
| Kalimat Matematika | Operand1 = Operand1 – Operand2 |
| Contoh | MOV EAX, 0Ah ;EAX = 0Ah ( = 10 decimal ) MOV EBX, 01h ;EBX = 01h ( = 01 decimal ) SUB EAX, EBX ;EAX = EAX – EBX = 0Ah – 01h = |
21. TEST ( Test Bits )
| Format | TEST Operand1, Operand2 |
| Fungsi | Memeriksa apakah Operand1 sama dengan Operand2 ??? |
| Kalimat Matematika | - |
| Contoh | MOV EAX, 0Ah ;EAX = 0Ah ( = 10 decimal ) MOV EBX, 01h ;EBX = 01h ( = 01 decimal ) TEST EAX, EBX ;Apakah EAX = EBX ??? JE 12344321 ;Jika |
22. XOR ( Exclusive OR
)
| Format | XOR Operand1, Operand2 |
| Fungsi | Melakukan operasi logika Exlusive OR antara Operand1 dengan Operand2. Perintah XOR ini juga sering dipakai untuk me-nol-kan suatu register dengan cara XOR Operand1, Operand1 |
| Kalimat Matematika | - |
| Contoh | XOR EAX, EAX ;Berfungsi untuk me-nol-kan nilai EAX ( EAX = 0 ) |