Izvršno vrijeme načina za otklanjanje pogrešaka u jezgri sustava Windows 7. Kako radi program za ispravljanje pogrešaka

  • Autori:

    Barinov S.S., Shevchenko O.G.

  • Godina:
  • Izvor:

    Informatika i računalne tehnologije / Materijali VI. Međunarodne znanstveno-tehničke konferencije studenata, postdiplomaca i mladih znanstvenika - 23.-25. studenog 2010., Donjeck, DonNTU. - 2010. - 448 str.

anotacija

Daje se usporedna analiza otklanjanja pogrešaka korisničkog načina rada i načina rada jezgre u odnosu na operativni sustav Microsoft Windows, ističu se razlike i problemi u organizaciji otklanjanja pogrešaka potonjeg. Na temelju dobivenih rezultata formulirani su glavni zahtjevi za konstrukciju debuggera u kernel modu u slučaju hitnog i interaktivnog debugginga. Provedena je analiza postojećih rješenja za usklađenost sa zahtjevima. Posebno je posebna pozornost posvećena Microsoft Windows Debuggeru.

Glavni dio

Debugging je proces identificiranja i uklanjanja uzroka bugova u softveru. U nekim projektima otklanjanje pogrešaka traje do 50% ukupnog vremena razvoja. Otklanjanje pogrešaka može se znatno pojednostaviti korištenjem specijaliziranih alata koji se stalno poboljšavaju. Glavni takav alat je program za ispravljanje pogrešaka, koji vam omogućuje kontrolu izvršavanja softvera, praćenje njegovog napretka i miješanje u njega. Alate za otklanjanje pogrešaka u jezgri prvenstveno koriste programeri upravljačkih programa.

Alat za razvoj aplikacijskog softvera nudi programeru širok raspon mogućnosti. Svako integrirano razvojno okruženje također uključuje mogućnost otklanjanja pogrešaka bez potrebe za pomoćnim programima trećih strana. Ako govorimo posebno o razvoju sistemskog softvera i drajvera, onda je zbog svoje specifičnosti proces razvoja izuzetno težak i malo automatiziran. Sve faze razvoja, uključujući otklanjanje pogrešaka, su odvojene. Svaki od njih zahtijeva posebne uvjete: pisanje programskog koda izvodi se na punopravnom računalnom sustavu, uklanjanje pogrešaka - na sustavu za uklanjanje pogrešaka, testiranje - ovisno o okolnostima itd. Sam debugger u kernel modu je teži za naučiti i, prema tome, manje je prijateljski nastrojen.

Općenito, možemo govoriti o nedostatku alata za otklanjanje pogrešaka u jezgri. Iako su ti alati dostupni, o alternativama se često ne raspravlja. Na primjer, Microsoft Windows Debugger ima prag ulaska koji je previsok. Mnogi programeri govore o prvom negativnom iskustvu kada se upoznaju s njim, a većina njegovih značajki ostaje nezahtjevana.

Na temelju strukture virtualnog adresnog prostora, ako aplikacija napravi pogrešku koja uzrokuje pisanje podataka na proizvoljnu memorijsku lokaciju, tada će aplikacija oštetiti samo vlastitu memoriju i neće utjecati na rad drugih aplikacija i rad sustav. Dok kod načina rada jezgre može oštetiti važne strukture podataka operativnog sustava, što će neizbježno dovesti do općeg kvara. Neučinkovito napisan upravljački program također može uzrokovati ozbiljnu degradaciju cijelog operativnog sustava.

    Moderni programi za ispravljanje pogrešaka pružaju sljedeće osnovne funkcije:
  • otklanjanje pogrešaka na razini izvornog koda;
  • upravljanje izvršenjem;
  • gledanje i mijenjanje memorije;
  • pregledavanje i mijenjanje sadržaja registara procesora;
  • prikaz snopa poziva.

Da bi se olakšao rad s rastavljenim kodom, tzv. simboli za otklanjanje pogrešaka. Tijekom rada povezivača, osim slike izvršne datoteke, može se kreirati i podatkovna datoteka koja sadrži informacije koje nisu potrebne prilikom izvođenja programa, ali su izuzetno korisne prilikom otklanjanja pogrešaka: imena funkcija, globalne varijable , i opisi struktura. Simboli za otklanjanje pogrešaka dostupni su za sve izvršne datoteke operacijskog sustava Windows.

Kontrola izvršenja odnosi se na mogućnost prekida i nastavka izvršenja programskog koda nakon što se dođe do zadane instrukcije u programskom kodu. Ako se programski kod izvodi u korak-po-korak modu, dolazi do prekida za svaki token programskog jezika ili pri izlasku iz potprograma. Kod slobodnog izvođenja, prekid izvođenja se događa u unaprijed određenim dijelovima koda - mjestima gdje su postavljene prijelomne točke.

Prekid koda kernel-moda postavlja sljedeću dilemu. Debugger koristi korisničko sučelje za interakciju s programerom. Oni. barem vidljivi dio programa za ispravljanje pogrešaka radi u korisničkom načinu rada i prirodno koristi sučelje za programiranje aplikacije (Windows API) za njegovu izgradnju, koje se pak oslanja na module načina rada jezgre. Stoga obustavljanje koda kernel-moda može dovesti do mrtve točke: sustav neće reagirati na korisnika.

