Timpul de rulare a modului de depanare a nucleului Windows 7. Cum funcționează depanatorul

  • Autori:

    Barinov S.S., Shevchenko O.G.

  • An:
  • Sursă:

    Informatică și tehnologii informatice / Materiale ale celei de-a VI-a conferințe științifice și tehnice internaționale a studenților, absolvenților și tinerilor oameni de știință - 23-25 ​​noiembrie 2010, Donețk, DonNTU. - 2010. - 448 p.

adnotare

Este oferită o analiză comparativă a modului utilizator de depanare și a modului kernel în raport cu sistemul de operare Microsoft Windows, sunt evidențiate diferențele și problemele de organizare a depanării acestuia din urmă. Pe baza rezultatelor obținute se formulează cerințele de bază pentru construirea de depanatoare în modul kernel în caz de urgență și depanare interactivă. A fost efectuată o analiză a soluțiilor existente pentru conformitatea cu cerințele. În special, se acordă o atenție deosebită Debuggerului Microsoft Windows.

Parte principală

Depanarea este procesul de identificare și eliminare a cauzelor erorilor în software. În unele proiecte, depanarea durează până la 50% din timpul total de dezvoltare. Depanarea poate fi mult simplificată prin utilizarea instrumentelor specializate care sunt îmbunătățite în mod constant. Principalul astfel de instrument este un depanator, care vă permite să controlați execuția software-ului, să monitorizați progresul acestuia și să interferați cu acesta. Instrumentele de depanare a nucleului sunt utilizate în principal de dezvoltatorii de drivere.

Instrumentele de dezvoltare a aplicațiilor software oferă programatorului o gamă largă de posibilități. Orice mediu de dezvoltare integrat include capacitatea de a depana fără a fi nevoie să utilizați utilități terțe. Dacă vorbim de software de sistem și de dezvoltarea driverelor în special, atunci, datorită specificului său, procesul de dezvoltare este extrem de dificil și puțin automatizat. Toate fazele de dezvoltare, inclusiv depanarea, sunt separate. Pentru a realiza fiecare dintre ele, sunt necesare condiții speciale: scrierea codului de program este efectuată pe un sistem computerizat cu drepturi depline, depanarea este efectuată pe un sistem de depanare, testarea este efectuată în funcție de circumstanțe etc. Depanatorul în modul kernel în sine este mai dificil de învățat și, în consecință, mai puțin prietenos.

În general, putem vorbi despre lipsa instrumentelor de depanare a nucleului. Deși astfel de mijloace sunt disponibile, adesea nu se vorbește despre alternative. De exemplu, Microsoft Windows Debugger are un prag de intrare foarte mare. Mulți programatori vorbesc despre prima experiență negativă atunci când o întâlnesc, iar majoritatea capacităților sale rămân nerevendicate.

Pe baza structurii spațiului de adrese virtuale, dacă o aplicație face o eroare care determină aplicația să scrie date într-o locație de memorie arbitrară, aplicația va deteriora doar propria memorie și nu va afecta funcționarea altor aplicații și sistemul de operare. . În timp ce codul programului în modul kernel este capabil să deterioreze structurile de date importante ale sistemului de operare, ceea ce va duce inevitabil la un eșec general. Un driver scris ineficient poate provoca, de asemenea, o degradare gravă a întregului sistem de operare.

    Depanatoarele moderne oferă următoarele funcții de bază:
  • depanare la nivel de cod sursă;
  • managementul executiei;
  • vizualizarea și modificarea memoriei;
  • vizualizarea și modificarea conținutului registrelor procesorului;
  • vizualizarea stivei de apeluri.

Pentru a facilita lucrul cu codul dezasamblat, așa-numitul. simboluri de depanare. În timp ce linkerul rulează, pe lângă imaginea fișierului executabil, se poate crea și un fișier de date care conține informații care nu sunt necesare la executarea programului, dar sunt extrem de utile la depanare: nume de funcții, variabile globale, descrieri a structurilor. Simbolurile de depanare sunt disponibile pentru toate executabilele sistemului de operare Windows.

