Runtime režimu ladění jádra systému Windows 7. Jak funguje debugger

  • autoři:

    Barinov S.S., Shevchenko O.G.

  • Rok:
  • Zdroj:

    Informatika a počítačové technologie / Materiály VI mezinárodní vědeckotechnické konference studentů, postgraduálních studentů a mladých vědců - 23.-25. listopadu 2010, Doněck, DonNTU. - 2010. - 448 s.

anotace

Je poskytnuta srovnávací analýza uživatelského režimu ladění a režimu jádra ve vztahu k operačnímu systému Microsoft Windows, jsou zdůrazněny rozdíly a problémy organizace ladění operačního systému Microsoft Windows. Na základě získaných výsledků jsou formulovány základní požadavky na budování debuggerů v režimu jádra v případě nouzového a interaktivního ladění. Byla provedena analýza stávajících řešení pro shodu s požadavky. Zvláštní pozornost je věnována programu Microsoft Windows Debugger.

Hlavní část

Ladění je proces identifikace a odstraňování příčin chyb v softwaru. V některých projektech zabere ladění až 50 % celkového času vývoje. Ladění lze výrazně zjednodušit pomocí specializovaných nástrojů, které jsou neustále vylepšovány. Hlavním takovým nástrojem je debugger, který vám umožňuje řídit provádění softwaru, sledovat jeho průběh a zasahovat do něj. Nástroje pro ladění jádra používají především vývojáři ovladačů.

Nástroje pro vývoj aplikačního softwaru nabízejí programátorovi širokou škálu možností. Jakékoli integrované vývojové prostředí zahrnuje schopnost ladit bez nutnosti používat nástroje třetích stran. Pokud se bavíme o systémovém softwaru a vývoji ovladačů konkrétně, tak vzhledem ke svým specifikům je proces vývoje extrémně náročný a málo automatizovaný. Všechny vývojové fáze, včetně ladění, jsou samostatné. Pro provedení každého z nich jsou vyžadovány zvláštní podmínky: zápis programového kódu se provádí na plnohodnotném počítačovém systému, ladění se provádí na ladicím systému, testování se provádí v závislosti na okolnostech atd. Samotný debugger režimu jádra je obtížnější se naučit, a proto je méně přátelský.

Obecně lze mluvit o nedostatku nástrojů pro ladění jádra. I když jsou takové prostředky k dispozici, často se nemluví o alternativách. Například ladicí program Microsoft Windows má velmi vysokou vstupní prahovou hodnotu. Mnoho programátorů při setkání s ním mluví o první negativní zkušenosti a většina jeho schopností zůstává nevyužita.

Na základě struktury virtuálního adresového prostoru, pokud aplikace udělá chybu, která způsobí, že aplikace zapíše data do libovolného paměťového místa, aplikace poškodí pouze svou vlastní paměť a neovlivní provoz ostatních aplikací a operačního systému. . Zatímco programový kód režimu jádra je schopen poškodit důležité datové struktury operačního systému, což nevyhnutelně povede k obecnému selhání. Neefektivně napsaný ovladač může také způsobit vážnou degradaci celého operačního systému.

    Moderní debuggery poskytují následující základní funkce:
  • ladění na úrovni zdrojového kódu;
  • exekuční řízení;
  • prohlížení a změna paměti;
  • prohlížení a změna obsahu registrů procesoru;
  • prohlížení zásobníku hovorů.

Pro usnadnění práce s rozebraným kódem, tzv. ladicí symboly. Za běhu linkeru lze kromě obrazu spustitelného souboru vytvořit také datový soubor obsahující informace, které nejsou vyžadovány při spouštění programu, ale jsou mimořádně užitečné při jeho ladění: názvy funkcí, globální proměnné, popisy struktur. Symboly ladění jsou k dispozici pro všechny spustitelné soubory operačního systému Windows.

Řízení provádění se týká schopnosti přerušit a obnovit provádění programového kódu po dosažení zadaného příkazu v programovém kódu. Pokud je programový kód vykonáván v režimu krok za krokem, dojde k přerušení pro každý prvek programovacího jazyka nebo při ukončení podprogramu. Při volném provádění dochází k přerušením provádění v předem určených úsecích kódu – v místech, kde jsou nastaveny body přerušení.

Při přerušení kódu režimu jádra vzniká následující dilema. Ladicí program používá uživatelské rozhraní pro interakci s programátorem. Tito. alespoň viditelná část ladicího programu běží v uživatelském režimu a k jeho sestavení přirozeně používá aplikační programovací rozhraní (Windows API), které zase spoléhá na moduly režimu jádra. Pozastavení kódu režimu jádra tedy může vést k uváznutí: systém přestane reagovat na požadavky uživatelů.

