Viry v 32bitových prostředích

Bylo jen otázkou času, kdy se pisatelé virů přeorientují na nové operační systémy, odhlalí jejich slabosti a začnou je využívat pro své záměry. Poprvé se tak stalo v roce 1992, kdy byly poprvé prolomeny bariéry MS-DOSu, a na světě se objevil první virus schopný infiltrovat operační systém Windows, který byl v tu dobu už dlouho na trhu.
První virus, který byl schopen infikovat jiné soubory než staré známé com- a exe-soubory, se jmenuje WinWir14. Tento virus byl schopen napadat tehdy nový typ exe-souborů. Tento formát souborů se používal u všech spustitelných 16bitových aplikací pro Windows 3.x. Virus byl však spíše jen pokusem a nestal se celosvětově rozšířeným. Po tomto prvním viru nastala dlouhá odmlka, během níž si pravděpodobně autoři "rozšiřovali své obzory", a potom se vše velice rychle rozběhlo.
Virus Tentacle byl dalším následovníkem viru WinWir a zanedlouho se objevil i první virus pro operační systém Windows 95 - virus Boza. Tím byly definitivně prolomeny hranice virů pro systém MS-DOS. Virus Boza byl již schopen infikovat další typ spustitelných 32bitových souborů, pe-soubory (portable executable) neboli soubory přenositelného formátu.
Tvůrci virů odvedli velký kus práce, když se museli přeorientovat z prostředí MS-DOS do daleko komplexnějšího a složitějšího světa MS-Windows. V prostředí Windows sice zůstavají některé komponenty starého DOSu, ale Windows přinesly především práci programů v rozšířeném chráněném režimu procesoru (tzv. protect mod), zcela jinou 32bitovou správu souborů, a tak virus, který chce v tomto prostředí úspěšně přežít, se musí naučit těchto technik využívat.
Další prvek, na kterém jsou Windows z velké části postaveny, jsou takzvané virtuální ovladače zařízení - VxD. Jejich kódy pracují na nejvyšší úrovni oprávnění procesoru zvaném ring 0 a mohou si s celým systémem dělat doslova, co chtějí bez jakýchkoliv ochran. Pro viry, které chtějí monitorovat souborový systém Windows 9x, je využití ovladačů VxD velice přínosné. Na této úrovni totiž pracuje ovladač IFS manager (IFS - installable file system), přes který prochází veškeré souborové operace Windows 9x, ať už jsou volány ze 16bitové či 32bitové aplikace Windows nebo z virtuálního stroje MS-DOSu. Navíc zde existuje velice podrobně dokumentované rozhraní API, které mohou tvůrci virů využít. Tato možnost je také pro virus velice výhodná, protože na úrovni ovladačů VxD je takový virus schopen úspěšně se ukrývat před antivirovými programy.
Tuto výhodu se samozřejmě moderní 32bitové viry naučily rychle využívat. Příkladem použití podobných technik je např. virus Junkie Memorial. Tento virus napsala známá skupina tvůrců virů VLAD na památku jejich kamaráda, který se předávkoval drogami. Tvůrci virů si v tomto případě uvědomili, že pouhou infekcí exe-programů pro Windows nemohou virus dostatečně daleko rozšířit. Proto virus napadá také klasické staré soubory s příponou .com. Infikované programy, pokud jsou spuštěny pod operačním systémem Windows, slouží jako droppery (vypouštěče virů) souborů VxD, které jsou po aktivaci viru zavedeny paměti a po jejich zavěšení do rozhraní IFS manageru je virus schopen lehce monitorovat veškeré souborové operace systému a dále se takto rozšířovat. Jmenovaný virus je velice komplexní a je schopen také infekce exe-souborů v DOSu i pe-souborů ve Windows. Samozřejmě využití zařízení VxD není jedinou cestou, kterou se mohou viry pod operačním systémem Windows šířit. Příkladem může být virus Cabanas.
Každý spustitelný program ve Windows 9x používá nejméně dvě základní volání API jádra systému. Jsou to funkce GetModuleHandleA a GetProcAddress. Odkazy na tyto funkce jsou uloženy v pe-programu, v tzv. tabulkách importu ve Windows. Analýzou této tabulky může virus zjistit další vstupní body do jádra Windows a potom je využívat pro svou replikaci (množení). Tento přístup má také další výhody, virus je např. přenositelný i pod operační systém Windows NT, na rozdíl od viru Boza, který je popsán dále, a který používá přímé vstupy do jádra Windows. Tyto vstupy se mohou s novými verzemi systému lišit.
Jak již bylo uvedeno, s příchodem nových moderních 32bitových operačních systémů, jako jsou Windows 9x, OS/2 či Windows NT, přichází také nástup nových 32bitových virů. Podívejme se tedy, jak tyto nové viry pracují.
I když viry psané pro operační systém MS-DOS představují i v dnešní době stále nebezpečí, jejich vliv bude postupem času ustupovat spolu s ustupujícím počtem používaných dosovských aplikací. Tvůrci virů tak budou postaveni před úkol přeorientovat se na nové prostředí a naučit se využívat jeho nedostatky ve prospěch svých úmyslů.
I když operační systém Windows je na trhu už více než osm let, zatím existuje velice malá skupina virů napsaná přímo pro toto prostředí. Hlavní příčinou je pravděpodobně úsilí vynaložené na napsání takového viru. Podíváme-li se na dnešní viry napsané pro MS-DOS, nejpočetnější skupina z nich jsou infektory com-souborů, které jakožto binární soubory představují nejjednodušší hostitele virů. Daleko méně početná skupina virů je schopna infikovat i exe-soubory, i když struktura těchto souborů je také velice jednoduchá. Struktura exe-aplikací ve Windows je v porovnání s exe-aplikacemi pro DOS daleko komplexnější a to je asi bariéra, kterou tvůrci virů zatím nechtějí zdolávat. Dá se proto očekávat, že v blízké budoucnosti nebude napsáno příliš mnoho virů určených k infekci 32bitových souborů, ale ty, co budou napsány, se zajisté budou vyznačovat velkou profesionalitou a budou tudíž představovat také velké nebezpečí.
Hlavní rozdíl mezi 32bitovými viry a dosovskými viry je ve struktuře hostitelských souborů, které je třeba napadnout. U com-souborů postačilo viru zapsat se na konec programu a na jeho začátek umístit skok na svoje tělo. Při infekci exe-souborů už bylo zapotřebí modifikovat adresu vstupního bodu programu, adresu zásobníku a několik proměnných určujících velikost souboru. Také bylo nutné pohlídat si exe-soubory obsahující překryvné moduly apod.
K pochopení náročnosti infekce 32bitových exe-souborů je třeba se nejprve stručně seznámit s jejich stavbou.
V operačních systémech Windows 9x a Windows NT se používá 32bitový formát spustitelných souborů, známý jako pe-format. (Jeho název je zkratkou od portable executable - tedy přenositelný formát). Je navržen tak, aby byl bez problémů přenositelný mezi různými platformami počítačových systémů s různými typy procesorů.
Pe-soubor, stejně jako 16bitový ne-formát používaný ve Windows 3.x, začíná starou známou dosovskou exe-hlavičkou a krátkým programem nazvaným STUB, který vás upozorní, že program musíte spustit pod operačním systémem Windows. Po této sekci následuje pe-hlavička a pole tzv. SECTION HEADERS, tedy pole hlaviček jednotlivých sekcí (oddílů) souboru. Následují jednotlivé sekce, které obsahují kód, neinicializovaná data, inicializovaná data, relokační tabulku apod. S ohledem na tuto strukturu pe-souborů se nabízí několik způsobů jejich možné infekce.
Vzhledem k tomu, že velikost jednotlivých sekcí v pe-souboru je zarovnána na násobek 512 bajtů, je možné umístit kód viru do nevyužité části některé sekce. Tento způsob infekce má samozřejmě několik zásadních nedostatků. Za prvé, virus je omezen při infekci pouze na takový typ souborů, které mají dostatek nevyužitého místa pro tělo viru, a za druhé, virus musí být samozřejmě menší než 512 bajtů, a to je dosti málo i pro jednoduchý infektor com-souborů. Naproti tomu, takový virus je schopen infikovat soubory beze změny jejich délky.
Náročnější způsob infekce pe-souborů spočívá v přidání další sekce kódu k souboru, do které umístíme tělo viru. Tento způsob infekce už vyžaduje náročnější modifikace pe-hlavičky, přidání další hlavičky sekce a samotné nové sekce.
Do třetice, nejnáročnějším způsobem infekce je zapsání těla viru do stávající kódové sekce. Tento postup vyžaduje dokonalé pochopení struktury pe-souborů a manipulaci s mnoha jeho položkami. Musí se posunout všechny sekce, které se nacházejí za sekcí kódu, a upravit velké množství relativních adres pe-souboru.
Zvládnutí technik infekce pe-souborů je zásadní věcí při psaní 32bitového viru.
Zbývající programování v asebleru pod operačním systémem Windows 9x se základní znalostí programování pod Windows již není tak složité, jak by se na první pohled mohlo zdát. Zatímco v prostředí MS-DOS použije virus při otevírání souboru vyvolání přerušení INT 21 s příslušnými parametry v registrech procesoru, v prostředí Windows uloží tyto parametry do zásobníku a skočí na příslušnou funkci API. Protože tyto funkce jsou samozřejmě externí a jsou součástí knihoven DLL operačního systému, je třeba nějak zjistit adresu dané funkce API. U normálních aplikací je tento proces úkolem zavaděče, který danou aplikaci spouští. Ten potom zjistí z informací zapsaných v pe-souboru, které knihovny DLL a které jejich funkce jsou aplikací volány, a korektně upraví na příslušných místech adresové odkazy na tyto funkce. Pokud však virus bude chtít využít těchto automatických relokací, nezbývá mu, než se pustit do náročnějších modifikací pe-souboru a zejména jeho relokační sekce.
I zde se však nabízí určité zjednodušení. Při startu Windows 9x jsou totiž hlavní moduly API, jako je např. modul KERNEL32.DLL, natahovány do paměti na stále stejné místo. Pokud si tedy, např. krokováním klasicky přeloženého programu, zjistíme adresy těchto funkcí, můžeme potom zjištěné vstupní body využít přímo bez využití importovacího mechanismu a složitého zpracování struktur pe-souboru. tento způsob má i svá úskalí. Budete-li takto koncipovaný virus chtít přenést např. z operačního systému Windows 9x do systému Windows NT, dojde samozřejmě k havárii, protože pod Windows NT se nebudou příslušné funkce vyskytovat na stejných adresách jako ve Windows 9x. Také nové verze systému by mohly podobně napsaným virům znepříjemnit život.
Prvním virem napsaným pro operační systém Windows 9x, který byl schopen infikovat 32bitové spustitelné soubory, byl virus Bizatch alias Boza, vytvořený začátkem roku 1996. Tento virus není paměťově rezidentní a při spuštění infikovaného souboru se pokusí vyhledat v aktuálním adresáři tři pe-soubory a napadnout je. Pokud zde nejsou soubory k dispozici, posouvá se virus po stromu adresářů směrem ke kořenovému adresáři a hledá dál. Po infekci tří souborů vrací virus řízení hostitelskému souboru. Každý třicátý den v měsíci vypíše virus hlášení. Virus není destruktivní, ale obsahuje chybu, kvůli níž může být hostitelský soubor špatně napaden a porušen. Délka viru je 2680 bajtů. Virus využívá přímého volání funkcí API operačního systému, jak jsme již vysvětlili, detekuje však, zda jsou příslušné funkce v paměti na očekávaných místech. Proto při spuštění infikovaného souboru pod Windows NT nedojde k havárii, ale virus se pod tímto operačním systémem také nebude množit.
Nezbývá než doufat, že se v brzké době nevyrojí spousta zákeřných virů napsaných pro nové operační systémy. Jejich čas určitě příjde a je třeba se na to důkladně připravit.