Controlul execuției se referă la capacitatea de a întrerupe și relua execuția codului de program la atingerea unei comenzi specificate în codul de program. Dacă codul programului este executat în modul pas cu pas, are loc o întrerupere pentru fiecare simbol al limbajului de programare sau la ieșirea dintr-o subrutină. În execuția liberă, întreruperile execuției apar în secțiuni predeterminate de cod - locuri în care sunt setate punctele de întrerupere.

Când se întrerupe codul modului kernel, apare următoarea dilemă. Depanatorul folosește o interfață cu utilizatorul pentru a interacționa cu programatorul. Acestea. cel puțin partea vizibilă a depanatorului rulează în modul utilizator și, în mod natural, utilizează o interfață de programare a aplicațiilor (Windows API), care, la rândul său, se bazează pe module în modul kernel, pentru ao construi. Astfel, întreruperea codului modului kernel poate duce la un impas: sistemul nu va mai răspunde la solicitările utilizatorilor.

Pentru a accesa memoria kernel, părți ale depanatorului trebuie să ruleze și în modul kernel. Acest lucru duce la două probleme simultan, care sunt o consecință evidentă a organizării memoriei în modul protejat al procesorului.

Prima problemă se referă la traducerea adreselor de memorie virtuală. Șoferii interacționează în mod constant cu aplicațiile în modul utilizator, accesându-și memoria. Sistemul de operare Windows traduce adresele virtuale în adrese fizice pe baza conceptului de context de fir. Contextul firului este o structură care reflectă starea unui fir și include, în special, un set de registre și alte informații. Când controlul este transferat către un alt fir, are loc o schimbare de context, care salvează informații despre un fir și restabilește informații despre altul. Când contextul unui fir de execuție este comutat pe firul de execuție al altui proces, directorul paginii folosit pentru a traduce adresele virtuale în cele fizice comută și el.

Particularitatea este că atunci când trimiteți apeluri de sistem, sistemul de operare Windows nu schimbă contextul. Acest lucru permite codului în modul kernel să utilizeze adrese virtuale în modul utilizator.

Situația este diferită atunci când se trimit întreruperi sau se execută fire de execuție de sistem. O întrerupere poate apărea în orice moment, așa că nu există nicio modalitate de a prezice contextul firului de execuție care va fi utilizat. Firele de execuție de sistem nu aparțin niciunui proces și nu pot traduce adrese virtuale în modul utilizator. Rezultă că memoria în modul utilizator nu poate fi accesată în aceste situații.

A doua problemă este accesarea memoriei relocabile. Majoritatea informațiilor din memorie sunt relocabile și pot fi mutate oricând din memoria fizică pe hard disk într-un fișier de pagină. Dacă este accesată o pagină care nu se află în memoria fizică, procesorul va genera în mod normal o întrerupere Page Fault, care ar fi gestionată de managerul de memorie, rezultând ca pagina să fie citită din fișierul de pagină și încărcată în memoria fizică.

Acest comportament se întrerupe dacă codul de depanare este forțat să utilizeze niveluri ridicate de cerere de întrerupere (IRQL). Dacă IRQL-ul se potrivește sau depășește IRQL-ul managerului de memorie, acesta din urmă nu va putea încărca pagina lipsă, deoarece sistemul de operare va bloca întreruperea Page Fault. Acest lucru va duce la blocarea sistemului de operare.

Depanarea este de obicei împărțită în interactiv și de urgență. În depanarea interactivă locală, depanatorul rulează pe același sistem ca și depanatorul. În depanarea interactivă la distanță, depanatorul și obiectul de depanare rulează pe sisteme diferite. La depanarea codului de kernel, sistemul trebuie controlat începând din primele etape ale pornirii sale, când rețeaua nu funcționează încă, prin urmare, interfețe seriale simple precum COM, FireWire, USB sunt folosite pentru a comunica între sisteme. Recent, datorită tendințelor de dezvoltare a virtualizării software la diferite niveluri de abstractizare, mașinile virtuale sunt din ce în ce mai folosite. Sistemul de operare invitat acționează ca sistemul de operare de depanare, sistemul de operare găzduit include o interfață de utilizator de depanare.