Dijelovi programa za ispravljanje pogrešaka također moraju raditi u kernel modu da bi pristupili memoriji kernela. To dovodi do dva problema odjednom, što je očita posljedica organizacije memorije u zaštićenom načinu rada procesora.

Prvi problem odnosi se na prevođenje adresa virtualne memorije. Upravljački programi neprestano komuniciraju s aplikacijama korisničkog načina pristupanjem njihovoj memoriji. Operativni sustav Windows prevodi virtualne adrese u fizičke adrese na temelju koncepta konteksta niti. Kontekst niti - struktura koja odražava stanje niti i uključuje, posebno, skup registara i neke druge informacije. Kada se kontrola prenese na drugu nit, dolazi do promjene konteksta koja sprema informacije o jednoj niti vraća informacije o drugoj. Prebacivanje konteksta niti na nit drugog procesa također mijenja direktorij stranice koji se koristi za prevođenje virtualnih adresa u fizičke.

Posebnost je u tome što prilikom slanja sistemskih poziva operativni sustav Windows ne mijenja kontekst. To omogućuje kernel-modu kodu korištenje virtualnih adresa korisničkog načina.

Situacija je drugačija kada se prekida slanje ili izvršavanje sistemskih niti. Prekid se može dogoditi bilo kada, tako da ne postoji način da se predvidi koji će se kontekst niti koristiti. Sustavne niti, s druge strane, nisu u vlasništvu nijednog procesa i ne mogu prevoditi virtualne adrese korisničkog načina rada. Slijedi da se memoriji korisničkog načina rada ne može pristupiti u tim situacijama.

Drugi problem je pristup memoriji koji se može premjestiti. Velik dio informacija u memoriji može se premjestiti i može se premjestiti iz fizičke memorije na tvrdi disk u bilo kojem trenutku u datoteci stranice. Ako se pristupi stranici koja nije u fizičkoj memoriji, procesor će normalno generirati Page Fault prekid, koji će obraditi upravitelj memorije, a kao rezultat stranica će se pročitati iz datoteke stranice i učitati u fizičku memoriju.

Ovo se ponašanje pokvari ako je program za ispravljanje pogrešaka prisiljen koristiti visoke razine zahtjeva za prekid (IRQL). Ako je IRQL jednak ili veći od IRQL-a upravitelja memorije, potonji neće moći učitati stranicu koja nedostaje, jer operativni sustav će blokirati prekid Page Fault. Ovo će srušiti operativni sustav.

Otklanjanje pogrešaka obično se dijeli na interaktivno i hitno. S interaktivnim lokalnim ispravljanjem pogrešaka, program za ispravljanje pogrešaka radi na istom sustavu kao i objekt za ispravljanje pogrešaka. U interaktivnom daljinskom ispravljanju pogrešaka, program za ispravljanje pogrešaka i objekt za ispravljanje pogrešaka rade na različitim sustavima. Prilikom otklanjanja pogrešaka koda kernela, sustav se mora kontrolirati od prvih faza njegovog pokretanja, kada mreža još ne funkcionira, tako da se za povezivanje sustava koriste jednostavna serijska sučelja kao što su COM, FireWire, USB. U posljednje vrijeme, zahvaljujući trendovima razvoja virtualizacije softvera na različitim razinama apstrakcije, virtualni strojevi sve više privlače. Gostujući OS djeluje kao OS s otklanjanjem pogrešaka, glavni OS uključuje korisničko sučelje programa za ispravljanje pogrešaka.

Stoga hitno otklanjanje pogrešaka ne zahtijeva instaliranje alata za uklanjanje pogrešaka na testnom računalu. Distribucija operacijskog sustava Windows uključuje mehanizme za implementaciju hitnog otklanjanja pogrešaka. Operativni sustav prije ponovnog pokretanja može spremiti informacije o svom stanju koje programer može analizirati i otkriti uzrok. Ove informacije spremljene u datoteku nazivaju se ispis memorije.

Glavne alate za otklanjanje pogrešaka u načinu rada jezgre osigurava proizvođač operacijskog sustava Windows kao dio besplatno distribuiranog paketa Alati za otklanjanje pogrešaka za Windows. Alati uključuju grafičke i konzolne programe za ispravljanje pogrešaka WinDbg odnosno KD (u daljnjem tekstu Windows Debugger). Rad ovih programa za uklanjanje pogrešaka temelji se na mehanizmima koje su osigurali programeri operativnog sustava i koji su ugrađeni u njegovu jezgru.

Glavni način za Windows Debugger je način tumačenja naredbi. Zbog svoje modularne strukture, zajedno s naredbama koje daje programer, Windows Debugger podržava module trećih strana koji se nazivaju ekstenzije. Zapravo, većina ugrađenih naredbi također je formatirana kao proširenja.

Windows Debugger usmjeren je na udaljeno interaktivno i hitno otklanjanje pogrešaka, pri čemu se otkrivaju sve njegove mogućnosti. U isto vrijeme, punopravno lokalno interaktivno ispravljanje pogrešaka nije podržano: program za ispravljanje pogrešaka omogućuje samo pregled nekih struktura kernela.

