Kako radi program za ispravljanje pogrešaka. Windows Kernel Debugging Tools Što je Kernel Debugging

Malo je dostojnih debuggera na nuklearnoj razini i pod Windowsima, au Linuxu se mogu nabrojati na prste jedne ruke, a i oni su uglavnom sirovi, nedovršeni ili napušteni i obrasli mahovinom... Danas ćemo o najpopularniji i najzanimljiviji od njih -
Lineice.

Uvod

Kao što već možete pretpostaviti iz naziva, Lineice je neslužbena "luka" legendarnog
SoftICE za Linux, koji je zadržao sučelje, sustav naredbi i većinu značajki potonjeg: uspon vruće tipke (u Lineice to ); postavljanje hardverskih prijelomnih točaka na sve funkcije i sistemske pozive; pregledavanje GDT/LDT/IDT, fizičkih stranica memorije; značajke posuđene iz GDB-a (pozivanje proizvoljne funkcije naredbom CALL, spremanje/vraćanje konteksta registara, internih varijabli itd.).

Za razliku od većine drugih programa za ispravljanje pogrešaka, koji rade kroz mehanizam ptrace, koji nije reentrant i obrana ga lako otkriva (čiji je Windows pandan DEBUG_PROCESS, koji koriste programi za ispravljanje pogrešaka aplikacija), Lineice koristi izvorno praćenje, isto kao u SoftICE-u, što omogućuje oba programa za ispravljanje pogrešaka da ispravljaju pogreške u jako zaštićenim programima s kojima drugi više ne mogu rukovati.

Zapravo, ovo uopće nije luka (otuda navodnici), već neovisni projekt, napisan od nule i besplatno distribuiran u izvornom kodu (od SoftICE-a postoji samo inspiracija). Većinu koda za kernel 2.4 napisao je njemački haker Goran Devik, no kernel 2.6 podržali su sasvim drugi ljudi: Daniel Reznick, Peter K. i Carlos Manuel Duclos Vergara. A naš sunarodnjak - Oleg Khudakov - prepisao je asemblerske datoteke iz nasm "i na
gcc.

Izvorni tekstovi nalaze se na službenim stranicama projekta -
Linije%0A.com">www.Linice.com , dokumentacija, kratki FAQ i poveznica na forum također se nalaze tamo
Linije%0A">groups.google.com/group/Linice . Nema unaprijed izgrađenih binarnih verzija.
Tvorci projekta otvorili su vlastiti račun na SourceForgeu, ali su bili previše lijeni da na njega stave bilo kakve datoteke, prikazujući samo 3 snimke zaslona "ali vrlo niske kvalitete:
.

Zahtjevi sustava

Najnovija verzija Lineice ima broj 2.6 i nosi datum 28. srpnja 2005., u potpunosti podržava 2.4.x kernel i VGA način rada konzole. Novije jezgre imaju ozbiljne probleme, a jezgra 2.6.x podržana je samo ograničeno.
Debugger je razvijen i testiran pod Debianom 2.6. Njegova kompatibilnost s drugim distribucijama nije zajamčena, što nas tjera da posegnemo za tamburom, ali u nekim slučajevima ni tambura ne pomaže. Zapravo, zadržite Debian na svom računalu samo da biste s njim radili Lineice, - to je sasvim normalno. Nekada davno, kada nije bilo implementacije SoftICE za NT, mnogi hakeri su instalirali Win 9x samo da bi razbili programe, iako su sami sjedili pod
NT. Kako bi se pokrili svi detalji instalacije Lineice u okviru jednog članka praktički nerealno, ograničit ću se na opisivanje procesa kompajliranja i pokretanja Lineice pod jednom posebnom distribucijom - Knoppix 3.7 s jezgrom 2.4.1 u načinu VGA konzole.
Lineice podržava ACPI i višeprocesorske strojeve, ali nije prijateljski nastrojen s X "mi, posebno na video karticama osim nVidia. Uopće ne percipira 24-bitnu dubinu boja, "probavlja" samo 8, 16 i 32 bita, pa je više prikladno za otklanjanje pogrešaka X aplikacija putem udaljenog terminala povezanog preko COM porta koristeći VT100 protokol, dok će lokalna tipkovnica također raditi s
Lineice!

