Souborové viry pro DOS

Spustitelné soubory mohou mít několik formátů. V operačním systému DOS rozeznáváme dva základní, COM a EXE.

Spustitelný soubor typu COM

Naprosto nejednodušší formát spustitelného souboru. Může být dlouhý max. 64 KB (=délka paměťového segmentu). Nemá žádnou hlavičku a tak je jeho infekce naprosto jednoduchá. Při infekci tohoto souboru si virus obvykle uschová do svého těla první tři bajty COM souboru a místo nich vloží instrukci skoku (JMP), která se v budoucnu postará o spuštění připojeného těla viru. Při spuštění infikovaného souboru dojde nejprve k aktivaci viru, který v operační paměti obnoví původní 3 bajty a díky tomu dojde i ke spuštění původního programu, který byl v souboru před infekcí.

Spustitelný soubor typu EXE

Samotná struktura spustitelného souboru typu EXE je mnohem složitější než v případě COM souboru. Programový soubor EXE se skládá ze dvou částí, z hlavičky (header) a vlastního kódu programu. Pro zajímavost uvádím celou strukturu hlavičky:

Offset:Popis:
00hSignatura souboru (znaky MZ)
02hVelikost poslední stránky v B
04hDélka souboru v 512 B stránkách
06hPočet položek v relokační tabulce
08hVelikost hlavičky v 16 B paragrafech
0ahMinimální potřebná paměť v paragrafech
0chMaximální potřebná paměť v paragrafech
0ehPočáteční hodnota SS
10hPočáteční hodnota SP
12hKontrolní součet
14hPočáteční hodnota IP
16hPočáteční hodnota CS
18hOffset první relokační položky
1ahÚroveň překrývání

I v případě EXE souboru si musí virus uschovat do svého těla několik důležitých údajů (offset 0eh až 11h). Některé další musí vypočítat (offset 02h až 05h). Při spuštění infikovaného souboru opět dojde nejprve k aktivaci viru, který v operační paměti obnoví původní uschované údaje v hlavičce, díky čemuž dojde i ke spuštění původního programu.

Jak je vidět, struktura souborů COM a EXE je rozdílná, stejně jako je rozdílný způsob infikace těchto souborů. Virus tak musí být schopen rozeznat oba typy spustitelných souborů. Virus může tento problém vyřešit následovně:

  • typ spustitelného souboru odvodí přímo z jeho názvu (např. AHOJ.COM -> jde o COM)
  • typ spustitelného souboru odvodí podle jeho obsahu (EXE soubory mají v prvních dvou bajtech znaky "MZ").
    Evidentní je, že druhý způsob je bezpečnější.

    Umístění souborového viru v souboru (obecně)

    Souborový parazitický virus na začátku souboru (prepend)

    1. metoda ("vyseknutí" části původního programu a následné umístění na konec souboru - na konci uschované údaje)
    2. metoda (posun celého původního programu doprava)
    3. metoda (přepsání části původní programu - trvalé znehodnocení původního programu - na konci uschované údaje)

    Souborový parazitický virus na konci souboru (append)

    Tento způsob je nejpoužívanější a bližší informace jsou nahoře.

    Souborový parazitický virus ve středu souboru (insert)

    Velmi málo používaná metoda infekce. I tak však existují tři:
    • Metoda 1 - s úpravou údaje adresy vstupního bodu (tj. místo, kde program začína)
      Virus odloží původní obsah části souboru na konec souboru a sám sebe umístí do středu souboru. Pak upravý údaje v hlavičce.

    • Metoda 2 - bez úpravy adresy vstupního bodu (tj. místo, kde program začína)
      Virus zjistí startovací adresu souboru (entry point), a pokud směřuje někam do středu souboru, umístí se do něj (původní obsah části souboru samozřejmě odloží na konec souboru). Virus pak při spuštění infikovaného souboru převezme kontrolu nad programem jako první, bez toho aby předtím musel měnit startovací adresu (vstupní bod - entry point).

    • Metoda 3 - Cavity viruses - mezerové viry
      Tyto viry dokážou napadnout soubor, bez prodloužení jeho délky. Některé soubory totiž obsahují nepotřebné nebo prázdné oblasti, do kterých se vejde i celkem velký virus (kupříkladu sem patří virus BackForm, který má délku 2 kB). Typickým příkladem souboru "plných mezer" je COMMAND.COM. Tato metoda je oblíbená především ve Windows.

    Schéma činnosti přepisujícího viru (virus přímé akce - nerezidentní) vypadá takto:

  • Vir je aktivován v okamžiku, kdy je spuštěn libovolný infikovaný program, a jeho první starostí je vyhledat jiný vhodný program, který je možno napadnout.
  • Vir zkopíruje své tělo na začátek vyhlédnutého programu, čímž si zajistí, že bude aktivován okamžitě po jeho spuštění, ale zároveň je tímto krokem cílový program nenávratně zničen.
  • Pokud jsou splněny zadané podmínky, vir vykoná své poslání.
  • Vir nemůže pokračovat v činnosti původního programu, proto jej bezprostředně ukončí, často s nějakým hlášením naoko vysvětlujícím nemožnost běhu programu (například fiktivní nedostatek paměti).

    Schéma činnosti nepřepisujícího viru (virus přímé akce - nerezidentní) vypadá takto:

  • Tento krok je naprosto shodný jako v předchozím případě.
  • Vir připojí vlastní kód k programu tak, aby zachoval všechny informace potřebné k jeho správné činnosti. Nejjednodušším způsobem jak to zařídit, je připojit tělo viru za konec napadeného programu. Aby však byl vir aktivován okamžitě po spuštění infikovaného programu, musí na začátek programu vložit instrukci skoku na tělo viru, přičemž původní kód, který je přepsán skokovou instrukcí, je uložen do těla viru.

    Schéma činnosti rezidentního souborového viru vypadá takto:

  • Při spuštění napadeného programu vir zjistí, není-li již rezidentní v paměti. Pokud nalezne svou kopii v paměti, pokračuje bodem 5.
  • V opačném případě vyhledá a vyhradí pro své použítí (tzv. alokuje) úsek paměti vhodné velikosti.
  • Překopíruje sám sebe do tohoto úseku paměti a změní adresy některých diskových (a případně i jiných) služeb tak, aby směrovaly do těla viru (viz. Slovník pojmů - přerušení).
  • Obnoví začátek napadeného programu (pouze v paměti, ne na disku) a tento program spustí.
  • Pokud je od této chvíle spouštěn jakýkoli program, je nejdříve vyvolán rezidentní vir, který tento program infikuje tím, že připojí svůj kód ke kódu programu a změní úvodní skok (stejně jako u nepřepisujících virů přímé akce).
  • Jsou-li splněny podmínky, provede akci.