Sabtu, 11 Agustus 2012

Pemrograman Assembly di Windows dengan masm32+ debugging dg ollydbg

tool: masm32 (32 bit microsoft macro assembler) -> untuk membuat executable

debugger: OllyDbg 1.10 (http://www.ollydbg.de/odbg110.zip) -> untuk mendebug

made by : devilzc0de.org written by m0nk3y@devilzc0de.org

thanks: all devilzc0de crews and members

download: http://www.masm32.com/masmdl.htm

"mengakses register lebih cepat dari mengakses memori karena register berada di cpu sedangkan memori baru terhubung

ke cpu dengan bus"

microsoft macro assembler yang kita kenal dulu hanya untuk pemrograman asm 16 bit kini telah berevolusi menjadi

masm32 untuk pemrograman assembly 33 bit

* direktif

aturan yg akan dipakai di program

---------------

.model -> aturan untuk model memori

----------------

.model flat-> menggunakan register 32 bit, offset 32 bit , semua data dan kode dalam 32 bit segment

.model tiny -> untuk program dg ekstensi .com, pake segmen tunggal utk kode dan data

.model large -> menggunakan lebih dr 1 segmen

dll

untuk mempermudah jalankan qteditor di direktori instalasi masm32

* program ke 1 menggunakan stdout

------------------------------------------

.386

.model flat,stdcall

option casemap : none

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc

include \masm32\include\masm32.inc

includelib \masm32\lib\masm32.lib

includelib \masm32\lib\kernel32.lib

.data

devilzc0de db "devilzc0de",0

.code

start:

invoke StdOut, addr devilzc0de

call ExitProcess

end start

------------------------------------------

untuk langsung mengkompile menjadi exe :

[Image: 1.jpg]

penjelasan:

.386 (8036)-> direktif untuk menggunakan instruksi asm untuk arsitektur 32 bit , bisa juga .686 atau .586 , dll

untuk listingnya bisa dilihat di http://en.wikipedia.org/wiki/X86_instruction_listings

stdcall -> digunakan untuk parameter passing untuk fungsi dari kiri ke kanan (akan kita lihat saat mendebug program

kita nanti)

option casemap : none -> dengan direktif ini akan membuat semua label, variabel menjadi case sensitif (jika ada

kesalahan penulisan seharusnya huruf besar menjadi huruf kecil bisa mengakibatkan error)

selanjutnya digunakan include file 2 yang diperlukan (.inc) untuk api2 windows yang akan kita gunakan

.data

tempat data 2 yang akan kita inisialisasi misal kita define variabel dg nama: devilzc0de

devilzc0de db "devilzc0de",0

db= define byte , 0 digunakan untuk terminate string dg null

.code

merupakan awal kode asm kita

selanjutnya kita menggunakan invoke untuk memanggil makro stdout yang bertujuan untuk print screen:

--------------------------------

invoke StdOut, addr devilzc0de

--------------------------------

jika kita tulis lagi instruksi tersebut di asm 16 bit bisa menggunakan interup 21 hexa fungsi 9 hex:

------------

mov ah, 09h ; kita akan menggunakan int 21h fungsi 9 hexa

mov dx, offset devilzc0de ; dx berisi offset devilzc0de

int 21 h ; call dos

--------------

di atas terlihat kebiasaan di 16 bit yg menggunakan offset, perbedaan offset dan addr:

- offset : untuk mendapatkan alamat memori dari variabel global

- addr : untuk mendapatkan alamat memori dari variabel global dan lokal

selanjutnya call makro exitprocess (untuk keluar program)

program di atas bisa ditulis ulang dg cara yg lebih bagus dg mengganti call dengan invoke:

* program ke 1 menggunakan stdout

------------------------------------------

.386

.model flat,stdcall

option casemap : none

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc

include \masm32\include\masm32.inc

includelib \masm32\lib\masm32.lib

includelib \masm32\lib\kernel32.lib

.data

devilzc0de db "devilzc0de",0

.code

start:

invoke StdOut, addr devilzc0de

invoke ExitProcess,0

end start

------------------------------------------

dg call program kita tidak akan melakukan push dword ke stack, pas program error tidak akan ada catch untuk error,

jadi invoke digunakan menggantikan call bisa dianggap error handling.

* messagebox

bagi yg sudah familiar dg program2 seperti vb dan delphi pasti sudah tau yg namanya messagebox

misal di vb6 untuk menampilkan messagebox saat form diload:

-----------------

Private Sub Form_Load()

MsgBox "tes"

End Sub

-----------------

untuk implementasi menampilkan messagebox seperti di visual basi di asm dg menggunakan masm32 :

----------------------------

.386

.model flat,stdcall

option casemap : none

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc

include \masm32\include\masm32.inc

include \masm32\include\user32.inc

includelib \masm32\lib\masm32.lib

includelib \masm32\lib\kernel32.lib

includelib \masm32\lib\user32.lib

.data

judul db "title pesan",0

devilzc0de db "devilzc0de",0

.code

start:

invoke MessageBox, NULL, addr devilzc0de, addr judul, MB_OK

invoke ExitProcess,0

end start

----------------------------

assemble dan link lalu run:

[Image: 2.jpg]

[2.jpg]

keterangan:

untuk menggunakan messagebox kita perlu menginclude : user32.inc

dan user32.lib

-----------------------

include \masm32\include\user32.inc

includelib \masm32\lib\user32.lib

--------------------------

mari kita lihat isi file user32.inc:

-----------------------------

C:\Documents and Settings\batman>cd \

C:\>cd masm32\include

C:\masm32\include>type user32.inc

; ===========================================

; user32.inc copyright MASM32 1998 - 2005

; ===========================================

-------snip snip cutted-----------

MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD

MessageBox equ <MessageBoxA>

------snip snip cutted-----------

ok jika kita perhatikan di caption muncul pesan error, karena seharusnya tidak kita isi parameter dengan null tapi

kita masukkan data berupa DWORD (double word) di windows 16 bit 1 word=16 bit , untuk 32 bit dikenal dword yg

artinya 16x2 (yang dimaksud 1 bit adalah 1 bit angka biner , 32 bit merupakan gabungan 2 register 16 bit).

ok mari kita coba melakukan sedikit debug dengan olydbg untuk melihat kinerja program:

[Image: 3.jpg]

[3.jpg]

invoke MessageBox, NULL, addr devilzc0de, addr judul, MB_OK

karena di bagian paling atas kita menulis direktif stdcall maka yg dipush pertama kali adalah parameter paling

kanan:

00401000 >/$ 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL

parameter paling kanan dipush ke stack

00401002 |. 68 00304000 PUSH devil.00403000 ; |Title = "title pesan"

setelah itu alamat memori dari variabel judul

00401007 |. 68 0C304000 PUSH devil.0040300C ; |Text = "devilzc0de"

setelah itu berlanjut ke alamat memori dari variabel devilzc0de

0040100C |. 6A 00 PUSH 0 ; |hOwner = NULL

untuk howner kita push 0 karena isian parameter adalah null

0040100E |. E8 0D000000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA

setelah itu dilakukan jmp ke makro messageboxA

dengan isi makro sbb:

-------snip snip cutted-----------

MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD

MessageBox equ <MessageBoxA>

------snip snip cutted-----------

equ berarti equal dengan kata lain MessageBox merupakan alias dari MessageBoxA

00401013 |. 6A 00 PUSH 0 ; /ExitCode = 0

selanjutnya kita push 0 ke stack untuk exit code 0

00401015 \. E8 00000000 CALL <JMP.&kernel32.ExitProcess> ; \ExitProcess

selanjutnya dilakukan jmp ke makro exitprocess

ok kita lanjutkan lain waktu dengan teknik anti disasm dan anti heuristic dengan junk


Sumber : Devilzc0de Forum

Tidak ada komentar:

Posting Komentar