Každý proces disponuje svým vlastním virtuálním adresovým prostorem. Část tohoto prostoru ja mapována (téměř shodně ve všech procesech) do paměti jádra a z uživatelského režimu je nepřístupná. Zbytek slouží pro interní potřeby procesu samotného. Někdy se tato oblast také označuje jako privátní.
Privátní oblast se skládá z bloků paměti, které se mohou nacházet v některém z následujících stavů:
- Volný. Do takové paměti nelze přistupovat.
- Rezervovaný. Do bloku paměti také nelze přistupovat, správce virtuální paměti z něj navíc nebude alokovat stránky, pokud o to proces explicitně požádá.
- Alokovaný. Do takové paměti lze přistupoat podle nastaveného oprávnění stránek. Může se jednat buď o prostý alokovaný blok viditelný pouze pro daný proces, nebo o paměťově mapovaný soubor, který lze sdílet mezi více procesy.
Jádro si u každého procesu musí nějakým způsobem pamatovat, které bloky jeho virtuálního adresového prostoru jsou volné, rezervované či alokované. U některých z nich si potřebuje pamatovat ještě další informace.
Každý blok alokované či rezervované paměti jádro systému reprezentuje jedním virtuálním deskriptorem (Virtual Address Descriptor – VAD). Tyto deskriptory uchovává v AVL stromu, který zajišťuje rychlé vyhledávání podle adresy, rychlé přidávání a mazání. S tímto stromem tedy aplikace mohou nepřímo manipulovat prostřednictvím funkcí správce virtuální paměti, mezi které patří například VirtualAlloc, VirtualProtect, VirtualFree či VirtualQuery.
Protože mě velmi zajímalo, jak interně tyto deskriptory vypadají, rozhodl jsem se napsat aplikaci se jménem Vad a zařadit ji do ukázkových zdrojových kódů knihy. Aplikace sestává z ovladače vad.sys, který čte jednotlivé virtuální deskriptory, a aplikace vad.exe, která tyto informace zobrazuje.
Zkoumání virtuálních deskriptorů může být zajímavé i z hlediska dnešní bezpečnosti. Manipulací s těmito strukturami lze dosáhnout skrývání části paměti před zraky aplikací, a to pravděpodobně i na 64bitových verzích Windows. Virtuální deskriptory totiž pravděpodobně nejsou hlídány technologií PatchGuard.
Projekt Vad dovoluje virtuální deskriptory pouze číst. Pracuje jak na 32bitových, tak na 64bitových verzích operačního systému.
Upozornění: Ovladač vad.sys využívá k průchodu datovými strukturami jádra pevně definované offsety, tudíž nemusí fungovat na verzích Windows, na kterých jsem jej netestoval. Provedením malých změnt však lze toto napravit. Dále nepoužívá žádná synchronizační primitiva pro vyloučení chyb souběhu.
Program byl testován na následujících verzích Windows:
Systém | Verze kernelu | |
Windows XP 32bit | 5.1.2600 | |
Windows XP 64bit | 5.2.3790 | |
Windows Server 2003 R2 32bit | 5.2.3790 | |
Windows Server 2003 R2 64bit | 5.2.3790 | |
Windows Vista 32bit | 6.1.6002 | |
Windows Vista 64bit | 6.1.6002 | |
Windows 7 32bit | 6.1.7601 | |
Windows 7 64bit | 6.1.7601 |
Dobrý den,
mám jen dotaz. Mám v PC Win7 (64bit) a při spouštění se mi objeví informace, že je špatná komunikace s jádrem systemu. V čem je chyba? Co mohu udělat, abych to napravil. Předem děkuji.
St. Krobot.
Dobrý den,
předpokládám, že jste spustil program vad.exe jako administrátor (prošel jste dotazem UAC) a že jste spustil správnou verzi programu (32bitovou na 32bitovém OS a 64bitovou na 64bitové verzi OS). Podívám se na to.
Dobrý den,
právě jsem VAD otestoval na 32bitových Windows 7 SP1 a spouští se bez problémů. Na 64bitových verzích bude potřeba nainstalovat certifikát windows.cer, podrobnosti (včetně samotného certifikátu) jsou v příspěvku “Testování ovladačů na 64bitových Windows”.