Belajar ASSEMBLY
Mari kita belajar apa itu bahasa ASSEMBLY . Bahasa assembly merupakan low level language dalam dunia progamming komputer
Apa itu Register ? Register adalah sebagian tempat di memory mikroprosesor yang dapat diakses dengan cepat. Di dalam register ini disimpan nilai – nilai yang sangat penting .
EAX, EBX, ECX dan EDX disebut “General Purpose Register”. Register ini merupakan Register 32-bit, jika mengcrack program 16-bit maka yang terlibat adalah AX, BX, CX dan DX. Register dapat dipecah2 …
Contoh:
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 menunjukan High dan L menunjukan Low
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.
Perintah dasar dalam assembly adalah :
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, 00000002h ; EAX = 00000001h + 00000002h = 00000003h
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 ; EAX = 00001111b AND 11110000b = 00000000b
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 ; EDX : EAX = 00000000 : 12345678h
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 ; EBX = 0Bh
CMP EAX, ECX ; Pembandingan EAX dengan ECX.
JE 12345678 ; Jika sama, lompat ke Offset 12345678. Jika tidak, lanjutkan ke bawah
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 ; EAX = 0000000Ah – 00000001h = 00000009h
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 ; EBX = 00000005h
DIV EBX ; EAX = 0000000Ah DIV 00000005h = 00000002h
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 ; EAX = 0000000Fh
MOV EBX, 05h ; EBX = 00000005h
IDIV EBX ; EDX : EAX = 00000000 : 0000000Fh IDIV 00000005h
; EAX = 00000003h ( hasil ) EDX = 00000000h ( sisa )
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 ; EAX = 00000005h
MOV EBX, 0Ah ; EBX = 0000000Ah
IMUL EBX ; EAX = 00000000 : 00000005 IMUL 0000000A = 00000032h
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 mengCrak, 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 ; EDX : EAX = 0000000Ah * 00000005h = 00000000 : 00000032h
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 menentukan apakah S/N yang kita masukan valid atau tidak, salah satu cara yang mungkin untuk mengKraknya adalah dengan me-NOP-kan perintah Conditional Jump tersebut. Untuk lebih jealasnya, liat contoh di bawah.
Kalimat Matematika -
Contoh MOV EAX, 12345678 ; Offset 12345678 berisi S/N palsu
MOV EBX, 87654321 ; Offset 87654321 berisi S/N yang asli.
CMP EAX, EBX ; Bandingkan EAX dengan EBX
JNE 12344321 ; Jika tidak sama, lompat ke Offset 12344321
Offset berikutnya menyatakan bahwa S/N yang dimasukan adalah S/N yang valid.
Offset 12344321 menyatakan bahwa S/N yang kita masukan adalah S/N yang salah..
Listing di atas menunjukkan dengan jelas bagaimana S/N kita dibandingkan, jika kau ingin dengan sembarang S/N dapat dianggap sukses maka kita bisa me-NOP-kan Conditional Jump di atas sehingga listing perintah di atas menjadi :
MOV EAX, 12345678 ; Offset 12345678 berisi S/N palsu
MOV EBX, 87654321 ; Offset 87654321 berisi S/N yang asli.
CMP EAX, EBX ; Bandingkan EAX dengan EBX
NOP ; Tidak melakukan pencabangan sehingga S/N apa saja yang dimasukan akan dianggap valid.
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 ;Perintah Selanjutnya
1234 : 00001000 RET ;Alur program akan kembali ke Offset 00000002
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 = 09h
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 sama, lompat.
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 )
Mnemonic : ADD
Tersedia pada : 8088 keatas
Syntax : ADD Tujuan,Sumber
Pengaruh flag : OF, SF, ZF, AF, PF, CF
Fungsi : Menambahkan “Sumber” dan “Tujuan” kemudian hasilnya disimpan pada “Tujuan”. Bila hasil penjumlahan tidak tertampung seluruhnya pada “Tujuan”, maka CF akan diset 1.
Contoh:
ADD AX,BX ; Jumlahkan 2 register
ADD AL,[350] ; Jumlahkan register dengan isi memori
ADD [350],AL ; Jumlahkan isi memory dengan register
ADD AH,10h ; Jumlahkan register dengan immediate
ADD [350],10h ; Jumlahkan isi memori dengan immediate
Mnemonic : AND
Tersedia pada : 8088 keatas
Syntax : AND Tujuan,Sumber
Pengaruh flag : OF, SF, ZF, PF, CF
Fungsi : Melakukan logika AND antara “Tujuan” dan “Sumber”. Hasil dari operasi AND diletakkan pada “Tujuan”. Instruksi AND umumnya digunakan untuk melihat kondisi suatu bit dengan menolkan bit-bit lainnya.
Contoh:
AND AL,00001000b ; AL=0000?000
JZ Nol ; Jika bit ketiga AL=0, maka lompat
Mnemonic : CALL
Tersedia pada : 8088 keatas
Syntax : CALL nama-procedure
Pengaruh flag : Tidak ada
Fungsi : Melompat dan mengerjakan intruksi pada procedure
Pada saat instruksi Call diberikan, maka processor akan melakukan :
- PUSH CS ke stack bila procedure yang dipanggil bertipe Far.
- PUSH IP ke stack.
- Mengganti nilai CS dengan segmen dari procedure bila procedure
tersebut bertipe Far.
- Mengganti nilai IP dengan offset dari procedure. Lakukan intruksi yang terdapat pada alamat baru(CS:IP) sampai bertemu dengan intruksi RET, setelah itu:
- POP IP
- POP CS bila procedure bertipe Far.
- Kembali ke program induk/pemanggil.
Mnemonic : DEC (Decrement)
Tersedia pada : 8088 keatas
Syntax : DEC Tujuan
Pengaruh flag : OF, SF, ZF, AF, PF
Fungsi : Untuk mengurangi “Tujuan” dengan 1. “Tujuan” dapat berupa
register 8 bit, 16 bit, 32 bit maupun memory. Bila anda ingin mengurangi suatu
register ataupun memory dengan 1, gunakanlah perintah DEC ini karena selain
lebih cepat, perintah DEC juga menggunakan memory lebih sedikit dibandingkan
dengan perintah SUB.
Contoh:
Kita dapat mengimplementasikan perintah Loop dengan menggunakan DEC. Di bawah ini kita akan menjumlahkan bilangan BX sampai 1. Misalnya bila BX = 5 maka dijumlahkan 5+4+3+2+1 = ….
Mnemonic : DIV (Divide)
Tersedia pada : 8088 keatas
Syntax : DIV Sumber
Pengaruh flag : OF, SF, ZF, AF, PF, CF
Fungsi : Bila “sumber” bertipe 8 bit maka dilakukan pembagian AX
dengan “Sumber” (AX / Sumber). Hasil pembagian akan disimpan pada register AL sedangkan sisa pembagian akan disimpan pada regiser AH.
Jika “sumber” bertipe 16 bit maka dilakukan pembagian DX:AX dengan “Sumber” (DX:AX / Sumber). Hasil pembagian akan disimpan pada register AX sedangkan sisa pembagian akan disimpan pada regiser DX.
Contoh:
Untuk memeriksa apakah suatu bilangan merupakan kelipatan 3 atau bukan, anda bisa membaginya dengan tiga. Bila merupakan kelipatan 3, maka sisa pembagian akan 0, sebaliknya jika bukan kelipatan tiga, sisa pembagian tidak akan 0. Macro ini akan menjadikan AL=1 bila bilangan yang ditest merupakan kelipatan tiga dan sebaliknya akan bernilai 0.
Lipat3 MACRO Bil
MOV AX,Bil
MOV BX,3
DIV BX
CMP AX,0 ; Apakah ada sisa pembagian ?
JE Tiga ; Tidak ada sisa , kelipatan 3
MOV AL,0
Tiga :
MOV AL,1
ENDM
Mnemonic : INC (Increment)
Tersedia pada : 8088 keatas
Syntax : INC Tujuan
Pengaruh flag : OF, SF, ZF, AF, PF
Fungsi : Untuk menambah “Tujuan” dengan 1. Bila anda ingin menambah suatu register ataupun memory dengan 1, gunakanlah perintah INC ini karena selain lebih cepat, perintah INC juga menggunakan memory lebih sedikit dibandingkan dengan perintah ADD.
Contoh:
Untuk membuat suatu pengulangan, seperti pada perintah ‘FOR I:=1 TO 10
DO’ pada bahasa tingkat tinggi:
XOR AX,AX
Ulang:
CMP AX,10
JE Selesai
INC AX
JMP Ulang
Mnemonic : MOV (Move)
Tersedia pada : 8088 keatas
Syntax : MOV Tujuan,Sumb
Pengaruh flag : Tidak Ada
Fungsi : Untuk mengcopykan isi “Sumber” ke “Tujuan”. Antara “Sumber”
dan “Tujuan” harus mempunyai tipe data yang sama, seperti AL dan BL, AX dan BX. Pada perintah MOV ini harus anda perhatikan bahwa:
- Segment register tidak bisa langsung diisi nilainya, seperti:
MOV ES,0B800h
Mnemonic : MUL (Multiply)
Tersedia pada : 8088 keatas
Syntax : MUL Sumber
Pengaruh flag : OF, CF
Fungsi : Bila “Sumber” bertipe 8 bit maka akan dilakukan perkalian
antara “Sumber” dengan AL. Hasilnya disimpan pada register AX. Bila “Sumber” bertipe 16 bit maka akan dilakukan perkalian antara “Sumber” dengan AX. Hasilnya disimpan pada pasangan register DX:AX.
Contoh:
MUL BH ; AX = BH * AL
MUL BX ; DX:AX = BX * AX
Apa itu Register ? Register adalah sebagian tempat di memory mikroprosesor yang dapat diakses dengan cepat. Di dalam register ini disimpan nilai – nilai yang sangat penting .
EAX, EBX, ECX dan EDX disebut “General Purpose Register”. Register ini merupakan Register 32-bit, jika mengcrack program 16-bit maka yang terlibat adalah AX, BX, CX dan DX. Register dapat dipecah2 …
Contoh:
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 menunjukan High dan L menunjukan Low
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.
Perintah dasar dalam assembly adalah :
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, 00000002h ; EAX = 00000001h + 00000002h = 00000003h
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 ; EAX = 00001111b AND 11110000b = 00000000b
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 ; EDX : EAX = 00000000 : 12345678h
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 ; EBX = 0Bh
CMP EAX, ECX ; Pembandingan EAX dengan ECX.
JE 12345678 ; Jika sama, lompat ke Offset 12345678. Jika tidak, lanjutkan ke bawah
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 ; EAX = 0000000Ah – 00000001h = 00000009h
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 ; EBX = 00000005h
DIV EBX ; EAX = 0000000Ah DIV 00000005h = 00000002h
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 ; EAX = 0000000Fh
MOV EBX, 05h ; EBX = 00000005h
IDIV EBX ; EDX : EAX = 00000000 : 0000000Fh IDIV 00000005h
; EAX = 00000003h ( hasil ) EDX = 00000000h ( sisa )
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 ; EAX = 00000005h
MOV EBX, 0Ah ; EBX = 0000000Ah
IMUL EBX ; EAX = 00000000 : 00000005 IMUL 0000000A = 00000032h
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 mengCrak, 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 ; EDX : EAX = 0000000Ah * 00000005h = 00000000 : 00000032h
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 menentukan apakah S/N yang kita masukan valid atau tidak, salah satu cara yang mungkin untuk mengKraknya adalah dengan me-NOP-kan perintah Conditional Jump tersebut. Untuk lebih jealasnya, liat contoh di bawah.
Kalimat Matematika -
Contoh MOV EAX, 12345678 ; Offset 12345678 berisi S/N palsu
MOV EBX, 87654321 ; Offset 87654321 berisi S/N yang asli.
CMP EAX, EBX ; Bandingkan EAX dengan EBX
JNE 12344321 ; Jika tidak sama, lompat ke Offset 12344321
Offset berikutnya menyatakan bahwa S/N yang dimasukan adalah S/N yang valid.
Offset 12344321 menyatakan bahwa S/N yang kita masukan adalah S/N yang salah..
Listing di atas menunjukkan dengan jelas bagaimana S/N kita dibandingkan, jika kau ingin dengan sembarang S/N dapat dianggap sukses maka kita bisa me-NOP-kan Conditional Jump di atas sehingga listing perintah di atas menjadi :
MOV EAX, 12345678 ; Offset 12345678 berisi S/N palsu
MOV EBX, 87654321 ; Offset 87654321 berisi S/N yang asli.
CMP EAX, EBX ; Bandingkan EAX dengan EBX
NOP ; Tidak melakukan pencabangan sehingga S/N apa saja yang dimasukan akan dianggap valid.
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 ;Perintah Selanjutnya
1234 : 00001000 RET ;Alur program akan kembali ke Offset 00000002
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 = 09h
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 sama, lompat.
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 )
Instruksi Mnemonic
Beberapa Intruksi Mnemonic Assembly.Mnemonic : ADD
Tersedia pada : 8088 keatas
Syntax : ADD Tujuan,Sumber
Pengaruh flag : OF, SF, ZF, AF, PF, CF
Fungsi : Menambahkan “Sumber” dan “Tujuan” kemudian hasilnya disimpan pada “Tujuan”. Bila hasil penjumlahan tidak tertampung seluruhnya pada “Tujuan”, maka CF akan diset 1.
Contoh:
ADD AX,BX ; Jumlahkan 2 register
ADD AL,[350] ; Jumlahkan register dengan isi memori
ADD [350],AL ; Jumlahkan isi memory dengan register
ADD AH,10h ; Jumlahkan register dengan immediate
ADD [350],10h ; Jumlahkan isi memori dengan immediate
Mnemonic : AND
Tersedia pada : 8088 keatas
Syntax : AND Tujuan,Sumber
Pengaruh flag : OF, SF, ZF, PF, CF
Fungsi : Melakukan logika AND antara “Tujuan” dan “Sumber”. Hasil dari operasi AND diletakkan pada “Tujuan”. Instruksi AND umumnya digunakan untuk melihat kondisi suatu bit dengan menolkan bit-bit lainnya.
Contoh:
AND AL,00001000b ; AL=0000?000
JZ Nol ; Jika bit ketiga AL=0, maka lompat
Mnemonic : CALL
Tersedia pada : 8088 keatas
Syntax : CALL nama-procedure
Pengaruh flag : Tidak ada
Fungsi : Melompat dan mengerjakan intruksi pada procedure
Pada saat instruksi Call diberikan, maka processor akan melakukan :
- PUSH CS ke stack bila procedure yang dipanggil bertipe Far.
- PUSH IP ke stack.
- Mengganti nilai CS dengan segmen dari procedure bila procedure
tersebut bertipe Far.
- Mengganti nilai IP dengan offset dari procedure. Lakukan intruksi yang terdapat pada alamat baru(CS:IP) sampai bertemu dengan intruksi RET, setelah itu:
- POP IP
- POP CS bila procedure bertipe Far.
- Kembali ke program induk/pemanggil.
Mnemonic : DEC (Decrement)
Tersedia pada : 8088 keatas
Syntax : DEC Tujuan
Pengaruh flag : OF, SF, ZF, AF, PF
Fungsi : Untuk mengurangi “Tujuan” dengan 1. “Tujuan” dapat berupa
register 8 bit, 16 bit, 32 bit maupun memory. Bila anda ingin mengurangi suatu
register ataupun memory dengan 1, gunakanlah perintah DEC ini karena selain
lebih cepat, perintah DEC juga menggunakan memory lebih sedikit dibandingkan
dengan perintah SUB.
Contoh:
Kita dapat mengimplementasikan perintah Loop dengan menggunakan DEC. Di bawah ini kita akan menjumlahkan bilangan BX sampai 1. Misalnya bila BX = 5 maka dijumlahkan 5+4+3+2+1 = ….
Mnemonic : DIV (Divide)
Tersedia pada : 8088 keatas
Syntax : DIV Sumber
Pengaruh flag : OF, SF, ZF, AF, PF, CF
Fungsi : Bila “sumber” bertipe 8 bit maka dilakukan pembagian AX
dengan “Sumber” (AX / Sumber). Hasil pembagian akan disimpan pada register AL sedangkan sisa pembagian akan disimpan pada regiser AH.
Jika “sumber” bertipe 16 bit maka dilakukan pembagian DX:AX dengan “Sumber” (DX:AX / Sumber). Hasil pembagian akan disimpan pada register AX sedangkan sisa pembagian akan disimpan pada regiser DX.
Contoh:
Untuk memeriksa apakah suatu bilangan merupakan kelipatan 3 atau bukan, anda bisa membaginya dengan tiga. Bila merupakan kelipatan 3, maka sisa pembagian akan 0, sebaliknya jika bukan kelipatan tiga, sisa pembagian tidak akan 0. Macro ini akan menjadikan AL=1 bila bilangan yang ditest merupakan kelipatan tiga dan sebaliknya akan bernilai 0.
Lipat3 MACRO Bil
MOV AX,Bil
MOV BX,3
DIV BX
CMP AX,0 ; Apakah ada sisa pembagian ?
JE Tiga ; Tidak ada sisa , kelipatan 3
MOV AL,0
Tiga :
MOV AL,1
ENDM
Mnemonic : INC (Increment)
Tersedia pada : 8088 keatas
Syntax : INC Tujuan
Pengaruh flag : OF, SF, ZF, AF, PF
Fungsi : Untuk menambah “Tujuan” dengan 1. Bila anda ingin menambah suatu register ataupun memory dengan 1, gunakanlah perintah INC ini karena selain lebih cepat, perintah INC juga menggunakan memory lebih sedikit dibandingkan dengan perintah ADD.
Contoh:
Untuk membuat suatu pengulangan, seperti pada perintah ‘FOR I:=1 TO 10
DO’ pada bahasa tingkat tinggi:
XOR AX,AX
Ulang:
CMP AX,10
JE Selesai
INC AX
JMP Ulang
Mnemonic : MOV (Move)
Tersedia pada : 8088 keatas
Syntax : MOV Tujuan,Sumb
Pengaruh flag : Tidak Ada
Fungsi : Untuk mengcopykan isi “Sumber” ke “Tujuan”. Antara “Sumber”
dan “Tujuan” harus mempunyai tipe data yang sama, seperti AL dan BL, AX dan BX. Pada perintah MOV ini harus anda perhatikan bahwa:
- Segment register tidak bisa langsung diisi nilainya, seperti:
MOV ES,0B800h
Mnemonic : MUL (Multiply)
Tersedia pada : 8088 keatas
Syntax : MUL Sumber
Pengaruh flag : OF, CF
Fungsi : Bila “Sumber” bertipe 8 bit maka akan dilakukan perkalian
antara “Sumber” dengan AL. Hasilnya disimpan pada register AX. Bila “Sumber” bertipe 16 bit maka akan dilakukan perkalian antara “Sumber” dengan AX. Hasilnya disimpan pada pasangan register DX:AX.
Contoh:
MUL BH ; AX = BH * AL
MUL BX ; DX:AX = BX * AX