Postoji ekstenzija za Windows Debugger pod nazivom LiveKD, koju je stvorio Mark Russinovich, a koja na neki način implementira lokalno interaktivno otklanjanje pogrešaka. LiveKD stvara memorijski dump radnog sustava u pokretu i koristi ga za otklanjanje pogrešaka.

Alati za uklanjanje pogrešaka za Windows redovito se ažuriraju i podržavaju sve moderne Windows operativne sustave.

Program za otklanjanje pogrešaka jezgre SoftICE, koji je objavio Compuware u softverskom paketu DriverStudio, tradicionalno je djelovao kao alternativa paketu Alati za uklanjanje pogrešaka za Windows. Obilježje SoftICE-a bila je implementacija lokalnog interaktivnog otklanjanja pogrešaka na podržanom hardveru. Debugger je mogao gotovo u potpunosti kontrolirati rad operacijskog sustava.

Od 3. travnja 2006. obitelj proizvoda DriverStudio ukinuta je zbog "mnogih tehničkih i poslovnih problema, kao i općih tržišnih uvjeta." Najnovija podržana verzija operativnog sustava je Windows XP Service Pack 2. Općenito, servisni paketi ne mijenjaju API operativnog sustava, ali se pozivni brojevi sustava i druge nedokumentirane informacije mogu promijeniti. SoftICE debugger se oslanjao na tvrdo kodirane adrese internih struktura podataka. Kao rezultat toga, s izdavanjem servisnog paketa 3, kompatibilnost je prekinuta. Očito, kasnije verzije operacijskog sustava Windows također nisu podržane.

Syser Kernel Debugger kreirala je mala kineska tvrtka Sysersoft kao zamjena za SoftICE debugger. Prva finalna verzija objavljena je 2007. Kao i SoftICE, Syser Kernel Debugger je sposoban interaktivno ispravljati pogreške na pokrenutom sustavu. Podržana su samo 32-bitna izdanja modernih verzija sustava Windows.

Windows Debugger trenutno je glavni alat među programerima kernel modula. Također ga koristi tim za razvoj jezgre operacijskog sustava Windows.

Ova serija članaka nastala je iz dva razloga. Prvo, volim raditi na projektu HackSysExtremeVulnerableDriver. Drugo, dobio sam puno želja istaknuti ovu temu.

Sav kod korišten u pisanju ove serije je u mom .

U ovoj seriji članaka, bavit ćemo se pisanjem exploita na razini jezgre u sustavu Windows. Važno je napomenuti da ćemo se baviti poznatim ranjivostima i da nema potrebe za obrnutim inženjeringom (barem ne za upravljački program).

Pretpostavlja se da ćete nakon čitanja svih članaka znati sve najčešće klase proboja i metode iskorištavanja, kao i moći prenijeti exploite s x86 arhitekture na x64 arhitekturu (ako je moguće) i upoznati se s novom zaštitom metode u sustavu Windows 10.

Shema otklanjanja pogrešaka jezgre

Za razliku od otklanjanja pogrešaka na razini korisnika, kada je jedan proces obustavljen, cijeli sustav je uključen na razini kernela i nećemo moći koristiti ovu metodu. U skladu s tim, potreban je poseban stroj za otklanjanje pogrešaka koji može komunicirati sa sustavom u kojem se otklanjaju pogreške u jezgri, pregledavati memoriju i strukturu jezgre te također hvatati padove sustava.

Dodatni materijal za proučavanje:

Iskorištavanje ranjivosti kernela

Ovaj je proces puno zabavniji od iskorištavanja na razini korisnika J.

Glavni cilj je postići privilegirano izvršenje u kontekstu kernela. A onda sve ovisi o našoj mašti, počevši od gozbe uz domaće pivo do uvođenja malwarea sponzoriranog od države.
Općenito, naš zadatak je dobiti ljusku sa sistemskim privilegijama.

Teme članaka u ovoj seriji

  • 1. dio: Postavljanje radnog okruženja
    • Konfiguriranje tri virtualna računala i sustava koji će djelovati kao debugger.
    • Konfiguriranje programa za ispravljanje pogrešaka WinDBG.
  • Dio 2: Korisni tereti
    • Istražite najčešće nosivosti. Sljedeći dijelovi će se pozabaviti određenim ranjivostima i pružiti poveznice na ovaj članak ako je potrebno.
  • Ostali dijelovi.
    • Razmatranje ranjivosti.

Životni ciklus razvoja eksploatacije na razini jezgre

  • Pronalaženje ranjivosti. Ova tema neće biti obrađena u ovoj seriji, budući da već znamo točno gdje su praznine.
  • Presretanje tijeka izvršenja. Neke ranjivosti uključuju izvršavanje koda, neke imaju dodatne zahtjeve.
  • Proširenje privilegija. Glavni cilj je dobiti ljusku sa sistemskim privilegijama.
  • Obnavljanje tijeka izvršenja. Neobrađene iznimke na razini kernela uzrokuju pad sustava. Ako ne namjeravate napisati exploit za DoS napad, trebali biste uzeti u obzir ovu činjenicu.