Pro přístup k paměti jádra musí části ladicího programu také běžet v režimu jádra. To vede ke dvěma problémům najednou, které jsou zřejmým důsledkem organizace paměti v chráněném režimu procesoru.

První problém se týká překladu adres virtuální paměti. Ovladače neustále komunikují s aplikacemi v uživatelském režimu přístupem k jejich paměti. Operační systém Windows převádí virtuální adresy na fyzické na základě konceptu kontextu vlákna. Kontext vlákna je struktura, která odráží stav vlákna a zahrnuje zejména sadu registrů a některé další informace. Když je řízení přeneseno do jiného vlákna, dojde ke změně kontextu, která uloží informace o jednom vláknu a obnoví informace o jiném. Když se kontext vlákna přepne na vlákno jiného procesu, přepne se také adresář stránek používaný k překladu virtuálních adres na fyzické.

Zvláštností je, že při odesílání systémových volání operační systém Windows nepřepíná kontext. To umožňuje kódu v režimu jádra používat virtuální adresy v uživatelském režimu.

Jiná situace je při odesílání přerušení nebo provádění systémových vláken. K přerušení může dojít kdykoli, takže neexistuje způsob, jak předpovědět, který kontext vlákna bude použit. Systémová vlákna nepatří k žádnému procesu a nemohou překládat virtuální adresy v uživatelském režimu. Z toho vyplývá, že v těchto situacích nelze přistupovat k paměti uživatelského režimu.

Druhým problémem je přístup k přemístitelné paměti. Většina informací v paměti je přemístitelná a lze je kdykoli přesunout z fyzické paměti na pevný disk do stránkovacího souboru. Pokud se přistoupí na stránku, která není ve fyzické paměti, procesor normálně vygeneruje přerušení Page Fault, které by zpracoval správce paměti, což vedlo k načtení stránky ze souboru stránky a načtení do fyzické paměti.

Toto chování se rozpadne, pokud je kód ladicího programu nucen používat vysoké úrovně požadavků na přerušení (IRQL). Pokud IRQL odpovídá nebo překračuje IRQL správce paměti, správce paměti nebude moci načíst chybějící stránku, protože operační systém zablokuje přerušení Page Fault. To způsobí zhroucení operačního systému.

Ladění se obvykle dělí na interaktivní a nouzové. Při interaktivním místním ladění běží ladicí program na stejném systému jako ladicí program. Při interaktivním vzdáleném ladění běží ladicí program a objekt ladění na různých systémech. Při ladění kódu jádra je nutné systém ovládat již od prvních fází jeho bootování, kdy síť ještě nefunguje, proto se ke komunikaci mezi systémy používají jednoduchá sériová rozhraní jako COM, FireWire, USB. V poslední době se díky vývojovým trendům virtualizace softwaru na různých úrovních abstrakce stále více využívají virtuální stroje. Hostující OS funguje jako ladicí OS, hostovaný OS obsahuje uživatelské rozhraní debuggeru.

Proto nouzové ladění nevyžaduje instalaci nástroje pro ladění na testovací počítač. Distribuce operačního systému Windows obsahuje mechanismy pro implementaci nouzového ladění. Před restartem může operační systém uložit informace o svém stavu, které může vývojář analyzovat a zjistit důvod. Takové informace uložené do souboru se nazývají výpis paměti.

Základní nástroje pro ladění režimu jádra poskytuje samotný výrobce operačního systému Windows jako součást volně distribuovaného balíčku Debugging Tools for Windows. Mezi nástroje patří grafické a konzolové debuggery WinDbg, respektive KD (dále jen Windows Debugger). Práce těchto debuggerů je založena na mechanismech poskytnutých vývojáři operačního systému a zabudovaných do jeho jádra.

Hlavním režimem pro Windows Debugger je režim příkazového interpretu. Díky své modulární struktuře podporuje Windows Debugger kromě příkazů dodaných vývojářem moduly třetích stran nazývané rozšíření. Ve skutečnosti je většina vestavěných příkazů také zabalena jako rozšíření.

Windows Debugger je zaměřen na vzdálené interaktivní a nouzové ladění, které při použití odhalí všechny své možnosti. Současně není podporováno úplné místní interaktivní ladění: ladicí program vám umožňuje zobrazit pouze některé struktury jádra.

Existuje rozšiřující modul pro Windows Debugger s názvem LiveKD, vytvořený Markem Russinovichem, který v jistém smyslu implementuje místní interaktivní ladění. LiveKD vytváří výpis paměti fungujícího systému za chodu a používá jej k ladění.

Balíček Debugging Tools for Windows je pravidelně aktualizován a podporuje všechny moderní operační systémy Windows.

Debugger jádra SoftICE, produkovaný společností Compuware v softwarovém balíčku DriverStudio, byl tradičně alternativou k balíčku Debugging Tools for Windows. Charakteristickým rysem SoftICE byla implementace místního interaktivního ladění na podporovaném hardwaru. Ladicí program mohl téměř úplně ovládat provoz operačního systému.

