Welcome To Forum Master

Forum Indonesia


    Reverse Engineering

    Share

    [GM]LS_FM
    CMD Class 2
    CMD Class 2

    Jumlah posting : 3
    Cash : 2147483647
    Reputation : 0
    Join date : 14.11.11
    Age : 20
    Lokasi : Di Dalam Hati Ku

    Reverse Engineering

    Post  [GM]LS_FM on Mon Nov 14, 2011 8:10 pm

    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
    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., Razz)

    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

      Waktu sekarang Wed Dec 07, 2016 3:32 pm