Prin urmare, depanarea de urgență nu necesită instalarea instrumentului de depanare pe computerul de testare. Distribuția sistemului de operare Windows include mecanisme pentru implementarea depanării de urgență. Înainte de repornire, sistemul de operare poate salva informații despre starea sa, pe care dezvoltatorul le poate analiza și afla motivul. Astfel de informații salvate într-un fișier se numesc memorie dump.

Instrumentele de depanare de bază în modul kernel sunt furnizate de producătorul sistemului de operare Windows însuși ca parte a pachetului Instrumente de depanare pentru Windows, distribuit gratuit. Instrumentele includ depanatoarele grafice și de consolă WinDbg și respectiv KD (denumite în continuare Windows Debugger). Lucrarea acestor depanatoare se bazează pe mecanisme furnizate de dezvoltatorii sistemului de operare și încorporate în nucleul său.

Modul principal pentru Windows Debugger este modul interpret de comandă. Datorită structurii sale modulare, Windows Debugger acceptă module terțe numite extensii, pe lângă comenzile furnizate de dezvoltatori. De fapt, majoritatea comenzilor încorporate sunt, de asemenea, ambalate ca extensii.

Windows Debugger se concentrează pe depanarea interactivă de la distanță și de urgență, care, atunci când este utilizată, dezvăluie toate capacitățile sale. În același timp, depanarea interactivă locală completă nu este acceptată: depanatorul vă permite doar să vizualizați unele structuri ale nucleului.

Există un modul de extensie pentru Windows Debugger numit LiveKD, creat de Mark Russinovich, care într-un fel implementează depanarea interactivă locală. LiveKD creează un dump de memorie a sistemului de lucru din mers și îl folosește pentru depanare.

Pachetul Instrumente de depanare pentru Windows este actualizat în mod regulat și acceptă toate sistemele de operare Windows moderne.

Depanatorul nucleului SoftICE, produs de Compuware în pachetul software DriverStudio, a fost în mod tradițional o alternativă la pachetul Instrumente de depanare pentru Windows. O caracteristică distinctivă a SoftICE a fost implementarea depanării locale interactive pe hardware-ul suportat. Depanatorul ar putea controla aproape complet funcționarea sistemului de operare.

Începând cu 3 aprilie 2006, vânzările familiei de produse DriverStudio au fost întrerupte din cauza „o varietate de probleme tehnice și de afaceri, precum și din cauza condițiilor generale de piață”. Cea mai recentă versiune a sistemului de operare care va fi acceptată este Windows XP Service Pack 2. De obicei, pachetele de service nu modifică interfața aplicației sistemului de operare, dar numerele de apel de sistem și alte informații nedocumentate se pot modifica. Depanatorul SoftICE s-a bazat pe adresele codificate hard ale structurilor de date interne. Ca urmare, compatibilitatea a fost întreruptă odată cu lansarea Service Pack 3. Evident, versiunile ulterioare ale sistemului de operare Windows nu sunt acceptate.

Syser Kernel Debugger a fost creat de o mică companie chineză Sysersoft ca înlocuitor pentru depanatorul SoftICE. Prima versiune finală a fost lansată în 2007. La fel ca SoftICE, Syser Kernel Debugger este capabil de depanare interactivă pe un sistem care rulează. Sunt acceptate doar edițiile pe 32 de biți ale versiunilor moderne de Windows.

În prezent, Windows Debugger este instrumentul principal printre dezvoltatorii de module de kernel. Este folosit și de echipa de kernel a sistemului de operare Windows.

Această serie de articole a apărut din două motive. În primul rând, îmi place să lucrez cu proiectul HackSysExtremeVulnerableDriver. În al doilea rând, am primit multe urari pentru a acoperi acest subiect.

Tot codul folosit la scrierea acestei serii se află în depozitul meu.

În această serie de articole ne vom uita la scrierea exploit-urilor la nivel de kernel în Windows. Este important de reținut că vom avea de-a face cu vulnerabilități cunoscute și nu este nevoie de inginerie inversă (cel puțin pentru driver).

Este de așteptat ca, după ce ați citit toate articolele, să cunoașteți toate clasele de vulnerabilități și metode de exploatare cele mai comune și, de asemenea, să puteți porta exploit-uri de la arhitectura x86 la arhitectura x64 (dacă este posibil) și să vă familiarizați cu noile metode de protecție. în Windows 10.