Vrste ciljnih sustava

Radit ćemo s ranjivostima u sljedećim sustavima (određena verzija nije kritična):

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

Počnimo s x86 arhitekturom, a zatim ćemo prenijeti exploit na Win7 x64 sustav. Neki exploiti neće se pokrenuti na Win10 strojevima zbog prisutnosti novih zaštita. U ovom slučaju, ili ćemo promijeniti logiku exploita ili ćemo koristiti potpuno drugačiji pristup.

Korišteni softver:

  • Hipervizor (mnogo opcija).
  • Windows 7 x86 VM
  • Windows 7 x64 VM
  • Windows 10 x64 VM

Postavljanje sustava za otklanjanje pogrešaka

Sustavi za otklanjanje pogrešaka s kojima ćemo raditi dizajnirani su za učitavanje ranjivog upravljačkog programa. Na tim će se strojevima često dogoditi padovi, jer većina iznimaka u kernelu pridonosi ovakvim stvarima. Morate dodijeliti dovoljno RAM-a za ove sustave.

Na svakom računalu s kojeg će se otklanjati pogreške morate učiniti sljedeće:

  • Unutar VirtualKD direktorija pokrenite datoteku target\vminstall.exe. Dodat će se novi unos za pokretanje i bit će dostupne funkcije za ispravljanje pogrešaka i automatsko povezivanje s VirtualKD poslužiteljem instaliranim na sustavu koji djeluje kao program za ispravljanje pogrešaka.

U slučaju Windows 10 VM, morate omogućiti testni način potpisivanja, koji omogućuje učitavanje nepotpisanih upravljačkih programa u kernel.

Nakon izvršavanja naredbe bcdedit /set testsinging on i ponovnog pokretanja, "Test Mode" će se pojaviti na radnoj površini.

Kratak opis HEVD modula