Sastavljanje i konfiguriranje Linice

Preuzmite gzip arhivu izvornog koda www. Lineice.devic.us/ Lineice-2.6.tar.gz, koji zauzima malo manje od megabajta, raspakirajte ga na disk, idite u direktorij ./docs i saznajte iz readme datoteke da je program za ispravljanje pogrešaka sastavljen za 2.4 kernel na sljedeći način:

# cd build
# ./make_bin-2.4
# cd ../bin
# učiniti čistim; Mak e

Međutim, prije pokretanja make, morate otvoriti ./bin-2.4/Makefile i urediti redak "TARGET" tako da odgovara konfiguraciji i arhitekturi ciljne platforme. Konkretno, na ACPI strojevima s višejezgrenim ili HyperThreading procesorima to će izgledati ovako:

CILJ=-DSMP-DIO_APIC

Nakon dovršetka kompilacije, bit će mnogo datoteka i direktorija u direktoriju ./bin, ali jedini značajni su:

linsym - modul za učitavanje programa za ispravljanje pogrešaka;
linince.dat - konfiguracijska datoteka;
xice - podrška za X "s, pri radu u tekstualnom načinu može se izbrisati;
./Linice_2.4.27/Linice.o je modul kernela koji se može učitavati i sadrži sam program za ispravljanje pogrešaka.

Proces sklapanja Lineice

Nakon što ste sastavili minimalno radni komplet, bilo bi lijepo dobiti sve ostalo - primjere demo otklanjanja pogrešaka koji se nalaze u direktoriju ./test i kompajliraju skriptom za kompajliranje, kao i modul proširenja (po našem mišljenju, dodatak) koji se nalazi u ./ext direktorij, sastavljen pomoću naredbe make i učitan naredbom insmod. Od toga nema nikakve koristi, ali proučavanjem izvornog koda možemo napisati vlastite module koji proširuju funkcionalnost
Lineice.

Prilikom pokretanja Knoppixa, u donjem retku zaslona pojavljuje se upit "boot:", gdje trebate unijeti "knoppix 2 vga=normal". 2 "blokira učitavanje X"-ova, a "vga=normal" postavlja standardni vga mod s rezolucijom 80x25.

Nakon što čekamo da se preuzimanje završi, izgovorimo “su”, zatim “passwd” i unesemo novu lozinku za root "a, pod kojom se odmah prijavljujemo u sustav pomoću naredbe za prijavu. Ako to nije učinjeno, pokušaj početak Lineice završit će poraznim neuspjehom uz povik "greška segmentacije".

Prilikom pokretanja Knoppixa "a s tvrdog diska (na koji se može instalirati naredbom "sudo knoppix-installer" utipkanom u prozoru terminala ispod LiveCD sesije), pojavit će se početni izbornik s popisom dostupnih kernela. Odaberite Linux (2.4) -1 i pritisnite za postavljanje parametara pokretanja - "2 vga=normal". Riječ "knoppix" ne treba pisati jer je jezgra već odabrana. Nakon završetka preuzimanja dajemo naredbu za prijavu i prijavljujemo se kao root (podrazumijeva se da je račun kreiran ranije).