Circuitul de depanare a nucleului

Spre deosebire de depanarea la nivel de utilizator, care suspendă execuția unui singur proces, depanarea la nivel de kernel implică întregul sistem și nu vom putea folosi această metodă. În consecință, avem nevoie de o mașină de depanare separată care să poată comunica cu sistemul în care nucleul este depanat, să vizualizeze memoria și structurile nucleului și, de asemenea, să detecteze blocările sistemului.

Material suplimentar de studiat:

Exploatarea vulnerabilităților kernelului

Acest proces este mult mai distractiv decât operarea la nivelul utilizatorului J.

Scopul principal este de a obține o execuție privilegiată în contextul nucleului. Și apoi totul depinde de imaginația noastră, de la un festin cu bere de casă până la introducerea malware-ului sponsorizat de stat.
În general, sarcina noastră este să obținem un shell cu privilegii de sistem.

Subiectele articolelor din această serie

  • Partea 1: Configurarea mediului de lucru
    • Configurarea a trei mașini virtuale și a unui sistem care va acționa ca un depanator.
    • Configurarea depanatorului WinDBG.
  • Partea 2: Sarcini utile
    • Explorați cele mai comune sarcini utile. Părțile ulterioare vor aborda vulnerabilități specifice și, acolo unde este cazul, vor furniza link-uri către acest articol.
  • Părțile rămase.
    • Luarea în considerare a vulnerabilităților.

Kernel-ul exploatează ciclul de viață al dezvoltării

  • Găsirea unei vulnerabilități. Acest subiect nu va fi discutat în această serie, deoarece știm deja exact unde sunt golurile.
  • Interceptarea firului de execuție. Unele vulnerabilități implică execuția de cod, iar unele au cerințe suplimentare.
  • Privilegiul escaladării. Scopul principal este de a obține un shell cu privilegii de sistem.
  • Restabilirea firului de execuție. Excepțiile nebifate la nivel de kernel provoacă blocarea sistemului. Dacă nu aveți de gând să scrieți un exploit pentru un atac DoS, ar trebui să luați în considerare acest fapt.

Tipuri de sisteme țintă

Vom lucra cu vulnerabilități în următoarele sisteme (versiunea specifică nu este importantă):

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

Să începem cu arhitectura x86 și apoi vom porta exploit-ul la sistemul Win7 x64. Unele exploit-uri nu vor rula pe mașinile Win10 din cauza prezenței noilor protecții. În acest caz, fie vom schimba logica exploit-ului, fie vom folosi o abordare complet diferită.

Software folosit:

  • Hypervisor (o mulțime de opțiuni).
  • VM Windows 7 x86
  • VM Windows 7 x64
  • VM Windows 10 x64

Configurarea sistemelor de depanare

Sistemele de depanare cu care vom interacționa sunt concepute pentru a încărca driverul vulnerabil. Aceste mașini se vor bloca frecvent, deoarece majoritatea excepțiilor din nucleu contribuie la acest tip de fenomen. Trebuie să alocați suficientă memorie RAM pentru aceste sisteme.

Pe fiecare mașină care va fi depanată, trebuie să faceți următoarele:

  • În directorul VirtualKD, rulați fișierul target\vminstall.exe. Va fi adăugată o nouă intrare de boot și vor fi disponibile funcții de depanare și conexiune automată la serverul VirtualKD instalat pe sistem, care acționează ca un depanator.

În cazul VM Windows 10, trebuie să activați modul de semnare de testare, care vă permite să încărcați drivere nesemnate în kernel.

După rularea bcdedit /set testsinging la comandă și repornire, „Modul de testare” va apărea pe desktop.

Scurtă descriere a modulului HEVD