Postupak DriverEntry je početni za svakog vozača:

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) (
UINT32 i = 0;
PDEVICE_OBJECT DeviceObject = NULL;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
UNICODE_STRING Naziv uređaja, DosNaziv uređaja = (0);

UNREFERENCED_PARAMETER(Putanja registra);
PAGED_CODE();

RtlInitUnicodeString(&Naziv uređaja, L"\\Uređaj\\HackSysExtremeVulnerableDriver");
RtlInitUnicodeString(&DosDeviceName, L"\\DosDevices\\HackSysExtremeVulnerableDriver");

// Kreirajte uređaj
Status = IoCreateDevice(DriverObject,
0,
&Naziv uređaja,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
lažno,
&DeviceObject);

  • Ova procedura sadrži poziv funkcije IoCreateDevice koja sadrži naziv upravljačkog programa koji ćemo koristiti tijekom komunikacije.
  • Objektu DriverObject bit će dodane potrebne strukture i pokazivači na funkcije.
  • Ono što nam je važno je pokazivač funkcije povezan s procedurom DriverObject->MajorFunction , koja je odgovorna za rukovanje IOCTL (I/O Control; kontrola ulaza/izlaza);
  • U HEVD-u se ova funkcija naziva IrpDeviceIoCtlHandler, što je veliki uvjetni izraz s mnogo grana za svaki IOCTL. Svaka ranjivost ima jedinstveni IOCTL.

Primjer: HACKSYS_EVD_IOCTL_STACK_OVERFLOW je IOCTL koji se koristi za pokretanje ranjivosti prekoračenja stoga.

Ovim je prvi dio završen. U sljedećem članku ćemo govoriti o nosivosti. Trenutno je dostupan samo teret za krađu tokena, koji će se koristiti u trećem dijelu.

p.s. Razumijem da postoji mnogo suptilnosti i problema s kojima se možete susresti. Budući da se ovaj ciklus fokusira na razvoj exploita, morat ćete sami riješiti sve probleme na putu. No sva pitanja koja imate možete postaviti u komentarima.

ChPF OELPFPTSCHE HLBBOYS RP TBVPFE U PFMBDLPK SDTB U BCHBTYKOSHCHNY DBNRBNY RBNSFY. LBL RTBCHYMP, CHBN OKHTSOP VKHDEF ʺ̱BDBFSH PDOP Yʺ̱ HUFTPKUFCH RPDLBYULY, RETEYUMEOOOSCHI CH ZHBKME /etc/fstab. uVTPU PVTBCHBNY RBNSFY O KHUFTPKUFCHB, OE SCHMSAEYEUS KHUFTPKUFCHBNY RPDLBYULY, OBRTYNET, MEOFSHCH, CH DBOOSCHK NPNEOF OE RPDDETSYCHBAFUS.

Bilješka: YURPMSHʺ̱KhKFE LPNBODH dumpovi (8) DMS HLBBOYS SDTH NEUFB, ZDE OHTSOP UPITBOSFSH BCHBTYKOSHCHE DBNRSHCH. rPUME OBUFTPCLY RP LPNBODE zamijeniti (8) TBDEMB RPDLBYULY DPMTSOB VSHCHFSH CHSHCHCHBOB RTPZTBNNB dumpon . PVSHYUOP LFP CHSHCHRPMOSEPHUS BDBOYEN RETENEOOPK dumpdev H JBKME rc.conf (5). eUMMY BDBOB LFB RETENEOOBS, FP RPUME UVPS RTY RETCHPK NOPZPRPMSHPCHBFEMSHULPK RETEEBZTHʺ̱LE VHDEF BCHFPNBFYUEULY BRHEEO RTPZTBNNB savecore (8). pOB UPITBOYF BCHBTYKOSHK DBNR SDTB W LBFBMPZ, JBDBOOSCHK H RETENEOOPC dumpdir JBKMB rc.conf. rp HNPMYUBOYA LBFBMPZPN DMS BCHBTYKOSHCHI DBNRPC SCHMSEFUS /var/crash .

MYVP CH NPCEFE ʺ̱BDBFSH HUFTPKUFCHP DMS UVTPUB PVTBB RBNSFY SCHOP Yuete RBTBNEFT dump CH UFTPL konfiguracija LPOZHJZHTBGYPOOPZP ZHBKMB CHBYEZP SDTB. fBLPK URPUPV YURPMSHʺ̱PCHBFSH OE TELPNEODHEFUS Y PO DPMTSEO YURPMSHʺ̱PCHBFSHUS, FPMSHLP EUMY CHSH IPFYFE RPMHYUBFSH BCHBTYKOSHCHE PVTBJSCH RBNSFY SDTB, LPFPTPE BCHBTYKOP VBCHETYB EF UCHPA TBVPFH RTY ʺ̱BZTHʺ̱LE.

Bilješka: dBMEE FETNYO gdb POBUBEF PFMBDUYL gdb , BRHEEOOSCHK H ``TETSYNE PFMBDLY SDTB "". RETEIPD H FFPF TETSIN DPUFYZBEFUS BRHULPN gdb U RBTBNEFTPN -k . h TETSYNE PFMBDLY SDTB gdb Yʺ̱NEOSEF UCHPJ RTYZMBYOEOYE O (kgdb) .

Savjet: Eumi Chechchi yurpmshhef FreeBSD Chetui 3 ymi tbooaa, Cheshchiki DPMTSOSCH Cheshrpmeifsh Huyuye PFMBDPZP SDTB LPNBODPK STRIP, BSBBOCHMYCHBFSH PFMSHYP PFMBDPUOP:

# cp kernel kernel.debug # strip -g kernel

ffpf ybz oe fbl hts y eepvipdyn, op telpneodhen. (PE FreeBSD 4th VPMEE RPDOOYI TEMYBI FFPF YBZ CHSCHRPMOSEPHUS BCHFPNBFYUEULY CH LPOGE RTPGEUUB RPUFTPEOYS SDTB make .) lPZDB SDTP HUEYUEOP, BCHFPNBFYUEULY YMY RTY RPNPEY LPNBOD CHSHCHYE, CHSH NPTSEFE HUFBOPCHYF SH EZP PVSCHUOSCHN PVTBPN, OBVTCH make install .

ʺBNEFSHFE, UFP CH UVBTSCHI CHETUYSI FreeBSD (DP 3.1, OE CHLMAYUBS FFPF TEMY), YURPMSH'HEFUS SDTB CH ZHPTNBFE a.out, RPFPPNH YI FBVMYGSCH UINCHPMCH DPMTSOSH TBURPMBZBFSHUS RPU FPSOOP CH RBNSFI. na VPMSHYPK FBVMYGEK UYNCHPMCH CHOE HUEYUEOOOPN PFMBDPYUOPN SDTE LFP Yʺ̱MYYOSS FTBFB. rPUMEDOYE TEMYJSHCH FreeBSD YURPMSHJHAF SDTB CH JPTNBFE ELF, OVDJE EFP OE SCHMSEFUS RTPVMENPK.

eUMMY ChSCH FEUFYTHHEFE OPCHPE SDTP, ULBTSEN, OBVITBS YNS OPCHPZP SDTB CH RTYZMBYEOYY ʺBZTHYuYULB, OP CHBN OHTSOP ʺBZTHTSBFSH Y TBVPFBFSH U DTKhZYN SDTPN, YuFPVSHCH UOP ChB CHETOHFSHUS L OPTNBMSh OPNKH JHOLGYPOITCHBOYA, ʺBZTHTSBKFE EZP FPMSHLP CH PDOPRPMSHʺ̱PCHBFEMSHULPN TETSYNE RTY RPNPEY ZHMBZB -s, HLBSHCHCHBENPZP RTY ʺBZTHʺ̱LE, B UBFEN CHSHCHRPMOYFE FBLIE YBZY:

# fsck -p # mount -a -t ufs # tako da vaš datotečni sustav za /var/crash može pisati # savecore -N /kernel.paniced /var/crash # exit # ...za više korisnika

uFB RPUMEDPCHBFEMSHOPUFSH HLBSCHCHBEF RTPZTBNNE savecore (8) O YURPMSH'PCHBOYE DTHZPZP SDTB DMS Y'CHMEYUEOYS UINCHPMYUEULYI YNEO. yOBYUE POB VHDEF YURPMSHʺ̱PCHBFSH SDTP, TBVPFBAEEEE CH DBOOSCHK NPNEOF Y, ULPTEEE CHUEZP, OYUEZP OE UDEMBEF, RPFPNKh YuFP BCHBTYKOSHCHK PVTB RBNSFY Y Uinchpmshch SDTB VHDHF PF MYUBFSHUS.

b FERETSH, RPUME UVTPUB BCHBTYKOPZP DBNRB, RETEKDYFE H LBFBMPZ /sys/compile/WHATEVER Y BRHUFYFE LPNBODH gdb -k . y RTPZTBNNSC gdb UDEMBKFE CHPF UFP:

Symbol-file kernel.debug exec-file /var/crash/kernel.0 core-file /var/crash/vmcore.0 AVPK DTHZPK RTPZTBNNPK.

ChPF TsHTOBM LPNBOD UEBOUB TBVPFShch gdb, YMMAUFTYTHAEYK LFH RTPGEDHTX. dMYOOSH UFTPLY VSCHMY TBPTCHBOSH DMS HMHYUYOYS YUYFBVEMSHOPUFY Y DMS HDPVUFCHB UFTPLY VSCHMY RTPOHNETPCHBOSHCH. CHUE PUFBMSHOPE SCHMSEFUS FTBUUYTPCHLPK PYYVLY, TEBMSHOP CHPOYLOKHCHYEK CHP CHTENS TBVPFSCH OBD DTBCCHETPN LPOUPMY pcvt.

1:Skripta je započela u petak, 30. prosinca 23:15:22 1994. 2: # cd /sys/compile/URIAH 3: # gdb -k kernel /var/crash/vmcore.1 4:Čitanje podataka simbola iz /usr/src/ sys/compile/URIAH/kernel ...gotovo. 5:IdlePTD 1f3000 6:panic: jer si tako rekao! 7:trenutni PCB na 1e3f70 8:Očitavanje u simbolima za ../../i386/i386/machdep.c...gotovo. 9: (kgdb) gdje 10:#0 pokretanje (arghowto=256) (../../i386/i386/machdep.c linija 767) 11:#1 0xf0115159 u panici () 12:#2 0xf01955bd u diediedie ( ) (../../i386/i386/machdep.c redak 698) 13:#3 0xf010185e u db_fncall () 14:#4 0xf0101586 u db_command (-266509132, -266509516, -267381073) 15: #5 0 xf0101711 in db_command_loop () 16:#6 0xf01040a0 u db_trap () 17:#7 0xf0192976 u kdb_trap (12, 0, -272630436, -266743723) 18:#8 0xf019d2eb u trap_fatal (...) 19:# 9 0xf019ce60 u trap_pfault( ...) 20:#10 0xf019cb2f u zamci (...) 21:#11 0xf01932a1 u iznimci:calltrap () 22:#12 0xf0191503 u cnopen (...) 23:#13 0xf0132c34 u spec_open () 24: #14 0xf012d014 u vn_open () 25: #15 0xf012a183 u otvorenom () 26: #16 0xf019d4eb u syscall (...) 27: (kgdb) gore 10 28: Čitanje u simbolima za ../../i386/i386 /trap.c...gotovo. 29:#10 0xf019cb2f u zamci (frame=(tf_es = -260440048, tf_ds = 16, tf_\ 30:edi = 3072, tf_esi = -266445372, tf_ebp = -272630356, tf_isp = -27\ 31: 2630 396, tf_ebx = - 266427884, tf_edx = 12, tf_ecx = -266427884, tf\ 32:_eax = 64772224, tf_trapno = 12, tf_err = -272695296, tf_eip = -26\ 33:6672343, tf_cs = -26646 9368, tf_eflags=66066, tf_esp=3072, tf_\ 34:ss = -266427884)) (../../i386/i386/trap.c redak 283) 35:283 (void) trap_pfault(&frame, FALSE); 36: (kgdb) okvir okvir->tf_ebp okvir->tf_eip 37:Čitanje u simbolima za ../../i386/isa/pcvt/pcvt_drv.c...gotovo. 38:#0 0xf01ae729 u pcopenu (dev=3072, zastavica=3, način=8192, p=(struct p\ 39:roc *) 0xf07c0c00) (../../i386/isa/pcvt/pcvt_drv.c linija 403) 40:403 return ((*linesw.l_open)(dev, tp)); 41: (kgdb) popis 42:398 43:399 tp->t_state |= TS_CARR_ON; 44:400 tp->t_cflag |= CLOCAL; /* ne može biti modem (:-) */ 45:401 46:402 #if PCVT_NETBSD || (PCVT_FREEBSD >= 200) 47:403 return ((*linesw.l_open)(dev, tp)); 48:404 #else 49:405 povratak ((*linesw.l_open)(dev, tp, zastavica)); 50:406 #endif /* PCVT_NETBSD || (PCVT_FREEBSD >= 200) */ 51:407 ) 52: (kgdb) print tp 53: Čitanje u simbolima za ../../i386/i386/cons.c...gotovo. 54:$1 = (struct tty *) 0x1bae 55: (kgdb) ispis tp->t_line 56:$2 = 1767990816 57: (kgdb) gore 58:#1 0xf0191503 u cnopen (dev=0x00000000, flag=3, mode=8192 , p=(st\ 59:ruct proc *) 0xf07c0c00) (../../i386/i386/cons.c linija 126) 60: povratak ((*cdevsw.d_open)(dev, zastavica, način, p) ); 61: (kgdb) gore 62:#2 0xf0132c34 u spec_open () 63: (kgdb) gore 64:#3 0xf012d014 u vn_open () 65: (kgdb) gore 66:#4 0xf012a183 u otvorenom () 67: (kgdb) up 68:#5 0xf019d4eb u syscall (frame=(tf_es=39, tf_ds=39, tf_edi=\69:2158592, tf_esi=0, tf_ebp=-272638436, tf_isp=-272629788, tf\ 70:_ 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 = 582, tf_esp \ 72 := -272638456, tf_ss = 39 )) (. ./../i386/i386/trap.c redak 673) 73:673 pogreška = (*callp->sy_call)(p, args, rval); 74: (kgdb) gore 75: Odabran početni okvir; ne možete ići gore. 76: (kgdb) quit 77: # izlaz 78: izlaz 79:80:Skripta napravljena u petak, 30. prosinca 23:18:04 1994.

lPNNEOFBTYY L CHSHCHYERTYCHEDEOOOPNKH TsHTOBMH:

UFTPLB 6:

yFP DBNR, CHJSFC RTY RPNPEY DDB (UNPFTY OYCE), RPFPNH LPNNEOFBTYK L BCHBTYKOPNH PUFBOPCH YNEEF YNEOOP CHYD ``Zato što si rekao! PDOBLP YOBYUBMSHOPK RTYUYOPK RETEIPDB CH DDB VSCHMB BCHBTYKOBS PUFBOPCHLB RTY CHPOYOLOPCHEOYA PYYVLY UFTBOIGSC RBNSFY.

UFTPLB 20:

ffp NEUFPOBIPTSDEOYE JHOLGYY trap() H FTBUUYTPCHLE UFEBL.

UFTPLB 36:

rTYOHDYFEMSHOPE YURPMSH'PCHBOYE OPCHPK ZTBOYGSCH UFEBL; FERESH FF OE OHTSOP. rTEDRPMBZBEFUUS, UFP ZTBOYGSC UFELB HLBSCCHCHBAF O RTBCHIMSHOPE TBURPMPTSEOYE, DBTSE CH UMHYUBE BCHBTYKOPZP PUFBOPCHB. ZMSDS O UFTPLH YUIPDOPZP LPDB 403, NPTsOP ULBBFSH, UFP CHEUSHNB CHETPSFOP, UFP MYVP CHYOPCHBF DPUFHR RP HLBBFEMA ``tp "", MYVP VSCHM CHSHHIPD IB ZTBOYGSCH NBUUYCHB.

UFTPLB 52:

RPIPTSE, UFP CHYOPCHBF HLBBFEMSH, OP OD SCHMSEFUS DPRHUFYNSCHN BDTEUPN.

UFTPLB 56:

pDOBLP, PYUECHIDOP, UFP NA HLBSCHCHBEF O NHUPT, FBL UFP NSC OBYMY OPĆI PYYVLH! (DMS FEI, LFP OE OBBLPN U YFPK YUBUFSHHA LPDB: tp->t_line UMHTSYF DMS ITBOOEOYS TETSYNB LBOBMB LPOUPMSHOPZP HUFTPKUFCHB, Y LFP DPMTSOP VShFSH DPUFBFPYuOP NBMEOSHLPE GEMPE YUYUMP .)

Izraz "ispravljanje pogrešaka u jezgri" znači ispitivanje unutarnje strukture podataka jezgre i/ili prolazak kroz funkcije u jezgri. Ovo otklanjanje pogrešaka je vrlo koristan način za istraživanje unutarnjeg sustava Windows, budući da pruža prikaz internih informacija o sustavu koje nisu dostupne ni na koji drugi način, te vam daje jasan pogled na napredovanje koda u jezgri.

Prije nego što pogledamo različite načine ispravljanja pogrešaka u jezgri, istražimo skup datoteka koje će biti potrebne za izvođenje bilo koje vrste takvog ispravljanja pogrešaka.

Simboli otklanjanja pogrešaka jezgre

Datoteke simbola sadrže nazive funkcija i varijabli, kao i shemu i format struktura podataka. Generira ih program povezivanja i koriste ih programi za ispravljanje pogrešaka za upućivanje na ta imena i njihovo prikazivanje tijekom sesije ispravljanja pogrešaka. Te se informacije obično ne pohranjuju u binarnom obliku jer nisu potrebne kada se kôd izvršava. To znači da bez njega binarna datoteka postaje manja i radi brže. Ali to također znači da prilikom ispravljanja pogrešaka morate biti sigurni da program za ispravljanje pogrešaka ima pristup datotekama simbola pridruženim binarnim slikama koje se referenciraju tijekom sesije ispravljanja pogrešaka.

Za korištenje bilo kojeg alata za otklanjanje pogrešaka u načinu rada jezgre za ispitivanje unutarnje strukture podataka jezgre sustava Windows (popis procesa, blokovi niti, popis učitanih upravljačkih programa, informacije o korištenju memorije itd.), potrebne su vam odgovarajuće datoteke simbola i najmanje datoteka simbola za binarnu sliku kernela, Ntoskrnl.exe. Datoteke tablice simbola moraju odgovarati verziji binarne slike iz koje su izdvojene. Na primjer, ako ste instalirali Windows servisni paket ili neku zakrpu za ažuriranje jezgre, trebate nabaviti odgovarajuće ažurirane datoteke simbola.

Lako je preuzeti i instalirati simbole za različite verzije sustava Windows, ali nije uvijek moguće ažurirati simbole za hitne popravke. Najlakši način da dobijete ispravnu verziju simbola za ispravljanje pogrešaka je korištenje namjenskog Microsoftovog poslužitelja simbola, korištenjem posebne sintakse za putanju simbola navedenu u programu za ispravljanje pogrešaka. Na primjer, sljedeća putanja simbola uzrokuje da program za ispravljanje pogrešaka preuzima simbole s internetskog poslužitelja simbola i pohranjuje lokalnu kopiju u c:\symbols:srv*c:\symbols*http://msdl.microsoft.com/download/symbols

Detaljne upute za korištenje poslužitelja znakova mogu se pronaći u datoteci pomoći alata za otklanjanje pogrešaka ili na internetu na http://msdn.microsoft.com/en-us/windows/hardware/gg462988.aspx.

Kako pokrenuti kernel debugger?

Učiteljev odgovor:

Postoji jedan vrlo važan dio procesa razvoja softvera, a to je uklanjanje pogrešaka. U odnosu na aplikacijske programe, provodi se sredstvima koja rade u korisničkom načinu rada i često su ugrađena u IDE. Da biste mogli debugirati, na primjer, upravljačke programe, morate pokrenuti kernel debugger.

Morate pokrenuti cmd procesor. Otvorite izbornik Start na programskoj traci. U prozoru koji se pojavi kliknite na stavku "Pokreni ...". Pojavit će se prozor "Pokreni program". Upišite cmd u tekstualni okvir, a zatim kliknite OK.

Sada sigurnosno kopirajte datoteku boot.ini. Najprije saznajte instalacijsku stazu vaše trenutne kopije sustava Windows pomoću naredbe: echo %SystemRoot%

Zatim idite na disk s instaliranim operativnim sustavom upisujući slova uređaja, a nakon njih stavljajući dvotočku. Pomoću naredbe cd prijeđite na korijenski direktorij. Sada pomoću naredbe attrib uklonite skrivene, samo za čitanje i sistemske atribute iz datoteke boot.ini. Koristite naredbu kopiranja za izradu sigurnosne kopije i zatim postavite atribute na svoje mjesto.

Za prikaz trenutnog popisa opcija pokretanja upotrijebite naredbu bootcfg /query. Pregledajte popis i odredite koji će element biti osnova za stvaranje novih postavki s mogućnošću otklanjanja pogrešaka u načinu rada jezgre. Treba zapamtiti ID unosa za pokretanje.

Upotrijebite naredbu bootcfg/copy za stvaranje unosa za pokretanje. Upotrijebite opciju /id da odredite ID objave koju želite kopirati. Upotrijebite opciju /d da odredite naziv unosa koji će se prikazati. Sada morate ponovo otići na popis opcija pokretanja pomoću naredbe bootcfg /query i pogledati ID unosa koji je dodan.

Sada moramo uključiti opcije za pokretanje programa za ispravljanje pogrešaka jezgre u unosu za pokretanje koji smo prethodno stvorili. Ako ćete ispravljati pogreške na ciljnom računalu, samo trebate dodati opciju /debug.

Ako želite izvršiti daljinsko otklanjanje pogrešaka s ciljnim računalom povezanim s glavnim računalom preko com priključka, tada upotrijebite opcije /port i /baud za navođenje broja priključka i brzine prijenosa podataka.

Ako ćete raditi daljinsko otklanjanje pogrešaka s vezom putem FireWire kabela (IEEE 1394 sučelje), tada koristite opciju /dbg1394 da omogućite odgovarajući način i koristite opciju /ch da navedete broj kanala.

Kako biste provjerili jesu li promjene napravljene, provjerite datoteke za pokretanje pomoću naredbe bootcfg s opcijom /query. Nakon izvršenja naredbe za izlaz, zatvorite prozor ljuske.

Ako je potrebno, promijenite opcije pokretanja operativnog sustava. Otvorite upravljačku ploču kroz izbornik "Start" i već u njemu otvorite stavku "Sustav". U prozoru Svojstva sustava koji se otvori odaberite karticu Napredno. U ovoj kartici odaberite odjeljak pod nazivom "Preuzimanje i oporavak" i kliknite na gumb "Opcije" u njemu. U prozoru "Pokretanje i oporavak" koji se pojavi potrebno je aktivirati opciju "Prikaži popis operativnih sustava". Zatvorite oba dijaloška okvira tipkom OK.

Ponovno pokrenite računalo. Odaberite pokretanje s programom za ispravljanje pogrešaka. Prijavite se i počnite raditi na ciljnom računalu ili pokrenite daljinsko otklanjanje pogrešaka. Iskoristite prednosti alata kao što su WinDbg i KD.