Debugger se pokreće naredbom ./linsym –i, nakon čega se odmah pojavljuje na ekranu. Ako se to ne dogodi, pokušajte navesti tipku "--verbose 3" za prikaz dijagnostičkih poruka.
Jedan od razloga za neuspjeh pokretanja može biti nepostojanje datoteke /boot/System.map koja sadrži adrese funkcija jezgre. Učitavanje također neće uspjeti ako sadržaj System.map ne odgovara trenutnoj jezgri, što se može dogoditi, na primjer, kada se ponovno kompajlira. Neki prevoditelji distribucije ili uopće ne uključuju System.map (vjerujući da će to učiniti sustav sigurnijim, budući da će rootkitovima biti teže presresti syscallove), ili stave nešto potpuno ostavljeno ovdje i nije došlo niotkuda uopće. U takvim slučajevima dovoljno je jednostavno ponovno kompajlirati kernel usmjeravanjem programa za ispravljanje pogrešaka na datoteku System.map pomoću "-m" prekidača ako se nalazi negdje drugdje osim /boot. Dakle, sigurnost neće biti ugrožena i Lineice može raditi!
Povratak iz programa za ispravljanje pogrešaka u sustav događa se do ili naredbom "x ". Kombinacija poziva debugger iz bilo kojeg programa. No, uopće nije činjenica da ćemo se naći u njegovom kontekstu jer Linux je multitasking sustav koji izmjenjuje procese jedan za drugim, a ADDR (context switching) naredbe su u "leksikonu" Lineice još uvijek ne postoji, a kada će se pojaviti nije poznato. Stoga morate varati postavljanjem prijelomnih točaka na sistemske pozive koje koristi određeni program ili provaljivanjem u proces pomoću metode INT 03h, o kojoj ćemo sada govoriti.

Ključ "-x", proslijeđen istom linsymu, odgovoran je za učitavanje debuggera (ako ga stvarno želite isprazniti).

Osnove rada sa Lineice

Za one koji su već radili sa SoftICE-om, mastering Lineice neće predstavljati nikakav problem. Ovdje se koriste sve iste naredbe: D - ispis memorije, E - uređivanje memorije, T - praćenje korak po korak, P - praćenje bez unosa funkcije, R - pregled / izmjena registara, BPM / BPX - postavljanje prijelomne točke na pristup memoriji/izvršenje itd. Potpuni popis naredbi sadržan je iu ugrađenoj pomoći, koju poziva HELP (usput, "HELP command_name" daje dodatne informacije o naredbi), iu standardnoj dokumentaciji.

Pritisnimo i preturajte po popisu procesa prikazanih naredbom PROC, s trenutnim procesom označenim plavom bojom:

:PROC

1 0000 C1C3E000 SPAVANJE 0 0 init
2 0000 F7EE8000 SPAVANJE 0 0 keventd
3 0000 F7EE2000 SPAVA 0 0 ksoftirqd_CPU0
4 0000 F7EE0000 SPAVA 0 0 ksoftirqd_CPU1
5 0000 F7ED0000 SPAVANJE 0 0 kswapd
6 0000 F7EAA000 SPAVANJE 0 0 bdflush
7 0000 F7EA8000 SPAVANJE 0 0 kupdad
56 0000 F6A36000 SPAVANJE 0 0 kjournald
1006 0000 F7A34000 RADI 0 0 automount
1013 0000 F68E6000 SPAVANJE 0 0 šalica d
...
1105 0000 F6DDE000 SPAVANJE 0 0 mc
1106 0000 F6DD4000 SPAVANJE 0 0 ušteda konz.

Procesi su, naravno, dobri, ali kako ipak možemo debugirati programe? Najjednostavnije je strojnu instrukciju CCh koja odgovara instrukciji INT 03h zalijepiti u ulaznu točku, prethodno upisujući sadržaj originalnog bajta. To se može učiniti s bilo kojim heksadecimalnim uređivačem, na primjer, koji sam više puta spomenuo
HTE.