Procedura DriverEntry este procedura de pornire pentru fiecare șofer:

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) (
UINT32 i = 0;
PDEVICE_OBJECT DeviceObject = NULL;
Stare NTSTATUS = STATUS_UNSUCCESSFUL;
UNICODE_STRING DeviceName, DosDeviceName = (0);

UNREFERENCED_PARAMETER(RegistryPath);
COD_PAGINAT();

RtlInitUnicodeString(&DeviceName, L"\\Device\\HackSysExtremeVulnerableDriver");
RtlInitUnicodeString(&DosDeviceName, L"\\DosDevices\\HackSysExtremeVulnerableDriver");

//Creează dispozitivul
Stare = IoCreateDevice(DriverObject,
0,
&Nume dispozitiv,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
FALS,
&DeviceObject);

  • Această procedură conține un apel la funcția IoCreateDevice, care conține numele driverului pe care îl vom folosi în timpul comunicării.
  • Structurile și indicatorii de funcție necesare vor fi adăugate la obiectul DriverObject.
  • Ceea ce este important pentru noi este indicatorul de funcție asociat procedurii DriverObject->MajorFunction, care este responsabil de procesarea IOCTL (I/O Control);
  • În HEVD această funcție se numește IrpDeviceIoCtlHandler, care este o expresie condiționată mare cu multe ramuri pentru fiecare IOCTL. Fiecare vulnerabilitate are un IOCTL unic.

Exemplu: HACKSYS_EVD_IOCTL_STACK_OVERFLOW este un IOCTL folosit pentru a declanșa o exploatare de depășire a stivei.

Aceasta se încheie prima parte. În articolul următor vom vorbi despre încărcături utile. Momentan, singura sarcină utilă disponibilă este una concepută pentru a fura jetoane, care vor fi folosite în a treia parte.

P.S. Înțeleg că există o mulțime de complexități și probleme pe care le puteți întâlni. Deoarece această serie se concentrează pe dezvoltarea exploit-urilor, va trebui să rezolvați singur toate problemele asociate. Cu toate acestea, puteți adresa orice întrebări pe care le aveți în comentarii.

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

Notă: 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 dump CH UFTPLE config LPOZHYZHTBGYPOOPZP ZHBKMB CHBYEZP SDTB. fBLPK URPUPV YURPMSHЪPCHBFSH OE TELPNEODHEFUS Y DE DPMTSEO YURPMSHЪPCHBFSHUS, FPMSHLP EUMY CHSCH IPFYFE RPMKHYUBFSH BCHBTYKOSHCHE PVTBSCH RBNSFY SDTB, LPFPTPE BCHBTYKOPBFLE ЪCHPATHZBTYKOPFLE ЪHPATHZPHBFSH.

Notă: 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 DESPRE (kgdb) .

Bacsis: eUMY CHSH YURPMSH'HEFE FreeBSD CHETUYY 3 YMY VPMEE TBOOAA, CHCH DPMTSOSCH CHSHRPMOYFSH HUEYEOYE PFMBDPUOPZP SDTB LPNBODPK bandă, B OE KHUFBOBCHMYCHBFSH VPMSHYPE PFMBDPUOPE SDTP :

# cp kernel kernel.debug # strip -g kernel

bFPF YBZ OE FBL KhTS Y OEPVIPDYN, OP TELPNEODKHEN. (PH FreeBSD 4-a VPMEE TEMYYBI LFPF YBZ CHSPRMOSEFUS BCHFPNBFYUEULY CH LPOGE RTPGEUUB RPUFTPEOOYS SDTB make .) lPZDB SDTP HUEYEOP, BCHFPNBFYUEULY YMY RT Y RPNPEY LPNBOD CHEVHVSHUPCHYE, KCHFPHVSHUSHPCHYE TBBPN, OVTTBCH make install .

ъBNEFSHFE, YuFP CH UFBTSHCHETUISI FreeBSD (DP 3.1, OE CHLMAYUBS LFPF TEMY), YURPMSHHEFUS SDTB CH ZHTNBFE a.out, RPFPNH YI FBVMYGSH UYNCHPMPCH DPMTSOSCH TBURPMBZBFShu S RPUNSFPSFY. 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 OPCHPZP SDTB CH RTYZMBYYE OYBZTHYUYLB, OP CHBN OHTSOP ЪBZTHTSBFSH Y TBVFFBFSH U DTHZYN SDTPB OPTHPSHOLBCH PTHUPCH PHOTPCH OYA, ЪBZTHTSBKFE EZP FPMSHLP CH PDOPRPMSHЪPCHBFEMSHULPN TETSYNE RTY RPNPEY ZHMBZB -s , KHLBSCCHBENPZP RTY ЪBZTH ЪLE, B ЪBFEN CHSHRPMOYFE FBLYE YBZY:

# fsck -p # mount -a -t ufs # astfel încât sistemul dvs. de fișiere pentru /var/crash să poată fi scris # savecore -N /kernel.panicked /var/crash # exit # ...pentru multi-utilizator

bFB RPUMEDPCHBFEMSHOPUFSH KHLBSCCHBEF RTPZTBNNE savecore (8) DESPRE 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 SDTB F .

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

Fișier-simbol kernel.debug fișier exec /var/crash/kernel.0 fișier de bază /var/crash/vmcore.0 Y CHBMS - CHCH NPTSEFE PFMBTSYCHBFSH BCHBTYKOSHK DBNR, YURPMSHЪHS YUIPDOSCH FELUFSCH SDTB FPYuOP FBLCH LFPBL AT 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:Scriptul a început vineri, 30 decembrie 23:15:22 1994 2: # cd /sys/compile/URIAH 3: # gdb -k kernel /var/crash/vmcore.1 4:Citirea datelor simbolului din /usr/src/ sys/compile/URIAH/kernel ...terminat. 5:IdlePTD 1f3000 6:panica: pentru ca ai spus! 7: pcb curent la 1e3f70 8: Citirea simbolurilor pentru ../../i386/i386/machdep.c...terminat. 9: (kgdb) unde 10:#0 boot (arghowto=256) (../../i386/i386/machdep.c linia 767) 11:#1 0xf0115159 în panică () 12:#2 0xf01955bd (in diedie ) (../../i386/i386/machdep.c linia 698) 13:#3 0xf010185e în db_fncall () 14:#4 0xf0101586 în db_command (-266509132, -266509132, -2665 0101711in db_command_loop () 16:#6 0xf01040a0 în db_trap () 17:#7 0xf0192976 în kdb_trap (12, 0, -272630436, -266743723) 18:#8 0xf0192976 in kdb_trap (12, 0, -272630436, -266743723) 18:#8 0192976 in 9ce60 în trap_pfault ( ...) 20:#10 0xf019cb2f în capcană (...) 21:#11 0xf01932a1 în excepție:calltrap () 22:#12 0xf0191503 în cnopen (...) 23:#13 0xf0132c34 în spec_open () 24 : #14 0xf012d014 în vn_open () 25:#15 0xf012a183 în deschis () 26:#16 0xf019d4eb în syscall (...) 27: (kgdb) în sus 10 28:Citirea simbolurilor pentru ..//i38/. i386 /trap.c...terminat. 29:#10 0xf019cb2f în capcană (frame=(tf_es = -260440048, tf_ds = 16, tf_\ 30:edi = 3072, tf_esi = -266445372, tf_ebp = -2723, tf_30000000, tf_300000000) 6, tf_ebx = - 266427884, tf_edx = 12, tf_ecx = -266427884, tf\ 32:_eax = 64772224, tf_trapno = 12, tf_err = -272695296, tf_eip = 3:36, tf_eip = 3:6, 26 = 3:66 3 68, tf_eflags = 66066, tf_esp = 3072 , tf_\ 34:ss = -266427884)) (../../i386/i386/trap.c linia 283) 35:283 (void) trap_pfault(&frame, FALSE); 36: (kgdb) frame frame->tf_ebp frame->tf_eip 37:Citirea simbolurilor pentru ../../i386/isa/pcvt/pcvt_drv.c...terminat. 38:#0 0xf01ae729 în pcopen (dev=3072, flag=3, mode=8192, p=(struct p\ 39:roc *) 0xf07c0c00) (../../i386/isa/pcvt/pcvt_drv.c line 403) 40:403 return ((*linesw.l_open)(dev, tp)); 41: (kgdb) listă 42:398 43:399 tp->t_state |= TS_CARR_ON; 44:400 tp->t_cflag |= CLOCAL; /* nu poate fi un modem (:-) */ 45:401 46:402 #if PCVT_NETBSD || (PCVT_FREEBSD >= 200) 47:403 return ((*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) print tp 53:Citirea simbolurilor pentru ../../i386/i386/cons.c...terminat. 54:$1 = (struct tty *) 0x1bae 55: (kgdb) print tp->t_line 56:$2 = 1767990816 57: (kgdb) up 58:#1 0xf0191503 în cnopen (dev=0x0000, flag=02, mod=03 , p=(st\ 59:ruct proc *) 0xf07c0c00) (../../i386/i386/cons.c linia 126) 60: return ((*cdevsw.d_open)(dev, flag, mode, p) ); 61: (kgdb) în sus 62:#2 0xf0132c34 în spec_open () 63: (kgdb) în sus 64:#3 0xf012d014 în vn_open () 65: (kgdb) în sus 66:#4 0xf012a183: în ()kgdb) up 68:#5 0xf019d4eb în syscall (cadru=(tf_es = 39, tf_ds = 39, tf_edi =\ 69: 2158592, tf_esi = 0, tf_ebp = -272638436, tf_27:8 = 272638436) 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 = 582, tf_62:3, tf_2:3:3 )) (. ./../i386/i386/trap.c line 673) 73:673 error = (*callp->sy_call)(p, args, rval); 74: (kgdb) sus 75: Cadrul inițial selectat; nu poți urca. 76: (kgdb) ieșire 77: # ieșire 78: ieșire 79: 80: Script realizat pe vineri, 30 decembrie 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 ``pentru că ai spus să!'' Y FTBUUYTPCHLB UFELB ZMHVPLB; PDOBLP YOBYUBMSHOPK RTYYUYOPK RETEIPDB CH DDB VSHMB BCHBTYKOBS PUFBOPCHLB RTY CHPOYLOPCHEOYA PYYVLY UFTBOIGSC RBNSFY.

UFTPLB 20:

lFP NEUFPOBIPTSDEOOYE ZHKHOLGYY capcană() CH FTBUUYTPCHLE UFELB.

UFTPLB 36:

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

UFTPLB 52:

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

UFTPLB 56:

pDOBLP, PYUECHYDOP, UFP PE KHLBSCCHBEF DESPRE NUPT, 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 DPUFBFPYuOP NBMEOSHLPE GEMPEM.)

