Assembler 2
Jak naprogramovat jednoduchý vir (1)
Autor: Drekin
!!!! Upozornění !!!!
Tento text je určen k učebním účelům.
(tj. K lepšímu pochopení zadané problematiky.)
Autor článku ani SOOM.CZ NENESE zodpovědnost za škody
vzniklé v souvislosti s tímto článkem!!
Tento článek rozhodně nemá za cíl nabádat vás k nějaké nezákonné, nebo nemorální činnosti!!
Jak naprogramovat jednoduchý vir (1)
V tomto seriálu se dozvíte, jak dělat v assembleru jednoduché viry. Tento díl se bude zabývat některými pro tvorbu virů důležitými instrukcemi a funkcemi.
Pro zvládnutí článku předpokládám alespoň základní znalost assembleru. Také se budou hodit nějaké obecné vědomosti o virech.
No a teď už si popíšeme některé funkce:
Funkce DOSu 4Eh - Najdi první soubor | |
Vstup: | |
---|---|
AH | 4Eh - číslo funkce DOSu |
DS:DX | adresa ASCIIZ (standardní řetězec ukončený nulovým znakem) jména hledaného souboru (může být i '*','?', a to jak ve jménu i v příponě); např.: "C:\Dokumenty\*.com",0 |
CX | atributy souboru, jež se mají shodovat |
Výstup: | |
CF=1 | chyba |
AX | číslo chyby |
CF=0 | OK |
DTA | naplněna daty; implicitní DTA se nachází v PSP na offsetu 80h |
Funkce DOSu 4FH - Najdi další soubor | |
Vstup: | |
---|---|
AH | 04Fh - číslo funkce DOSu |
DS:DX | adresa DTA z předchozího volání DOS Fn 4Eh |
Výstup: | |
CF=1 | chyba |
AX | číslo chyby |
CF=0 | OK |
DTA | naplněna daty |
Funkce DOSu 3DH - Otevři soubor přes HANDLE | |
Vstup: | |
---|---|
AH | 03Dh - číslo funkce DOSu |
DS:DX | adresa ASCIIZ řetězce jména souboru |
AL | způsob otevření: 0 - čtení, 1 - zápis, 2 - čtení i zápis |
Výstup: | |
CF=1 | chyba |
AX | číslo chyby |
CF=0 | OK |
AX | HANDLE souboru |
Funkce DOSu 3EH - Zavři soubor přes HANDLE | |
Vstup: | |
---|---|
AH | 03Eh - číslo funkce DOSu |
BX | HANDLE souboru |
Výstup: | |
CF=1 | chyba |
AX | číslo chyby |
CF=0 | OK - soubor je uzavřen |
Funkce DOSu 3FH - Čti ze souboru přes HANDLE | |
Vstup: | |
---|---|
AH | 03Fh - číslo funkce DOSu |
BX | HANDLE souboru |
DS:DX | buffer pro načtená data |
CX | počet byte k přečtení |
Výstup: | |
CF=1 | chyba |
AX | číslo chyby |
CF=0 | OK |
AX | počet načtených byte |
Funkce DOSu 40H - Zápis do souboru přes HANDLE | |
Vstup: | |
---|---|
AH | 040h - funkce DOSu |
CX | počet byte k zápisu |
BX | HANDLE souboru |
DS:DX | buffer dat |
Výstup: | |
CF=1 | chyba |
AX | číslo chyby |
CF=0 | OK |
AX | počet zapsaných byte |
Funkce DOSu 42H - Nastav ukazatel v souboru | |
Vstup: | |
---|---|
AH | 042h - číslo funkce DOSu |
BX | HANDLE souboru |
CX:DX | velikost posunu: (CX * 65536) + DX |
AL | 0 - posuň ukazatel na začátek + CX:DX 1 - posuň ukzatel od aktuální pozice o CX:DX 2 - posuň ukazatel na konec souboru + CX:DX |
Výstup: | |
CF=1 | chyba |
AX | číslo chyby |
CF=0 | OK |
DX:AX | pozice v souboru od začátku |
A aby té teorie nebylo tolik, přikládám na závěr ještě ilustrativní zdroják. Tento program vypíše všechny *.com a *.exe soubory v adresáři:
ORG 100h | ; bez tohohle by to asi nešlo :) | |
mov cx,0002h | ; takový trik | |
mov dx,adresa | ; *.com | |
start: | mov ah,4Eh | ; najdi první soubor |
int 21h | ||
jc exe | ; pokud žádný není, skoč na exe | |
jmp pracuj | ||
dalsi: | mov ah,4Fh | ; najdi další soubor |
mov dx,80h | ; implicitní DTA | |
int 21h | ||
jc exe | ; pokud žádný není, skoč na exe | |
pracuj: | mov edx,9Eh | ; na 9Eh je v DTA název souboru |
mov bx,nazev | ||
presun: | cmp byte [ds:edx],0 | ; pokud ASCIIZ řetězec skončil... |
jz vypis | ; ...skoč na vypis | |
mov al,[ds:edx] | ||
mov [ds:bx],al | ; přesuň znak z [ds:edx] na [ds:bx] | |
inc edx | ||
inc bx | ; zvyš edx a bx | |
jmp presun | ; a opakuj to dokud nenarazíš na 0 | |
vypis: | mov word [ds:bx],0A0Dh | |
add bx,2 | ||
mov byte [ds:bx],24h | ; za získaný název přidej 10,13,'$' | |
mov ah,09h | ||
mov dx,nazev | ||
int 21h | ; vypiš ho na obrazovku | |
jmp další | ; a hledej další | |
exe: | mov dx,adresa2 | ; *.exe |
dec cx | ; pokud CX=0... | |
jnz start | ; ...máme už vypsány všechny soubory | |
konec: | xor ax,ax | |
int 16h | ||
int 20h | ; konec :) | |
adresa | db '*.com',0 | |
adresa2 | db '*.exe',0 | |
nazev | db 0 | ; buffer pro název souboru |
- pozn.: některé antiviry můžou za virus Trivial (souhrnné označení primitivních virů) označit už jen tento program
Tak to by bylo pro dnešek asi vše. Já vím, že to dnes bylo ještě trochu nezáživné, ale příště už bude i zdrojový kód primitivního viru.
zdroj soom.cz
Are you 18? Come in and don't be shy!
(loveawake.ru, 31. 1. 2022 19:53)