Nakon učitavanja datoteke u uređivač kliknite (način), odaberite vilenjak / slika, postavite kursor na "entrypoint:", pritisnite (uredi) i promijenite prvi bajt u CCh, spremite promjene do (Spremi i izađi. Prilikom pokretanja zakrpanog programa Lineice odmah se pojavljuje, uznemiren iznimkom koju je izbacio CCh, nakon čega EIP označava kraj
CCh.

Stanje programa sa zakrpanom ulaznom točkom u trenutku kada se pojavi program za ispravljanje pogrešaka

0023:080482C0 CC int 3
0023:080482C1 ED u eax, dx
0023:080482C2 5E pop esi
0023:080482C3 89E1 mov ecx, esp

Kursor pokazuje na in eax,dx (EDh) instrukciju, koja je dio zakrpane xor ebp,ebp (31h EDh) instrukcije. Sada (u teoriji) bismo trebali vratiti izvorni bajt promjenom CCh na 31h, smanjiti EIP registar za jedan i nastaviti s praćenjem kao i obično.

Da, nije ga bilo! Lineice- ovo je, naravno, port, ali samo vrlo sirov, i ne može modificirati memoriju slike stranice, čak i ako prvo otvorite segment koda za pisanje. Ni E (uredi), ni F (ispuni), ni M (memorijska kopija) ne rade! Ali pisanje na stog radi, a za nas hakere ovo je sasvim dovoljno.

Sjećamo se trenutne vrijednosti EIP registra; kopirajte zakrpanu strojnu instrukciju na vrh hrpe; tamo vratiti bajt CCh; prenosimo kontrolu na njega, mijenjajući vrijednost EIP-a; izvršavamo ga izvođenjem jednog čina traganja; i vratite EIP na njegovo mjesto, to jest na sljedeću strojnu naredbu:

Vraćanje izvornog bajta zamijenjenog instrukcijom INT 03h

; Gledamo što je na vrhu hrpe (iz čiste znatiželje).
:d posebno-10
0018:BFFFEFC0 C0 82 04 08 00 00 00 00 5D 0C 00 40 DC EF FF BF

; Kopirajte zakrpanu strojnu uputu na vrh hrpe.
; Broj 10h je najveća moguća veličina strojne instrukcije na x86.
:m eip-1 L 10 esp-10

; Pogledajmo kako se stog promijenio.
:d posebno-10
0018:BFFFEFC0 CC ED 5E 89 E1 83 E4 F0 50 54 52 68 F0 85 04 08

; Aha! Stack se stvarno promijenio, vrijeme je da popravimo CCh na 31h.
:e esp-10 31
Uređivanje neposrednih podataka još nije implementirano.

; Ups! Izravna dodjela podataka nije implementirana u Linice,
; ali možemo interaktivno uređivati ​​dump (isto kao
; kao u SoftICE) ili naredba F esp-10 L 1 31, samo imajte na umu
; da, za razliku od SoftICE-a, Linice debugger ne ažurira dump prozor,
; pa bi nakon izvršenja naredbe F moglo izgledati da
; nema rezultata; zapravo, to nije slučaj, samo trebate ažurirati
; dump naredba D esp-10, i sve će doći na svoje mjesto.

; Prenosimo kontrolu na naredbu kopiranu na stog,
; zapamtite vrijednost EIP registra.
:reip (esp-10)
reg:eip=BFFFEFC0

; Izvodimo jednu radnju trasiranja.
:t
0023:BFFFEFC2 5E pop esi

; Kao što vidimo, EIP registar se povećao za 2 (BFFFEFC2h - BFFFEFC0h) = 02h,
; stoga je adresa sljedeće instrukcije: 080482C1h - 01h + 02h = 080482C2h,
; gdje je 080482C1h početna vrijednost EIP-a pri ulasku u program, a 01h veličina INT 03h.

; Postavite EIP na naredbu koja slijedi zakrpanu uputu.
:reip 80482C2
reg:eip=80482C2

Moraju se dogovoriti ovi plesovi uz tamburicu. I što učiniti? Dakle, shvatili smo učitavanje programa u debugger, sada ćemo razdvojiti prijelomne točke za sistemske pozive i kernel funkcije.

Naredba exp ispisuje nazive koje izvozi kernel, od kojih se bilo koje može pojaviti u izrazima, na primjer "bpx do_bkr" je ekvivalentno "bpx C012C9E8".

Ispis imena koje je izvezao kernel

:exp
zrno
C0320364 mmu_cr4_značajke
C02AC3A4 acpi_onemogućen
C02AC8A0 i8253_brava
...
C012BDA8 do_mmap_pgoff
C012C764 do_munmap
C012C9E8 do_brk
C011E990 izlaz_mm
C011E69C izlazne_datoteke

Sistemski pozivi su teži. Izravna podrška od Lineice nije ovdje (a trebao bi biti, s obzirom na specifičnosti Linuxa), pa se ovo mora raditi ručno.

Poznato je da je tablica sistemskih poziva niz dvostrukih riječi koje počinju na adresi sys_call_table (ovu varijablu eksportira kernel).

Tablica poziva sustava

; Debugger smo stavili u način prikaza dvostrukih riječi.
:dd

; Prikazujemo tablicu na ekranu.
:d sys_call_table
0018:C02AB6A8 C0126ACC F8932650 F89326A0 C013DC10
0018:C02AB6B8 C013DD18 C013D5C8 C013D724 C011F3BC
0018:C02AB6C8 C013D664 C014A8E0 C014A3B4 F893020C

Svaki element tablice odgovara vlastitom pozivu sustava, a svaki poziv ima svoj broj, koji se može pronaći gledanjem datoteke /usr/include/sys/syscall.h, ali bolje je to učiniti ne pod Linuxom, gdje postoji nisu izravni brojevi, ali posuditi tu istu datoteku iz BSD-a - svejedno, brojevi glavnih sistemskih poziva na svim sustavima su isti. Konkretno, poziv otvorenog sustava označen je brojem 5.

Da biste postavili prijelomnu točku na open, morate znati njegovu adresu, koja se nalazi u petoj dvostrukoj riječi tablice sistemskih poziva, računajući od nule, i jednaka je (u ovom slučaju) C013D5C8h.

Postavljanje točke prekida na otvoreni sistemski poziv

; Postavite prijelomnu točku na poziv otvorenog sustava,
:bpx C013D5C8
; izađite iz programa za ispravljanje pogrešaka
:x
...
# otvori neku datoteku
...
; odmah se pojavljuje program za uklanjanje pogrešaka, govoreći nam o tome,
: Prijelomna točka zbog BPX 01

; dajemo naredbu proc kako bismo bili sigurni da smo se uglavili u naš proces.
:proc
PID TSS Stanje zadatka uid gid naziv
1049 0000 F6364000 SPAVANJE 0 0 getty
1145 0000 F61CC000 SPAVANJE 0 0 mc
1146 0000 F614A000 SPAVANJE 0 0 ušteda kons.

Na ovaj način, lako je uskočiti u već pokrenute procese postavljanjem prijelomnih točaka na sistemske pozive koje koriste, kao i radeći mnoge druge stvari koje su vitalne za hakiranje.

Zaključak

Unatoč svojoj otvorenoj vlažnosti, Lineice prilično pogodan za otklanjanje pogrešaka zaštićenih aplikacija, iako prilično često morate pribjeći zaobilaznim rješenjima koja se automatski izvode u normalnim programima za ispravljanje pogrešaka. Zato Lineice nipošto ne zamjenjuje gdb, već ga samo nadopunjuje.

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.

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 ʺ̱BCHETYTBYBFSHUCH.

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: eUMMY CHSH YURPMSHHEFE FreeBSD CHETUYY 3 YMY VPMEE TBOOAA, CHSH DPMTSOSCH CHSHCHRPMOYFSH HUEYUEOYE PFMBDPYUOPZP SDTB LPNBODPK strip, BOE HUFBOBCHMYCHBFSH VPMSHYPE PFMBDPYUOPE SDTP:

# cp kernel kernel.debug # strip -g kernel

ffpf ybz oe fbl hts y eepvipdyn, op telpneodhen. (чП FreeBSD 4 Й ВПМЕЕ РПЪДОЙИ ТЕМЙЪБИ ЬФПФ ЫБЗ ЧЩРПМОСЕФУС БЧФПНБФЙЮЕУЛЙ Ч ЛПОГЕ РТПГЕУУБ РПУФТПЕОЙС СДТБ make .) лПЗДБ СДТП ХУЕЮЕОП, БЧФПНБФЙЮЕУЛЙ ЙМЙ РТЙ РПНПЭЙ ЛПНБОД ЧЩЫЕ, ЧЩ НПЦЕФЕ ХУФБОПЧЙФШ ЕЗП ПВЩЮОЩН ПВТБЪПН, ОБВТБЧ make install .

ʺBNEFSHFE, UFP CH UVBTSCHI CHETUYSI FreeBSD (DP 3.1, OE CHLMOYUBS FFPF TEMYʺ̱), YURPMSH'HEFUS SDTB CH ZhPTNBFE a.out, RPFPPNH YI FBVMYGSCH UINCHPMCH DPMTSOSH TBURPMBZBFSHUS RBNSFPSOOP. 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.

еУМЙ ​​​​ЧЩ ФЕУФЙТХЕФЕ ОПЧПЕ СДТП, УЛБЦЕН, ОБВЙТБС ЙНС ОПЧПЗП СДТБ Ч РТЙЗМБЫЕОЙЙ ЪБЗТХЪЮЙЛБ, ОП ЧБН ОХЦОП ЪБЗТХЦБФШ Й ТБВПФБФШ У ДТХЗЙН СДТПН, ЮФПВЩ УОПЧБ ЧЕТОХФШУС Л ОПТНБМШОПНХ ЖХОЛГЙПОЙТПЧБОЙА, ЪБЗТХЦБКФЕ ЕЗП ФПМШЛП Ч ПДОПРПМШЪПЧБФЕМШУЛПН ТЕЦЙНЕ РТЙ РПНПЭЙ ЖМБЗБ -s , ХЛБЪЩЧБЕНПЗП РТЙ ЪБЗТХЪЛЕ , 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, ULPTEE CHUEZP, OYUEZP OE UDEMBEF, RPFPNH UFP BCHBTYKOSHCHK PVTB RBNSFY Y Uinchpmshch SDTB VHDHF PFMYUB.

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 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:#0_ 0x1010 petlja db_command () 16:#6 0xf01040a0 u db_trap() 17:#7 0xf0192976 u kdb_trap(12, 0, -272630436, -266743723) 18:#8 0xf019d2eb u trap_fatal (...) 19:#9 0xfault19 ...) 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_edi 2664 = 12, tf_ecx = -266427884, tf\ 32:_eax = 64772224, tf_trapno = 12, tf_err = -272695296, tf_eip = -26\ 33:6672343, tf_cs = -266469368, tf_eflags = 66066, 3_7\esp = 66066, tf_7 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) gore 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,= = 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 gotova pet, 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.)

  • 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 pri izvođenju programa, ali su izuzetno korisne pri otklanjanju 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, ne pripadaju niti jednom procesu 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 otklanjanje 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.

Ponekad imam situaciju u kojoj Windows čeka vrijeme pokretanja programa za otklanjanje pogrešaka jezgre. Vidite tekst "Windows start", ali ne i logotip.

Ako sada priključim program za ispravljanje pogrešaka, reproducira se animacija logotipa Windows 7. Nakon toga, logotip počinje pulsirati. U ovom trenutku proces preuzimanja više ne napreduje. Upotreba CPU-a svedena je na minimum. Obično čekam nekoliko minuta, ali ništa se ne događa.

To se ne događa uvijek. Međutim, ako se to dogodi, resetiranje VM-a neće pomoći. Da bih riješio ovaj problem, moram koristiti popravak pri pokretanju. Nažalost, ovo traje zauvijek.

Imate li ideja što mogu učiniti osim pokretanja popravka pri pokretanju?

Hvala unaprijed!

3

2 odgovora

Kako biste riješili problem na koji ste naišli, jednostavno pritisnite F10 tijekom podizanja sustava. I uklanjanje/debug i srodne opcije. Zatim pritisnite enter.

Prijedlog: Nemojte koristiti opciju /debug za zadanu opciju izbornika za pokretanje. Kopirajte konfiguraciju pokretanja u novi unos. Zatim ga postavite na način otklanjanja pogrešaka. Windows ne zna kada ćete upotrijebiti program za ispravljanje pogrešaka. Stoga mora čekati.