Termenul „depanare a nucleului” înseamnă examinarea structurii interne de date a nucleului și/sau urmărirea pas cu pas a funcțiilor din nucleu. Această depanare este o modalitate foarte utilă de a examina funcționarea internă a Windows, deoarece vă permite să vedeți informațiile interne ale sistemului care nu sunt disponibile utilizând alte mijloace și oferă o imagine clară a progresului codului în nucleu.

Înainte de a analiza diferitele moduri de depanare a nucleului, haideți să examinăm setul de fișiere de care veți avea nevoie pentru a efectua orice fel de depanare a nucleului.

Simboluri pentru depanarea nucleului

Fișierele cu simboluri conțin numele funcțiilor și variabilelor, precum și aspectul și formatul structurilor de date. Acestea sunt generate de programul linker și sunt folosite de depanatori pentru a face referire la aceste nume și pentru a le afișa în timpul unei sesiuni de depanare. Aceste informații nu sunt de obicei stocate în cod binar, deoarece nu sunt necesare atunci când codul este executat. Aceasta înseamnă că fără el, codul binar devine mai mic și rulează mai repede. Dar asta înseamnă, de asemenea, că atunci când depanați, trebuie să vă asigurați că depanatorul are acces la fișierele simbol asociate cu imaginile binare la care se face referire în timpul sesiunii de depanare.