K 3. dubnu 2006 byl prodej produktů řady DriverStudio ukončen z důvodu „četných technických a obchodních problémů a také všeobecných podmínek na trhu“. Poslední podporovanou verzí operačního systému je Windows XP Service Pack 2. Aktualizace Service Pack obvykle nemění aplikační rozhraní operačního systému, ale čísla systémových volání a další nezdokumentované informace se mohou změnit. Ladicí program SoftICE spoléhal na pevně zakódované adresy interních datových struktur. V důsledku toho byla s vydáním aktualizace Service Pack 3 narušena kompatibilita. Je zřejmé, že novější verze operačního systému Windows také nejsou podporovány.

Syser Kernel Debugger byl vytvořen malou čínskou společností Sysersoft jako náhrada za SoftICE debugger. První finální verze byla vydána v roce 2007. Stejně jako SoftICE je i Syser Kernel Debugger schopen interaktivního ladění na běžícím systému. Podporovány jsou pouze 32bitové edice moderních verzí systému Windows.

V současné době je Windows Debugger hlavním nástrojem mezi vývojáři modulů jádra. Používá jej také tým jádra operačního systému Windows.

Tato série článků se objevila ze dvou důvodů. V první řadě mě baví práce s projektem HackSysExtremeVulnerableDriver. Za druhé jsem obdržel hodně přání k pokrytí tohoto tématu.

Veškerý kód použitý při psaní této série je v mém úložišti.

V této sérii článků se podíváme na psaní exploitů na úrovni jádra ve Windows. Je důležité poznamenat, že se budeme zabývat známými zranitelnostmi a není potřeba zpětné inženýrství (alespoň u ovladače).

Očekává se, že po přečtení všech článků budete znát všechny nejběžnější třídy zranitelností a způsoby zneužití a také budete schopni přenést exploity z architektury x86 na architekturu x64 (pokud je to možné) a seznámíte se s novými metodami ochrany. ve Windows 10.

Obvod ladění jádra

Na rozdíl od ladění na úrovni uživatele, které pozastavuje provádění jednoho procesu, ladění na úrovni jádra zahrnuje celý systém a tuto metodu nebudeme moci použít. V souladu s tím je zapotřebí samostatný ladicí stroj, který dokáže komunikovat se systémem, kde se jádro ladí, prohlížet paměť a struktury jádra a také zachycovat pády systému.

Další materiál ke studiu:

Zneužití zranitelností jádra

Tento proces je mnohem zábavnější než provoz na uživatelské úrovni J.

Hlavním cílem je dosáhnout privilegovaného provádění v kontextu jádra. A pak už vše závisí na naší fantazii, od hostiny s domácím pivem až po zavedení státem podporovaného malwaru.
Obecně je naším úkolem získat shell se systémovými oprávněními.

Témata článků v této sérii

  • Část 1: Nastavení pracovního prostředí
    • Konfigurace tří virtuálních strojů a systému, který bude fungovat jako debugger.
    • Konfigurace ladicího programu WinDBG.
  • Část 2: Užitečné zatížení
    • Prozkoumejte nejběžnější užitečné zatížení. Následující části se budou zabývat konkrétními zranitelnostmi a tam, kde je to vhodné, poskytnou odkazy na tento článek.
  • Zbývající části.
    • Zvažování zranitelností.

Životní cyklus vývoje využívající jádro

  • Nalezení zranitelnosti. Toto téma nebude v této sérii probíráno, protože už přesně víme, kde jsou mezery.
  • Zachycení vlákna provádění. Některé chyby zabezpečení zahrnují spuštění kódu a některé mají další požadavky.
  • Eskalace privilegií. Hlavním cílem je získat shell se systémovými oprávněními.
  • Obnovení vlákna provádění. Nekontrolované výjimky na úrovni jádra způsobují pád systému. Pokud se nechystáte napsat exploit pro DoS útok, měli byste tuto skutečnost vzít v úvahu.

Typy cílových systémů

Budeme pracovat se zranitelnostmi v následujících systémech (konkrétní verze není důležitá):

  • Win7 x86 VM
  • Win7 x64 VM
  • Win10 x64 VM

Začněme architekturou x86 a poté exploit přeneseme na systém Win7 x64. Některé exploity nepoběží na počítačích s Win10 kvůli přítomnosti nových ochran. V tomto případě buď změníme logiku exploitu, nebo použijeme úplně jiný přístup.

Použitý software:

  • Hypervisor (spousta možností).
  • Windows 7 x86 VM
  • Windows 7 x64 VM
  • Windows 10 x64 VM

Nastavení systémů pro ladění

