Souborové viry pro Windows - detaily
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/2000 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.
Délka sekcí je zarovnána na násobek 512 bajtů. S ohledem na tuto strukturu pe-souborů se nabízí několik způsobů jejich možné infekce.
Nezavirovaný PE EXE soubor:
|
Přepsání
Virus sice takto PE EXE soubor napadne, ale jeho původní obsah znehodnotí, podobně jako přepisující viry pro DOS.
 Přidání nové sekce
Jak už bylo řečeno, PE EXE soubor je rozdělen na sekce.
Velikost sekcí je uložena v hlavičce a viry ji můžou měnit (a taky to dělají,
převážně s poslední sekcí). Jediné omezení je, že velikost sekcí se zarovnává na násobek nějaké
hodnoty (taky zapsané v headeru), typicky na násobek 512.
Virus může vytvořit v PE souboru novou
sekci, uložit do ní svoje tělo a upravit hlavičku (header) PE souboru tak, aby se zavedl dříve než původní program (ten se dostane
na řadu až po zavedení viru).
|
Připojení k poslední sekci
S modifikací PE hlavičky
Virus se připojí do sekce s původním programem a modifikuje vstupní bod (entry point) v PE hlavičce tak, aby byl zaveden dříve než původní program (ten se dostane k řízení
opět až po provedení viru).
(vstupní bod - entry point - adresa místa, na kterém program "začíná")
|
Vložením JMP instrukce do kódu původního programu
Virus nemusí modifikovat entry point, protože do kódu původního programu vloží instrukci skoku (JMP), která se postará
o zavedení viru (ten pak předá řízení původnímu programu).
|
Cavity virus ("Mezerový" virus)
Technika, při které se virus "rozleje" do nevyužitých míst (a těch je hodně) PE souboru.
Napadený soubor má pak stejnou velikost jako původní originál.
Typickým příkladem viru z této kategorie může být virus Win32/CIH (Černobyl).
EPO technika (Entrypoint Obscuring)
Některé nové viry využívají techniku EPO. Jde o to, že virus nemodifikuje entry-point, ani na začátek kódu nevkládá nějakou instrukci skoku
(JMP), ale snaží se "zašít" někam nakonec. Virus se postará například o to, aby byl spuštěn až po zavolání určité API funkce původním programem.
Pokud si virus zajistí, aby byl spuštěn při volání funkce ExitProcess API, může si být jistý, že se bude aktivovat až na konci celého "mechanismu".
Idea EPO techniky je jasná: znesnadnit antivirům detekci. Emulátor kódu totiž většinou testuje pouze začátek programu (první instrukce) a na analýzu
má vyčleněnou velice krátkou dobu. Není tedy pravděpodobné, že by se dopracovala až k volání služby ExitProcess a virus tak objevila.