Pentru a utiliza orice instrument de depanare în modul kernel pentru a examina elementele interne ale structurii de date a nucleului Windows (lista de procese, lista de blocuri de fire, lista de drivere încărcate, informații despre utilizarea memoriei etc.), aveți nevoie de fișierele de simbol corecte și, la cel puțin, un fișier simbol pentru imaginea binară a nucleului - Ntoskrnl.exe. Fișierele tabelului de simboluri trebuie să se potrivească cu versiunea imaginii binare din care au fost extrase. De exemplu, dacă ați instalat un pachet de servicii Windows sau un fel de patch care actualizează nucleul, trebuie să actualizați fișierele cu simboluri în consecință.

Este ușor să descărcați și să instalați simboluri pentru diferite versiuni de Windows, dar actualizarea simbolurilor pentru corecții nu este întotdeauna posibilă. Cel mai simplu mod de a obține versiunea necesară a simbolurilor pentru depanare este să contactați serverul de simboluri Microsoft special conceput în acest scop, folosind sintaxa specială pentru calea simbolului specificată în depanator. De exemplu, următoarea cale de simbol face ca instrumentele de depanare să descarce simbolurile de pe un server de simboluri online și să stocheze o copie locală în c:\symbols:srv*c:\symbols*http://msdl.microsoft.com/download/ simboluri

