Jak naprogramovat jednoduchý vir (1)

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: Drekin
Datum: 28.9.2004
Hodnocení/Hlasovalo: 2/21

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...

!!!! 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:
AH4Eh - číslo funkce DOSu
DS:DXadresa 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
CXatributy souboru, jež se mají shodovat
Výstup:
CF=1chyba
AXčíslo chyby
CF=0OK
DTAnaplněna daty; implicitní DTA se nachází v PSP na offsetu 80h

Funkce DOSu 4FH - Najdi další soubor
Vstup:
AH04Fh - číslo funkce DOSu
DS:DXadresa DTA z předchozího volání DOS Fn 4Eh
Výstup:
CF=1chyba
AXčíslo chyby
CF=0OK
DTAnaplněna daty

Funkce DOSu 3DH - Otevři soubor přes HANDLE
Vstup:
AH03Dh - číslo funkce DOSu
DS:DXadresa ASCIIZ řetězce jména souboru
ALzpůsob otevření: 0 - čtení, 1 - zápis, 2 - čtení i zápis
Výstup:
CF=1chyba
AXčíslo chyby
CF=0OK
AXHANDLE souboru

Funkce DOSu 3EH - Zavři soubor přes HANDLE
Vstup:
AH03Eh - číslo funkce DOSu
BXHANDLE souboru
Výstup:
CF=1chyba
AXčíslo chyby
CF=0OK - soubor je uzavřen

Funkce DOSu 3FH - Čti ze souboru přes HANDLE
Vstup:
AH03Fh - číslo funkce DOSu
BXHANDLE souboru
DS:DXbuffer pro načtená data
CXpočet byte k přečtení
Výstup:
CF=1chyba
AXčíslo chyby
CF=0OK
AXpočet načtených byte

Funkce DOSu 40H - Zápis do souboru přes HANDLE
Vstup:
AH040h - funkce DOSu
CXpočet byte k zápisu
BXHANDLE souboru
DS:DXbuffer dat
Výstup:
CF=1chyba
AXčíslo chyby
CF=0OK
AXpočet zapsaných byte

Funkce DOSu 42H - Nastav ukazatel v souboru
Vstup:
AH042h - číslo funkce DOSu
BXHANDLE souboru
CX:DXvelikost posunu: (CX * 65536) + DX
AL0 - 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=1chyba
AXčíslo chyby
CF=0OK
DX:AXpozice 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 :)
adresadb '*.com',0
adresa2db '*.exe',0
nazevdb 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.

Pokud máte jiné dotazy, připomínky apod., zeptejte se mě na drekin@gmail.com



Drekin