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 : 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 ------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 ; \MessageBoxA setelah itu dilakukan jmp ke makro messageboxA dengan isi makro sbb: -------snip snip cutted----------- MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD MessageBox equ ------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 ; \ExitProcess selanjutnya dilakukan jmp ke makro exitprocess ok kita lanjutkan lain waktu dengan teknik anti disasm dan anti heuristic dengan junk