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 :
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:
[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:
[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 :
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 :
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:
[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:
[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 :