Ladicí systémy, se kterými budeme komunikovat, jsou navrženy tak, aby načetly zranitelný ovladač. Tyto stroje budou často padat, protože k tomuto typu jevu přispívá většina výjimek v jádře. Pro tyto systémy musíte přidělit dostatek paměti RAM.

Na každém počítači, který bude laděn, musíte provést následující:

  • V adresáři VirtualKD spusťte soubor target\vminstall.exe. Bude přidána nová spouštěcí položka a budou k dispozici ladicí funkce a v systému nainstalováno automatické připojení k serveru VirtualKD, který funguje jako debugger.

V případě Windows 10 VM je potřeba povolit testovací režim podepisování, který umožňuje načíst nepodepsané ovladače do jádra.

Po spuštění bcdedit /set testinging on command a restartu se na ploše objeví „Test Mode“.

Stručný popis modulu HEVD

Procedura DriverEntry je startovací procedura pro každého řidiče:

NTSTATUS DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) (
UINT32 i = 0;
PDEVICE_OBJECT DeviceObject = NULL;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
UNICODE_STRING Název zařízení, DosDeviceName = (0);

UNREFERENCED_PARAMETER(Cesta registru);
KÓD_STRÁNKY();

RtlInitUnicodeString(&Název zařízení, L"\\Zařízení\\HackSysExtremeVulnerableDriver");
RtlInitUnicodeString(&DosDeviceName, L"\\DosDevices\\HackSysExtremeVulnerableDriver");

//Vytvořte zařízení
Stav = IoCreateDevice(DriverObject,
0,
&Název zařízení,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
NEPRAVDIVÉ
&DeviceObject);

  • Tato procedura obsahuje volání funkce IoCreateDevice, která obsahuje jméno ovladače, který budeme při komunikaci používat.
  • Do objektu DriverObject budou přidány potřebné struktury a ukazatele funkcí.
  • Pro nás je důležitý funkční ukazatel spojený s procedurou DriverObject->MajorFunction, který je zodpovědný za zpracování IOCTL (I/O Control);
  • V HEVD se tato funkce nazývá IrpDeviceIoCtlHandler, což je velký podmíněný výraz s mnoha větvemi pro každý IOCTL. Každá chyba zabezpečení má jedinečný IOCTL.

Příklad: HACKSYS_EVD_IOCTL_STACK_OVERFLOW je IOCTL používaný ke spuštění zneužití přetečení zásobníku.

Tím končí první část. V příštím článku si povíme o užitečné zátěži. V tuto chvíli je jediným dostupným nákladem ten určený ke krádeži tokenů, který bude použit ve třetím díle.

P.S. Chápu, že existuje spousta složitostí a problémů, se kterými se můžete setkat. Protože se tato série zaměřuje na vývoj exploitů, budete muset vyřešit všechny související problémy sami. V komentářích se však můžete zeptat na jakékoli otázky.

chPF OELPFPTSCHE KHLBBOYS RP TBVPFE U PFMBDLPK SDTB U BCHBTYKOSHNY DBNRBNY RBNSFY. lBL RTBCHYMP, CHBN OHTSOP VKDEF ЪBDBFSH PDOP YЪ KHUFTPKUFCH RPDLBYULY, RETEYUYUMEOOSCHI CH ZHBKME /etc/fstab . uvtpu pvtbpch RBNSFY O KHUFTPKUFCHB, OE SCHMSAEYEUS KHUFTPKUFCHBNY RPDLBYULY, OBRTYNET, MEOFSHCH, CH DBOOSCHK NPNEOF OE RPDDETSYCHBAFUS.

Poznámka: yURPMSHHKFE LPNBODH dupon (8) DMS KHLBBOYS SDTH NEUFB, ZDE OHTsOP UPITBOSFSH BCHBTYKOSHCHE DBNRSCH. rPUME OBUFTPKLY RP LPNBODE swapon (8) TBDEMB RPDLBYULY DPMTSOB VSHCHFSH CHSHCHBOB RTPZTBNNNB dumpon . pVSHYUOP LFP CHSHRPMOSEPHUS ЪBDBOYEN RETENOOOPK dumpdev CH ZHBKME rc.conf (5). еUMY ЪБДБOB ьФБ RATENEOOBS, FP RPUME UVPS RTY RETCHPK NOPZPRPMSHЪPCHBFEMSHULPK RETEЪBZTHЪLE VHDEF BCHFPNBFYUEULY ЪBRHEEOOB RTPZTBNNNB savecore (8). pOB UPITBOIF BCHBTYKOSHCHK DBNR SDTB CH LBFBMPZ, ЪBDBOOSCHK CH RETENEOOOPK dumpdir ZHBKMB rc.conf . rP KHNPMYUBOYA LBFBMPZPN DMS BCHBTYKOSCHI DBNRPCH SCHMSEFUS /var/crash .

mYVP CHSC NPTSEFE ЪBDBFSH KHUFTPKUFCHP DMS UVTPUB PVTBB RBNSFY SCHOP YUETE RBTBNEFT výpis CH UFTPLE config LPOZHYZHTBGYPOOPZP ZHBKMB CHBYEZP SDTB. fblpk urpupv yurpmshъpchbfsh oe telpneodhefus y od dpmtseo yurpmshbsbshus, fpmshlp eumy chsch ipfyfe rpmkhyubfsh bchbtykoshch pvtbsch rbnsfy Fh rty ъbzthъle.

Poznámka: dBMEE FETNYO gdb PYOBYUBEF PFMBDYUYL gdb , ЪBRHEEOOSCHK CH ``TETSINE PFMBDLY SDTB". RETEIPD CH LFPF TETSYN DPUFYZBEFUS ЪBRHULPN gdb U RBTBNEFTPN -k . h TETSYNE PFMBDLY SDTB gdb YЪNEOSEF UCHPЈ RTYZMBYEOYE O (kgdb) .

Spropitné: eUMY CHSH YURPMSHJHEFE FreeBSD CHETUYY 3 YMY VPMEE TBOOAA, CHCH DPMTSOSCH CHSHRPMOYFSH HUEYEOYE PFMBDPUOPZP SDTB LPNBODPK pásek, B OE KHUFBOBCHMYCHBFSH VPMSHYPE PFMBDPUOPE SDTP PFMBDPUOPE

# cp kernel kernel.debug # strip -g kernel

bFPF YBZ OE FBL KhTS Y OEPVIPDYN, OP TELPNEODKHEN. (PH FreeBSD 4th VPMEE TEMYYBI LFPF YBZ CHSPRMOSEFUS BCHFPNBFYUEULY CH LPOGE RTPGEUUB RPUFTPEOOYS SDTB make.) lPZDB SDTP HUEYEOP, BCHFPNBFYUEULY YMY RT RPNPEY, LPCHNBFY RPNPEY, LPCHNBY KCHFYCHFY SCHN PVTBBPN, OVTTBCH provést instalaci.

ъBNEFSHFE, YuFP CH UFBTSHCHETUISI FreeBSD (DP 3.1, OE CHLMAYUBS LFPF TEMY), YURPMSHHEFUS SDTB CH ZHTNBFE a.out, RPFPNH YI FBVMYGSH UYNCHPMPCH DPMTNSSOSCH TBURPMBZBOPFShu S RPURPMBZBFShu. u VPMSHYPK FBVMYGEK UYNCHPMPCH CH OE HUEYOOOPN PFMBDPUOPN SDTE LFP YЪMYYOSS FTBFB. rPUMEDOYE TEMYYSH FreeBSD YURPMSHJHAF SDTB CH ZHTNBFE ELF, ZHE LFP OE SCHMSEFUS RTPVMENPK.

eUMY CHCH FEUFYTHEFE OPChPE SDTP, ULBTSEN, OBVYTBS YNS OCPCHPZP SDTB CH RTYZMBYYE OYBZTHYUYLB, OP CHBN OHTSOP ЪBZTHTSBFSH Y TBVPFBFSH U DTHZYN SDTPN, SC ZHCHOPYHFMSHO NHCHOPYHFMS , ЪBZTHTSBKFE EZP FPMSHLP CH PDOPRPMSHЪPCHBFEMSHULPN TETSYNE RTY RPNPEY ZHMBZB -s , KHLBSCCHBENPZP RTY ЪБЗТХ ЪLE, B ЪBFEN CHSHCHRPMOYFE FBLYE YBZY:

# fsck -p # mount -a -t ufs # takže váš souborový systém pro /var/crash je zapisovatelný # savecore -N /kernel.paniced /var/crash # exit # ...pro více uživatelů

bFB RPUMEDPCHBFEMSHOPUFSH KHLBSCCHBEF RTPZTBNNE savecore (8) O YURPMSHЪPCHBOYE DTHZPZP SDTB DMS YЪCHMEYUEOYS UYNCHPMYUEULYI YNEO. YOBYUE POB VKhDEF YURPMSHЪPCHBFSH SDTP, TBVPFBAEE CH DBOOSHK NPNEOF Y, ULPTEE CHUEZP, OYUEZP OE UDEMBEF, RPFPNH YuFP BCHBTYKOSHCHK PVTB RBNSFY YYNCHPMSCH SDSHUS F PFMYUBFSCH

b FERETSH, RPUME UVTPUB BCHBTYKOPZP DBNRB, RETEKDYFE CH LBFBMPZ /sys/compile/WHATEVER Y ЪBRKHUFYFE LPNBODH gdb -k . yЪ RTPZTBNNSH gdb UDEMBKFE CHPF SFP:

Symbol-file kernel.debug exec-file /var/crash/kernel.0 core-file /var/crash/vmcore.0 Y CHBMS - CHCH NPTSEFE PFMBTSYCHBFSH BCHBTYKOSHK DBNR, YURPMSHЪHS YUIPDOSCH FELUFSCH SDTB, LBLAT DSHEMCH FBLCEFE MAVPC DTHZPK RTPZTBNNPK.

chPF TsKHTOBM LPNBOD UEBOUB TBVPFSH gdb, YMMAUFTYTHAEIK bfh RTPGEDHTH. dMYOOSCH UFTPLY VSHMY TBPTCHBOSH DMS KHMHYUYEOYS YUYFBVEMSHOPUFY Y DMS KHDPVUFCHB UFTPLY VSHCHMY RTPOKHNETPCHBOSHCH. CHUE PUFBMSHOPE SCHMSEFUS FTBUUYTPCHLPK PYYVLY, TEBMSHOP CHPOYLOKHCHYEK PE CHTENS TBVPFSCH OBD DTBKCHETPN LPOUPMY pcvt.

1:Skript byl spuštěn v pátek 30. prosince 23:15:22 1994 2: # cd /sys/compile/URIAH 3: # gdb -k kernel /var/crash/vmcore.1 4:Čtení dat symbolů z /usr/src/ sys/compile/URIAH/kernel ...hotovo. 5:IdlePTD 1f3000 6:panic: protože jsi řekl! 7:aktuální PCB na 1e3f70 8:Čtení symbolů pro ../../i386/i386/machdep.c...hotovo. 9: (kgdb) kde 10:#0 boot (arghowto=256) (../../i386/i386/machdep.c řádek 767) 11:#1 0xf0115159 v panice () 12:#2 0xf01955bd v dieiedie ( ) (../../i386/i386/machdep.c řádek 698) 13:#3 0xf010185e v db_fncall () 14:#4 0xf0101586 v db_command (-266509132, 5299132, -7263) xf0101711in db_command_loop () 16:#6 0xf01040a0 v db_trap () 17:#7 0xf0192976 v kdb_trap (12, 0, -272630436, -266743723) 18:f0) v 019200 trapeb 019ce60 v trap_pfault ( ...) 20:#10 0xf019cb2f v pasti (...) 21:#11 0xf01932a1 ve výjimce:calltrap () 22:#12 0xf0191503 v cnopen (...) 23:#13 0xf0132_open (24 v spec. : #14 0xf012d014 in vn_open () 25:#15 0xf012a183 in open () 26:#16 0xf019d4eb v syscall (...) 27: (kgdb) up 10 28:Čtení symbolů pro ../ i386/ i386 /trap.c...hotovo. 29:#10 0xf019cb2f v pasti (frame=(tf_es = -260440048, tf_ds = 16, tf_\ 30:edi = 3072, tf_esi = -266445372, tf_72ebp = -2:2 30396, tf_ebx = - 266427884, tf_edx = 12, tf_ecx = -266427884, tf\ 32:_eax = 64772224, tf_trapno = 12, tf_err = -272695296, 272695296, tf2 3 - 3, 3, 6 -2 664693 68, tf_eflags = 66066, tf_esp = 3072 , tf_\ 34:ss = -266427884)) (../../i386/i386/trap.c řádek 283) 35:283 (void) trap_pfault(&frame, FALSE); 36: (kgdb) frame frame->tf_ebp frame->tf_eip 37:Čtení symbolů pro ../../i386/isa/pcvt/pcvt_drv.c...hotovo. 38:#0 0xf01ae729 v pcopen (dev=3072, příznak=3, režim=8192, p=(struct p\ 39:roc *) 0xf07c0c00) (řádek ../../i386/isa/pcvt/pcvt_drv.c 403) 40:403 návrat ((*linesw.l_open)(dev, tp)); 41: (kgdb) seznam 42:398 43:399 tp->t_state |= TS_CARR_ON; 44:400 tp->t_cflag |= CLOCAL; /* nemůže být modem (:-) */ 45:401 46:402 #if PCVT_NETBSD || (PCVT_FREEBSD >= 200) 47:403 návrat ((*linesw.l_open)(dev, tp)); 48:404 #else 49:405 return ((*linesw.l_open)(dev, tp, flag)); 50:406 #endif /* PCVT_NETBSD || (PCVT_FREEBSD >= 200) */ 51:407 ) 52: (kgdb) tisk tp 53:Čtení symbolů pro ../../i386/i386/cons.c...hotovo. 54:$1 = (struct tty *) 0x1bae 55: (kgdb) tisk tp->t_line 56:$2 = 1767990816 57: (kgdb) nahoru 58:#1 0xf0191503 v cnopen (dev=0x000000) (dev=0x00000000 , p=(st\ 59:ruct proc *) 0xf07c0c00) (../../i386/i386/cons.c řádek 126) 60: return ((*cdevsw.d_open)(dev, příznak, režim, p) ); 61: (kgdb) nahoru 62:#2 0xf0132c34 ve spec_open () 63: (kgdb) nahoru 64:#3 0xf012d014 ve vn_open () 65: (kgdb) nahoru 66:#4 0xf012a183: (kg)db ()db up 68:#5 0xf019d4eb v syscall (frame=(tf_es = 39, tf_ds = 39, tf_edi =\ 69: 2158592, tf_esi = 0, tf_ebp = -27263848isp = -2726384836, t_ ebx = 708 6, tf_edx = 1, tf_ecx = 0, tf_eax = 5, tf_trapno = 582, \ 71:tf_err = 582, tf_eip = 75749, tf_cs = 31, tf_eflags = tf_7:82, 6 = 5 ss = 39)) (. ./../i386/i386/trap.c řádek 673) 73:673 chyba = (*callp->sy_call)(p, args, rval); 74: (kgdb) nahoru 75: Vybrán počáteční snímek; nemůžete jít nahoru. 76: (kgdb) quit 77: # exit 78:exit 79: 80:Skript hotový v pátek 30. prosince 23:18:04 1994

lPNNEOFBTYY L CHSHCHYYERTYCHEDEOOPNH TSHTOBMKH:

UFTPLB 6:

ьФП DBNR, CHSFSHCHK RTY RPNPEY DDB (UNPFTY OITSE), RPPFPNH LPNNEOFBTYK L BCHBTYKOPNH PUFBOPCHH YNEEF YNEOOP CHYD ``protože jsi řekl!'' Y FTBUUYTPCHLB UFELB ZMHVPLB; PDOBLP YOBYUBMSHOPK RTYYUYOPK RETEIPDB CH DDB VSHMB BCHBTYKOBS PUFBOPCHLB RTY CHPOYLOPCHEOYA PYYVLY UFTBOIGSC RBNSFY.

UFTPLB 20:

lFP NEUFPOBIPTSDEOOYE ZHKHOLGYY past() CH FTBUUYTPCHLE UFELB.

UFTPLB 36:

rTYOKHDIFEMSHOPE YURPMSHЪPCHBOIE OPChPK ZTBOYGSCH UFELB; FERTSH LFP OE OHTSOP. rTEDRPMBZBEFUS, YuFP ZTBOYGSCH UFELB KHLBSCCHBAF O RTBCHYMSHOP TBURPMPTSEOYE, DBCE CH UMHUBE BCHBTYKOPZP PUFBOPCHB. zMSDS O UFTPLH YUIPDOPZP LPDB 403, NPTsOP ULBBFSH, YuFP CHEUSHNB CHETPSFOP, YuFP MYVP CHYOPCHBF DPUFHR RP KHLBBFEMA ``tp"", MYVP VSHM CHSHCHIPD ЪB ZТBOYGSC NBUYCHBSC.

UFTPLB 52:

rPIPTSE, YuFP CHYOPCHBF KHLBBFEMSH, OP NA SCHMSEFUS DPRKHUFYNSCHN BDTEUPN.

UFTPLB 56:

pDOBLP, PYUECHYDOP, UFP NA KHLBSCCHBEF O NHUPT, FBL UFP NSCH OBYMY OBYKH PYYVLH! (DMS FEI, LFP OE OBLPN U LFPC YUBUFSHHA LPDB: tp->t_line UMHTSYF DMS ITBOEOYS TETSYNB LBOBMSB LPOUPMSHOPZP HUFTPKUFCHB, Y LFP DPMTSOP VShchFSH Y DPUFBFPYuOP GEMPE NBME.

Termín "ladění jádra" znamená zkoumání vnitřní datové struktury jádra a/nebo postupné sledování funkcí v jádře. Toto ladění je velmi užitečný způsob, jak prozkoumat vnitřní fungování systému Windows, protože vám umožňuje zobrazit interní systémové informace, které nejsou dostupné žádným jiným způsobem, a poskytuje jasný obrázek o postupu kódu v jádře.

Než se podíváme na různé způsoby ladění jádra, podívejme se na sadu souborů, které budete potřebovat k provedení jakéhokoli druhu ladění jádra.

Symboly pro ladění jádra

Soubory symbolů obsahují názvy funkcí a proměnných a také návrh a formát datových struktur. Jsou generovány programem linker a jsou používány ladicími programy k odkazování na tyto názvy ak jejich zobrazení během relace ladění. Tyto informace obvykle nejsou uloženy v binárním kódu, protože nejsou potřebné při provádění kódu. To znamená, že bez něj se binární kód zmenší a běží rychleji. To ale také znamená, že při ladění musíte zajistit, aby měl ladicí program přístup k souborům symbolů souvisejícím s binárními obrázky, na které se odkazuje během relace ladění.

Chcete-li použít jakýkoli ladicí nástroj v režimu jádra k prozkoumání vnitřních částí datové struktury jádra Windows (seznam procesů, seznam bloků vláken, seznam načtených ovladačů, informace o využití paměti atd.), potřebujete správné soubory symbolů a na minimálně soubor symbolů pro binární obraz jádra - Ntoskrnl.exe. Soubory tabulky symbolů musí odpovídat verzi binárního obrazu, ze kterého byly extrahovány. Pokud jste například nainstalovali aktualizaci Windows Service Pack nebo nějakou opravu, která aktualizuje jádro, musíte odpovídajícím způsobem aktualizovat soubory symbolů.

Je snadné stáhnout a nainstalovat symboly pro různé verze systému Windows, ale aktualizace symbolů pro opravy není vždy možná. Nejjednodušší způsob, jak získat požadovanou verzi symbolů pro ladění, je kontaktovat server symbolů společnosti Microsoft speciálně navržený pro tento účel pomocí speciální syntaxe pro cestu symbolů zadanou v ladicím programu. Například následující cesta k symbolu způsobí, že ladicí nástroje stahují symboly z online serveru symbolů a ukládají místní kopii do c:\symbols:srv*c:\symbols*http://msdl.microsoft.com/download/ symboly

Podrobné pokyny pro použití symbolového serveru lze nalézt v souboru nápovědy k ladicím nástrojům nebo online na adrese http://msdn.microsoft.com/en-us/windows/hardware/gg462988.aspx.

Jak spustit ladicí program jádra?

Mistrova odpověď:

V procesu vývoje softwaru je jedna velmi důležitá součást – ladění. Ve vztahu k aplikačním programům se provádí prostředky, které fungují v uživatelském režimu a jsou často zabudovány do IDE. Abyste mohli ladit například ovladače, musíte spustit ladicí program jádra.

Musíte spustit příkazový procesor cmd. Otevřete nabídku Start na hlavním panelu. V zobrazeném okně klikněte na položku „Spustit…“. Zobrazí se okno „Spustit program“. Do textového pole zadejte cmd a klikněte na OK.

Nyní zálohujte svůj soubor boot.ini. Nejprve zjistěte instalační cestu vaší aktuální kopie systému Windows pomocí příkazu: echo %SystemRoot%

Dále přejděte na disk s nainstalovaným operačním systémem zadáním písmen zařízení a dvojtečky. Pomocí příkazu cd přejděte do kořenového adresáře. Nyní pomocí příkazu attrib odeberte ze souboru boot.ini atributy "hidden", "read-only" a "system". Pomocí příkazu copy vytvořte záložní kopii a poté nastavte atributy.

Chcete-li zobrazit aktuální seznam možností spouštění, použijte příkaz bootcfg /query. Prohlédněte si seznam a určete prvek, na jehož základě budou vytvořena nová nastavení s možností ladění v režimu jádra. Je třeba si zapamatovat ID spouštěcí položky.

K vytvoření zaváděcí položky použijte příkaz bootcfg/copy. Chcete-li zadat ID záznamu, který budete kopírovat, použijte parametr /id. Pomocí možnosti /d zadejte název položky, která se zobrazí. Nyní se musíte vrátit na seznam možností spouštění pomocí příkazu bootcfg /query a podívat se na ID přidané položky.

Nyní musíte do dříve vytvořené spouštěcí položky zahrnout možnosti pro spuštění ladicího programu jádra. Pokud budete ladit na cílovém počítači, stačí přidat volbu /debug.

Chcete-li provést vzdálené ladění připojením cílového počítače přes komunikační port k hostitelskému počítači, pak pomocí voleb /port a /baud zadejte číslo portu a přenosovou rychlost.

Pokud budete provádět vzdálené ladění přes FireWire kabel (rozhraní IEEE 1394), použijte volbu /dbg1394 pro povolení odpovídajícího režimu a volbu /ch pro zadání čísla kanálu.

Abyste se ujistili, že změny byly provedeny, zkontrolujte zaváděcí soubory pomocí příkazu bootcfg s parametrem /query. Po provedení příkazu exit zavřete okno shellu.

V případě potřeby změňte nastavení spouštění operačního systému. Otevřete Ovládací panely přes nabídku Start a v ní otevřete položku Systém. V okně „Vlastnosti systému“, které se otevře, vyberte kartu „Upřesnit“. Na této kartě vyberte sekci s názvem „Boot and Recovery“ a klikněte na tlačítko „Options“. V zobrazeném okně „Boot and Recovery“ musíte aktivovat možnost „Zobrazit seznam operačních systémů“. Obě dialogová okna zavřete tlačítkem OK.

Restartovat váš počítač. Vyberte spouštění pomocí ladicího programu. Přihlaste se a začněte pracovat na cílovém počítači nebo začněte vzdáleně ladit. Použijte nástroje jako WinDbg a KD.