Dalam pembelajaran membangun sebuah objek kadang tidak harus mulai dari sesuatu yang belum terbentuk menjadi hal yang sudah terbentuk, kadang diperlukan metode bongkar pasang dalam arti kata sesuatu yang sudah jadi kita bongkar kembali untuk mempelajari bagaimana proses pembuatan dan bahan-bahan pembentuknya. Seperti itulah konsep dasar dari reverse engineering. Awalnya hal ini hanya berlaku intuk perangkat keras atau hardware, namun pada saat ini reverse engineering sudah diterapkan dalam berbagai hal seperti perangkat lunak / software, database dan lainnya. Salah satu yang paling mudah dimengerti adalah dalam proses pembuatan crack, patch, dan hacking software atau game. Contoh ; program ditulis dalam suatu bahasa, seperti C + + atau Java, yang bisa dimengerti oleh programmer lain. Tetapi untuk dijalankan pada komputer, mereka harus diterjemahkan oleh program lain, yang disebut compiler / kompilator ke bahasa mesin. Baris kode yang tersusun akan dipahami kebanyakan programmer, tetapi untuk menjadikannya lebih mudah dimengerti (userfriendly) dibutuhkan software yang disebut sebuah decompiler / dekompilator.
Reverse-engineering digunakan untuk berbagai tujuan: sebagai alat pembelajaran; sebagai cara untuk membuat baru, produk yang kompatibel yang lebih murah daripada apa yang saat ini di pasar, untuk membuat perangkat lunak lebih efektif atau untuk menjembatani data antara sistem operasi yang berbeda atau database; dan untuk mengungkap fitur yang tak tercatat dari produk komersial.
"Reverse engineering adalah legal, tapi ada dua bidang utama di mana kami melihat ancaman reverse-engineering" kata Jennifer Granick, direktur klinik hukum dan teknologi di Stanford Law School di Palo Alto, California. Ancaman pertama, belum diuji di pengadilan, berasal dari lisensi shrink-wrap yang secara eksplisit melarang siapa pun yang membuka atau menggunakan perangkat lunak hasil reverse-engineering, katanya. Ancaman lain adalah dari Digital Millennium Copyright Act (DMCA), yang melarang penciptaan atau penyebaran alat atau informasi yang dapat digunakan untuk memecahkan p*dungan teknologi yang melindungi perangkat lunak dari pengkopian. Faktanya adalah, reverse-engineering sering membutuhkan pelanggaran dari proteksi software, dan DMCA tidak memperbolehkan tindakan reverse-engineering untuk keperluan kompatibilitas. "agan tidak diizinkan untuk melihat apakah perangkat lunak melakukan apa yang seharusnya dilakukan," kata Granick, Agan juga tidak bisa melihatnya untuk tujuan penyelidikan ilmiah. Dia menawarkan sebuah analogi: "Agan memiliki mobil, tetapi Agan tidak diizinkan untuk membuka kap mesin."
Untuk memulai suatu "Reverse-Engineering" perlu adanya penguasaan materi baik dari tools nya maupun logika dari bahasa mesin itu sendiri atau dikenal dengan istilah "Assembly". Jika tidak mengetahui bahasa dasar assembly maka sia-sia usaha kita. Kita perlu mengetahui bahasa assembly karena untuk setiap tindakan kita saat melakukan reverse pasti kita menghadapi bahasa mesin. kita mulai dari beberapa hal yang perlu kita ketahui :
1. REGISTERS
2. STACK
Ready.,. Gooooo.,.
Step Bitmanipulation
Tambahan :
Reverse-engineering digunakan untuk berbagai tujuan: sebagai alat pembelajaran; sebagai cara untuk membuat baru, produk yang kompatibel yang lebih murah daripada apa yang saat ini di pasar, untuk membuat perangkat lunak lebih efektif atau untuk menjembatani data antara sistem operasi yang berbeda atau database; dan untuk mengungkap fitur yang tak tercatat dari produk komersial.
"Reverse engineering adalah legal, tapi ada dua bidang utama di mana kami melihat ancaman reverse-engineering" kata Jennifer Granick, direktur klinik hukum dan teknologi di Stanford Law School di Palo Alto, California. Ancaman pertama, belum diuji di pengadilan, berasal dari lisensi shrink-wrap yang secara eksplisit melarang siapa pun yang membuka atau menggunakan perangkat lunak hasil reverse-engineering, katanya. Ancaman lain adalah dari Digital Millennium Copyright Act (DMCA), yang melarang penciptaan atau penyebaran alat atau informasi yang dapat digunakan untuk memecahkan p*dungan teknologi yang melindungi perangkat lunak dari pengkopian. Faktanya adalah, reverse-engineering sering membutuhkan pelanggaran dari proteksi software, dan DMCA tidak memperbolehkan tindakan reverse-engineering untuk keperluan kompatibilitas. "agan tidak diizinkan untuk melihat apakah perangkat lunak melakukan apa yang seharusnya dilakukan," kata Granick, Agan juga tidak bisa melihatnya untuk tujuan penyelidikan ilmiah. Dia menawarkan sebuah analogi: "Agan memiliki mobil, tetapi Agan tidak diizinkan untuk membuka kap mesin."
Untuk memulai suatu "Reverse-Engineering" perlu adanya penguasaan materi baik dari tools nya maupun logika dari bahasa mesin itu sendiri atau dikenal dengan istilah "Assembly". Jika tidak mengetahui bahasa dasar assembly maka sia-sia usaha kita. Kita perlu mengetahui bahasa assembly karena untuk setiap tindakan kita saat melakukan reverse pasti kita menghadapi bahasa mesin. kita mulai dari beberapa hal yang perlu kita ketahui :
1. REGISTERS
Registers dapat dibandingkan dengan variable pada bahasa mesin tingkat tinggi (high levellanguage) [C, Pascal, Visual Basic, Delphi]. Dimana nilai dari register tersebut tersimpan dalam cpu dan dapat di manipulasi. Ada 4 macam registers :
a. General purpose registers
Besarnya nilai registers adalah 16 bits , dan terdapat 4 macam AX,BX,CX and DX. Lalu dibagi lagi menjadi bernilai 8 bits , AX dibagi menjadi AL (low byte) dan AH (high byte), dan BX di bagi menjadi BL dan BH dan seterusnya.
Contoh :
Misalkan nilai AX=1234. maka AL=34 (the low bytes) dan AH=12 (the high bytes). Di dalam 386 dan yang lebih atas sepert 486 , ada juga register yang bernilai 32 bits, yaitu EAX,EBX,ECX, dan EDX.
Berikut singkatannya :
EAX: Extended Accumulator Register
EBX: Extended Base Register
ECX: Extended Counter Register
EDX: Extended Data Register
ESI: Extended Source Index
EDI: Extended Destination Index
EBP: Extended Base Pointer
ESP: Extended Stack Pointer
EIP: Extended Instruction Pointer
b. Stack registers
BP dan SP adalah stack registers. Stack register adalah tempat dimana register menyimpan datanya secara sementara. Agan dapat menyimpan data dengan instruksi "push" dan dapat di aksens dengan instruksi "pop". Stack ini memiliki ketentuan yang akhir masuk yang harus keluar duluan
Contoh :
push ax (EAX)
push bx (EBX)
push cx (ECX) Akhir masuk
......
pop cx (ECX) Awal keluar
pop bx (EBX)
pop ax (EAX)
logikanya gini aja ; yang telat datang malah duluan pulang ( asik kan ., awkkawkkakwkkaw., )
c. Segment registers
Ada 4 segmen (6 on the 386 and above):
CS - Code segment. Block di mana lokasi data berada
DS - Data segment. Disini lokasi data dapat di access. Jika berhubungan dengan " "string"
ES - Extra segment. Tempat extra bisa sebagai data segment.
FS – segment lain saja (only 386+), jarang di gunakan pada reverse
GS – segement lain nya saja (only 386+), jarang di gunakan pada reverse
d. Index registers
Merupakan "pointer registers" sering digunakan pada instruksi yang melibatkan "string". Ada 2 perbedaaan , dan bernilai 16 bits large (Pada 386+ terdapat "E" di depannya jadi bernilai 32 bit):
SI – [ESI] Source Index. Digunakan pada string operations sebagai sumber "source" (input).
DI - Destination Index. Digunakan pada string operations sebagai hasil "destination".(output)
BX (EBX) juga dapat di gunakan sebagai index register. Register digunakan bersamaan dengan segment registers sebagai "offset". Lalu apa artinya " DS:SI"? Simple saja DS ke datasegment dan SI adalah offset didalam datasegment.
2. STACK
Ready.,. Gooooo.,.
Disini djelaskan instruksi yang harus agan ketahui untuk mengerti logika dari bahasa assembly. Yang akan di bahas hanya dasarnya.
MOV dest, source
Instruksinya simple memindahkan (move) value ke lokasi yang terdapat dalam memory (register atau variable).
Contoh :
MOV AX, 1234h ; AX = 1234h
MOV BX, AX ; BX = AX
Jadi seluruh data 1234 hex (4660 dec) di pindah ke AX . Kemudian value dari AX (1234h) akan dipindahkan kembali ke BX.
ADD dest, value
Instruksinya simple menambahkan value dan disimpan di dest.
Contoh :
MOV AX, 10h ; Ax adalah 10h
ADD AX, 10h ; Ax adalah 20h
ADD AX, 5h ; Ax adalah 25h
SUB dest, value
Instruksinya simple mengurangi value dan disimpan di dest.
Contoh :
MOV AX, 10h ; AX adalah 10h
SUB AX, 2h ; Ax adalah 8h
INC dest
Menambah value tertentu (register, variable atau apa saja).
Contoh :
MOV AX, 10h ; AX adalah 10h
INC AX ; Ax adalah 11h
DEC dest
Mengurangi value tertentu (register, variable atau apa saja).
Contoh :
MOV AX, 10h ; AX adalah 10h
DEC AX ; AX adalah 9h
CMP source, dest
Membandingkan isi dari source dengan dest.
Contoh :
MOV AX, 10h ; AX adalah 10h
MOV BX, 11h ; BX adalah 11h
CMP AX, BX ; Compares AX adalah BX
Baris setelah CMP AX,BX biasanya instruksi "jump". Jika kita ingin "jump" jika AX=BX, maka gunakanlah JE (Jump if equal) lalu "location" (alamat) (location dapat berupa offset) setelah instruksi CMP. Jika kita ingin "jump" jika AX "tidak atau sama dengan BX, gunakanlah JNE (Jump if not equal) lalu "location: setelah instruksi CMP instruction. Ada beberapa kondisi "jump", mungkin kita bahas belakangan aja.,.
JMP location
JUMPS (loncat) ke lokasi XXX
Contoh :
JMP 200h jump ke offset 200h
MOVSB atau MOVSW
"Move" (memindahkan, meng-copy isi) byte (MOVSB) atau word (MOVSW) dari DS:SI ke ES:DI yang di ditambah dari value SI.
Contoh :
Misal DS:SI points memiliki 5h byte
MOVSB ; ambil byte DS:SI points copy adan simpan di ES:DI
Maka byte ES:DI points memiliki value of 5h
Kondisi ini sering di temukan, ketika string dicopy-kan ke lokasi lain. instruksi inidigunakan bersamaan dengan REP.
LODSB atau LODSW
Load nilai byte atau word dari DS:SI dan simpan di AL (LODSB) atau AX (LODSW). Akan ditambahkan ke SI.
Contoh :
Misal DS:SI points word ber- value EBh
LODSW ; Copy value word DS:SI points dan simpan di AX
AX sekarang bernilai EBh
Kondisi ini sering di temukan , ketika string dicopy-kan ke lokasi lain . instruksi ini digunakan bersamaan dengan REP.
STOSB atau STOSW
Mengambil value dari AL (STDSB) atau AX (STDSW) dan tempatkan di DS:SI. Akan ditambahkan ke SI.
Contoh :
Misalkan nilai AX EBh
STOSW ; copy nilai AX dan simpan di DS:SI points; DS:SI points word bernilai (value) EBh
Kondisi ini sering di temukan , ketika string dicopy-kan ke lokasi lain . instruksi ini digunakan bersamaan dengan REP.
REP
Ulang instruksi sesuai nilai CX (ECX jika 32 bit) register. REP disimpan didepan MOVSB,LODSB atau STOSB (atau didepan intruski ds:si jika word value) hal ini akan membuat program mengulang secara automatis
Contoh:
MOV AL,Bh ; AL adalah bh
MOV CX,5h ; CX adalah 5h
REP STOSB ;
Maka value AL (bh) di copy-kan ke DS:SI points sebanyak 5 kali. (nilai CX) ; dan nilai SI akan ikut bertambah.
CALL procedure
Memanggil prosedur suatu algoritma/ instruksi yang diakhir oleh Ret (return)
Contoh :
CALL 4020
; Jumps ke offset 4020 dan melanjutkan instruksi sampai beres
; setelah mencapai RET. Akan berlanjut ke line di bawah call .
Ada istilah "near call". Hanya meloncat ke offset yang berbeda . Ada juga "far calls". Meloncat ke segmen dan offset yang bereda
Contoh :
CALL 013f:2310
; Jumps ke segment 013f, dan offset points ke 2310.
Pembahasan Conditional Jumps
Kondisi "jumps" dibagi 2 macam yaitu unsigned dan signed (conditional jumps.
Unsigned conditional jumps
JA Jump if above
JAE Jump if above or equal
JB Jump if below
JBE Jump is below or equal
JNA Jump if not above (same as JBE)
JNAE Jump if not above or equal (same as JB)
JNB Jump if not below (Same as JBE)
JNBE Jump if not below or equal (same as JA)
Signed conditional jumps
JG Jump if greater
JGE Jump if greater of equal
JL Jump if less
JLE Jump if less or equal
JNG Jump if not greater (same as JLE)
JNGE Jump if not greater or equal (same as JGE)
JNL Jump if not lower (same as JGE)
JNLE Jump if not lower or equal (same as JG)
Nah yg dibawah inipasti agan sering menemukannya , tapi yang harus di cermati adalah JZ, JNZ, JA and JB
Conditional jump (dont matter if it's signed or not)
JZ Jump if zero
JE Jump if equal (same as JZ)
JNZ Jump if not zero
JNE Jump is equal (same as JNZ)
Tergantung instruksi sebelumnya (dalam hal ini instruksi CMP) value dari "zero flag". Maka pada JE (or JZ) nilai "zero flag" pasti di cari . jika di set (zeroflag=1) maka akan "jumps", jika bukan tidak loncat. Ini sangat penting dalam reverse karena kita dapat memodifikasi "zero flag"
Step Bitmanipulation
Pertama tama kita harus membahas tentang byte, sebuat byte yang konsisten terdiri dari 8 bits yang ber –value jika bukan 0 ya 1. Sebagai contoh kita ambil "X" dan kita ubah ke bentuk binary:X - 01011000
Caranya? Gampang buka tabel aja atau pake kalkulator, dari hec atau dec kemudian ubah ke binary
Ada beberapa instruksi yang sering kita temukan dalam melakukan reverse suatu aplikasi Antara lain :
I. XOR
ane akan coba jelaskan, kembali kecontoh "X", dan arti dari "XOR 88,65" serta bagaimana prosesnya . Angka 88 adalah nilai dec dari huruf 'X' dan 65 nilai dec dari huruf 'A'. Lihat di bawah:
Character Dec Binary
X 88 01011000
A 65 01000001
Hasil setelah di XOR 88,65:
25 00011001
Apa yang sebenarnya dilakukan oleh instruksi "XOR", Jika nilainya sama , maka menjadi 0, jika nilai berbeda nilai 1 Contoh jelasnya :
0011
0101
------
0110
Instruksi XOR sangat bermanfaat pada proses enkripsi
Lihat ini :
XOR 88,65 = 25
XOR 25,88 = 65
XOR 25,65 = 88
Mudahnya kita mendapat value original kembali.
Instruksi "XOR" juga bermanfaat untuk merubah sesuatu menjadi nilai nol....Contohnya bagaimana kita mengosongkan memory ? bisa dengan instruksi ini :
SUB EAX,EAX
MOV EAX,0
Bisa saja kita memakainya tapi kenapa harus mengunakan XOR
XOR EAX,EAX
Instruksi diatas juga akan merubah value EAX menjadi "nol. Perbedaannya adalah mempercepat kerja CPU dan merupakan instruksi yang biasa dilakukan.
II. AND
Jika agan sudah paham akan insrtuksi "XOR", Maka akan mudah untuk memahami instruksi "AND" . Contoh :
Character Dec Binary
X 88 01011000
A 65 01000001
Hasil di AND 88,65:
64 01000000
Instruksi "and" akan membandingkan bit satu satu.
Jika keduanya 1, maka akan bernilai 1, selain itu maka bernilai 0.
III. OR
Lansung contoh :
CharacterDecvalue Binary
X 88 01011000
A 65 01000001
Hasil di OR 88,65:
89 01011001
Seperti instruksi sebelumnya di bandingkan satu- satu, Jika keduanya bernilai 0, maka bernilai 0, jika nilai lain set value jadi 1.
Tambahan :
BIT – data terkecil . bernilai "0" atau "1, jika di gabung menjadi bentuk binaryContoh :
00000001 = 1 00000010 = 2 00000011 = 3 etc.
BYTE – terdiri dari 8 bits. Bernilai maksimal 255 (0-255). Agar mudah membaca binary sistem digunakanlah 'hexadecimal number system'. Hec adalah 'base-16 system', sedangkan binary adalah 'base-2 system'
WORD – 2 byte yang di jadikan 1 atau 16 bits. Word bernilai max 0FFFFh (atau 65535d).
DOUBLE WORD – 2 word di jadikan 1 atau 32 bits. Nilai max = 0FFFFFFFF (atau 4294967295d).
KILOBYTE - 1000 bytes? bukan, tetapi 1024 (32*32) bytes.
MEGABYTE – Juga bukan 1 juta tapi 1024*1024 atau 1,048,578 bytes.
32bit Register 16bit Register 8bit Register
EAX AX AH/AL
EBX BX BH/BL
ECX CX CH/CL
EDX DX DH/DL
ESI SI -
EDI DI -
EBP BP -
ESP SP -
FTP TP -
The flags - Flags ber-value single bits yang berindikasi status. flag register pada 32bit CPUs adalah 32bit. Ada 32 flags, yang berbeda tetapi jangan khawatir. Yang agan perlukan hanya 3 dalam reversing. Z-Flag, O-Flag dan C-Flag. Flag hanya penanda saja seperti layaknya lampu lalu lintas. Hijau artinya : 'jalan terus' dan merah artinya 'berhenti'. flag hanya bernilai '0' dan '1', berarti 'not set' atau 'set'.
Z-Flag:
Z-Flag (zero flag) paling sering digunakan pada cracking.hampir 90% penggunaannya . Dapat di set 0 atau 1
O-Flag:
O-Flag (overflow flag) hanya 4% digunakan dalam cracking .
C-Flag:
C-Flag (Carry flag) hanya digunakan 1% dalam cracking.
Bitmanipulation Instructions table
Reference Table
operation src dest result
AND 1 1 1
1 0 0
0 1 0
0 0 0
OR 1 1 1
1 0 1
0 1 1
0 0 0
XOR 1 1 0
1 0 1
0 1 1
0 0 0
NOT 0 N/A 1
1 N/A 0