Instrucțiuni detaliate pentru utilizarea serverului de simboluri pot fi găsite în fișierul de ajutor al instrumentelor de depanare sau online la http://msdn.microsoft.com/en-us/windows/hardware/gg462988.aspx.

Cum se pornește depanatorul nucleului?

Raspunsul maestrului:

Există o componentă foarte importantă în procesul de dezvoltare a software-ului - depanarea. În ceea ce privește programele de aplicație, se realizează prin mijloace care funcționează în modul utilizator și sunt adesea încorporate în IDE. Pentru a putea depana, de exemplu, driverele, trebuie să rulați depanatorul nucleului.

Trebuie să porniți procesorul de comenzi cmd. Deschideți meniul Start din bara de activități. În fereastra care apare, faceți clic pe elementul „Run…”. Va apărea fereastra „Run Program”. În câmpul de text, introduceți cmd, apoi faceți clic pe OK.

Acum faceți o copie de rezervă a fișierului boot.ini. Mai întâi, aflați calea de instalare a copiei dvs. curente de Windows folosind comanda: echo %SystemRoot%

Apoi, accesați discul cu sistemul de operare instalat introducând literele dispozitivului, urmate de două puncte. Folosind comanda cd, mergeți la directorul rădăcină. Acum, folosind comanda attrib, eliminați atributele „hidden”, „read-only” și „system” din fișierul boot.ini. Utilizați comanda copy pentru a crea o copie de rezervă, apoi setați atributele.

Pentru a afișa lista curentă de opțiuni de pornire, utilizați comanda bootcfg /query. Uitați-vă prin listă și determinați elementul pe baza căruia vor fi create noi setări cu posibilitatea de a depana în modul kernel. ID-ul de intrare de pornire trebuie reținut.

Utilizați comanda bootcfg/copy pentru a crea o intrare de boot. Pentru a specifica ID-ul înregistrării pe care o veți copia, utilizați parametrul /id. Folosind opțiunea /d, specificați numele intrării care va fi afișată. Acum trebuie să reveniți la lista de opțiuni de pornire folosind comanda bootcfg /query și să vă uitați la ID-ul intrării adăugate.

Acum trebuie să includeți opțiuni pentru a lansa depanatorul kernelului în intrarea de pornire creată anterior. Dacă veți depana pe mașina țintă, trebuie doar să adăugați opțiunea /debug.

Dacă doriți să efectuați depanare de la distanță conectând computerul țintă printr-un port com la mașina gazdă, atunci utilizați opțiunile /port și /baud pentru a specifica numărul portului și rata baud.

Dacă veți efectua depanarea la distanță printr-un cablu FireWire (interfață IEEE 1394), atunci utilizați opțiunea /dbg1394 pentru a activa modul corespunzător și opțiunea /ch pentru a specifica numărul canalului.

Pentru a vă asigura că modificările au fost făcute, verificați fișierele de pornire folosind comanda bootcfg cu parametrul /query. După executarea comenzii de ieșire, închideți fereastra shell.

Dacă este necesar, modificați setările de pornire a sistemului de operare. Deschideți Panoul de control prin meniul Start și deschideți elementul Sistem în acesta. În fereastra „Proprietăți sistem” care se deschide, selectați fila „Avansat”. În această filă, selectați secțiunea numită „Pornire și recuperare” și faceți clic pe butonul „Opțiuni”. În fereastra „Pornire și recuperare” care apare, trebuie să activați opțiunea „Afișează lista de sisteme de operare”. Închideți ambele casete de dialog cu butonul „OK”.

Reporniți computerul. Selectați boot cu depanator. Conectați-vă și începeți să lucrați la mașina țintă sau începeți depanarea de la distanță. Utilizați instrumente precum WinDbg și KD.