Cum funcționează depanatorul. Instrumente Windows Kernel Debugging Ce este Kernel Debugging

Există puțini depanatoare demne la nivel nuclear și sub Windows, iar în Linux pot fi numărate pe degetele unei mâini și chiar și acelea sunt în mare parte crude, neterminate sau abandonate și pline de mușchi ... Astăzi vom vorbi despre cele mai populare și mai interesante dintre ele -
Lineice.

Introducere

După cum puteți ghici deja din nume, Lineice este „portul” neoficial al legendarului
SoftICE pentru Linux, care a păstrat interfața, sistemul de comandă și majoritatea caracteristicilor acestuia din urmă: ascensiunea tastelor rapide (în Lineice aceasta ); setarea punctelor de întrerupere hardware pentru toate funcțiile și apelurile de sistem; vizualizarea GDT/LDT/IDT, pagini fizice de memorie; caracteristici împrumutate de la GDB (apelarea unei funcții arbitrare cu comanda CALL, salvarea / restabilirea contextului de registre, variabile interne etc.).

Spre deosebire de majoritatea celorlalte programe de depanare, care funcționează prin mecanismul ptrace, care nu este reintrant și ușor de detectat de apărare (al cărui omologul Windows este DEBUG_PROCESS, folosit de depanatorii de aplicații), Lineice folosește urmărirea nativă, la fel ca și în SoftICE, care permite ambilor depanatori să depaneze programe puternic protejate pe care alții nu le mai pot gestiona.

De fapt, acesta nu este deloc un port (de aici ghilimele), ci un proiect independent, scris de la zero și distribuit gratuit în cod sursă (de la SoftICE există doar inspirație). Majoritatea codului pentru nucleul 2.4 a fost scris de hackerul german Goran Devik, dar nucleul 2.6 a fost susținut de oameni complet diferiți: Daniel Reznick, Peter K. și Carlos Manuel Duclos Vergara. Și compatriotul nostru - Oleg Khudakov - a rescris fișierele de asamblare de la nasm „și la
gcc.

Textele sursă sunt pe site-ul oficial al proiectului -
Liniile%0A.com">www.Linice.com , documentația, un scurt Întrebări frecvente și un link către forum sunt, de asemenea, găsite acolo
Liniile%0A„>groups.google.com/group/Linice . Nu există versiuni binare predefinite.
Creatorii proiectului și-au deschis propriul cont pe SourceForge, dar au fost prea leneși să pună orice fișier pe el, prezentând doar 3 capturi de ecran „dar de foarte slabă calitate:
.

Cerințe de sistem

ultima versiune Lineice este numerotat 2.6 și este datat 28 iulie 2005, acceptând pe deplin kernelul 2.4.x și modul VGA de consolă. Nucleele mai noi au probleme serioase, iar nucleul 2.6.x este acceptat doar pe o bază limitată.
Depanatorul a fost dezvoltat și testat sub Debian 2.6. Compatibilitatea lui cu alte distribuții nu este garantată, ceea ce ne obligă să apelăm la o tamburină, dar în unele cazuri nici o tamburină nu ajută. De fapt, păstrați Debian pe mașina dvs. doar pentru a lucra cu el Lineice, - este destul de normal. Cu mult timp în urmă, când nu exista nicio implementare a SoftICE pentru NT, mulți hackeri instalau Win 9x doar pentru a rupe programe, deși ei înșiși stăteau sub
NT. Pentru că pentru a acoperi toate detaliile instalării Lineiceîn cadrul unui articol este practic nerealist, mă voi limita la a descrie procesul de compilare și rulare Lineice sub o distribuție specială - Knoppix 3.7 cu kernel 2.4.1 în modul consolă VGA.
Lineice suportă ACPI și mașini multiprocesor, dar nu este prietenos cu X "mi, mai ales pe alte plăci video decât nVidia. Nu percepe deloc adâncimea de culoare de 24 de biți, "digerând" doar 8, 16 și 32 de biți, deci este mai mult convenabil pentru a depana aplicațiile X printr-un terminal la distanță conectat printr-un port COM folosind protocolul VT100, în timp ce tastatura locală va funcționa și cu
Lineice!

Compilarea și configurarea Linice

Descărcați arhiva gzip a codului sursă www. Lineice.devic.us/ Lineice-2.6.tar.gz, care ocupă puțin mai puțin de un megaoctet, despachetați-l pe disc, mergeți la directorul ./docs și aflați din fișierul readme că depanatorul este asamblat pentru nucleul 2.4 după cum urmează:

# cd build
# ./make_bin-2.4
# cd ../bin
# face curat; Mak e

Cu toate acestea, înainte de a rula make, trebuie să deschideți ./bin-2.4/Makefile și să editați linia „TARGET” pentru a se potrivi cu configurația și arhitectura platformei țintă. În special, pe mașinile ACPI cu procesoare multi-core sau HyperThreading, va arăta astfel:

TARGET=-DSMP-DIO_APIC

După ce compilarea este completă, vor exista multe fișiere și directoare în directorul ./bin, dar singurele semnificative sunt:

linsym - modul de încărcare a depanatorului;
linince.dat - fișier de configurare;
xice - suport pentru X "s, atunci când lucrați în modul text poate fi șters;
./Linice_2.4.27/Linice.o este un modul kernel încărcat care conține depanatorul însuși.

proces de asamblare Lineice

După ce am compilat un kit care funcționează minim, ar fi bine să obținem orice altceva - exemple de depanare demo situate în directorul ./test și compilate de scriptul de compilare, precum și un modul de extensie (în opinia noastră, un plugin) situat în Directorul ./ext, asamblat de comanda make și încărcat de comanda insmod. Nu există niciun beneficiu din aceasta, dar studiind codul sursă, putem scrie propriile module care extind funcționalitatea
Lineice.

Când porniți Knoppix, pe linia de jos a ecranului apare un prompt „boot:”, unde trebuie să introduceți „knoppix 2 vga=normal”. 2 „blochează încărcarea X”, iar „vga=normal” setează modul vga standard cu o rezoluție de 80x25.

După ce așteptăm finalizarea descărcării, spunem „su”, apoi „passwd” și introducem o nouă parolă pentru root „a, sub care ne conectăm imediat la sistem folosind comanda de conectare. Dacă acest lucru nu se face, o încercare de a start Lineice se va sfârși într-un eșec zdrobitor cu un strigăt de „defecțiune de segmentare”.

La pornirea Knoppix „a de pe hard disk (pe care poate fi instalat cu comanda „sudo knoppix-installer” tastata în fereastra terminalului de sub sesiunea LiveCD), va apărea un meniu de pornire cu o listă de nuclee disponibile. Selectați Linux (2.4) -1 și apăsați pentru a seta parametrii de boot - „2 vga=normal”. Cuvântul „knoppix” nu trebuie scris, deoarece miezul este deja selectat. După ce descărcarea este finalizată, dăm comanda de conectare și ne conectăm ca root (se presupune că contul a fost creat mai devreme).

Depanatorul este lansat cu comanda ./linsym –i, după care apare imediat pe ecran. Dacă acest lucru nu se întâmplă, încercați să specificați tasta „--verbose 3” pentru a afișa mesaje de diagnosticare.
Unul dintre motivele eșecului de pornire poate fi absența fișierului /boot/System.map care conține adresele funcțiilor kernelului. Încărcarea va eșua și dacă conținutul System.map nu se potrivește cu nucleul curent, ceea ce se poate întâmpla, de exemplu, atunci când este recompilat. Unele compilatoare de distribuție fie nu includ System.map deloc (crezând că va face sistemul mai sigur, deoarece va fi mai greu pentru rootkit-uri să intercepteze apelurile de sistem), fie au pus ceva complet lăsat aici și nu a venit de nicăieri deloc. În astfel de cazuri, este suficient să recompilați pur și simplu nucleul prin direcționarea depanatorului către fișierul System.map folosind comutatorul „-m” dacă acesta se află în altă parte decât /boot. Astfel, atât securitatea nu va fi afectată, cât și Lineice pot munci!
Revenirea de la depanator la sistem are loc prin sau cu comanda „x ". Combinaţie apelează depanatorul din orice program. Cu toate acestea, nu este deloc un fapt că ne vom regăsi în contextul său, deoarece Linux este un sistem multitasking care comută procesele unul după altul, iar comenzile ADDR (commutarea contextului) sunt în „lexicon” Lineiceîncă nu există și nu se știe când va apărea. Prin urmare, trebuie să trișați setând puncte de întrerupere la apelurile de sistem utilizate de un anumit program sau intrând în proces folosind metoda INT 03h, despre care vom vorbi acum.

Tasta „-x”, transmisă aceluiași linsym, este responsabilă pentru descărcarea depanatorului (dacă chiar doriți să-l descărcați).

Bazele lucrului cu Lineice

Pentru cei care au lucrat deja cu SoftICE, mastering Lineice nu va prezenta nicio problema. Toate aceleași comenzi sunt folosite aici: D - memorie dump, E - editare memorie, T - urmărire pas cu pas, P - urmărire fără a introduce o funcție, R - vizualizarea / modificarea registrelor, BPM / BPX - setarea unui punct de întrerupere pe acces/execuție la memorie etc. O listă completă de comenzi este conținută atât în ​​ajutorul încorporat, apelat de HELP (apropo, „HELP command_name” oferă informații suplimentare despre comandă), cât și în documentația standard.

Hai să apăsăm și scotoci prin lista de procese afișată de comanda PROC, cu procesul curent evidențiat în albastru:

:PROC

1 0000 C1C3E000 SLEEPING 0 0 init
2 0000 F7EE8000 SORMIT 0 0 keventd
3 0000 F7EE2000 SLEEPING 0 0 ksoftirqd_CPU0
4 0000 F7EE0000 SLEEPING 0 0 ksoftirqd_CPU1
5 0000 F7ED0000 SORMIT 0 0 kswapd
6 0000 F7EAA000 SORMIT 0 0 bdflush
7 0000 F7EA8000 SLEEPING 0 0 actualizat
56 0000 F6A36000 SLEEPING 0 0 kjournald
1006 0000 F7A34000 RUNNING 0 0 automount
1013 0000 F68E6000 adormit 0 0 cupsd
...
1105 0000 F6DDE000 DORMAT 0 0 mc
1106 0000 F6DD4000 SLEEPING 0 0 cons.saver

Procesele sunt, desigur, bune, dar cum putem încă depana programele? Cel mai simplu lucru este să lipiți instrucțiunea mașină CCh corespunzătoare instrucțiunii INT 03h în punctul de intrare, având scris în prealabil conținutul octetului original. Acest lucru se poate face cu orice editor hexadecimal, de exemplu, am menționat în mod repetat
HTE.

După ce ați încărcat fișierul în editor, faceți clic (mod), selectați elf / imagine, reglați cursorul la „punct de intrare:”, apăsați (editați) și schimbați primul octet în CCh, salvați modificările până la (salvează și ieși. La pornirea unui program corelat Lineice apare imediat, alarmat de o excepție aruncată de CCh, după care EIP indică sfârșitul
CCh.

Starea programului cu punctul de intrare corectat în momentul în care apare depanatorul

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

Cursorul indică instrucțiunea in eax,dx (EDh), care este un fragment din instrucțiunea xor ebp,ebp (31h EDh) patch-ată. Acum (teoretic) ar trebui să restabilim octetul original schimbând CCh la 31h, să reducem registrul EIP cu unul și să continuăm urmărirea ca de obicei.

Da, nu era acolo! Lineice- acesta este, desigur, un port, dar doar foarte brut, și nu poate modifica memoria imaginii paginii, chiar dacă deschideți mai întâi segmentul de cod pentru scriere. Nici E (editare), nici F (umplere), nici M (copie de memorie) nu funcționează! Dar scrierea în stivă funcționează, iar pentru noi, hackerii, acest lucru este suficient.

Ne amintim valoarea actuală a registrului EIP; copiați instrucțiunea mașinii corecționate în partea de sus a stivei; restabiliți octetul CCh acolo; îi transferăm controlul, schimbând valoarea EIP; o executam prin efectuarea unui singur act de trasare; și întoarceți EIP la locul său, adică la următoarea comandă a mașinii:

Restaurarea octetului original înlocuit cu instrucțiunea INT 03h

; Ne uităm la ceea ce se află în partea de sus a stivei (din pură curiozitate).
:d esp-10
0018:BFFFEFC0 C0 82 04 08 00 00 00 00 5D 0C 00 40 DC EF FF BF

; Copiați instrucțiunile mașinii corecţionate în partea de sus a stivei.
; Numărul 10h este dimensiunea maximă posibilă a unei instrucțiuni de mașină pe x86.
:m eip-1 L 10 esp-10

; Să vedem cum s-a schimbat stiva.
:d esp-10
0018:BFFFEFC0 CC ED 5E 89 E1 83 E4 F0 50 54 52 68 F0 85 04 08

; Aha! Stack-ul s-a schimbat cu adevărat, este timpul să repari CCh la 31h.
:e esp-10 31
Editați datele imediate neimplementate încă.

; Hopa! Atribuirea directă a datelor nu este implementată în Linice,
; dar putem edita dump-ul în mod interactiv (la fel ca
; ca în SoftICE) sau comanda F esp-10 L 1 31, rețineți doar
; că, spre deosebire de SoftICE, depanatorul Linice nu actualizează fereastra de descărcare,
; deci, după executarea comenzii F, ar putea părea că
; nici un rezultat; de fapt, nu este cazul, trebuie doar să actualizați
; dump comanda D esp-10 și totul va cădea la loc.

; Transferăm controlul către comanda copiată în stivă,
; amintiți-vă valoarea registrului EIP.
:reip (esp-10)
reg:eip=BFFFEFC0

; Efectuăm un singur act de urmărire.
:t
0023:BFFFEFC2 5E pop esi

; După cum putem vedea, registrul EIP a crescut cu 2 (BFFFEFC2h - BFFFEFC0h) = 02h,
; prin urmare, adresa următoarei instrucțiuni este: 080482C1h - 01h + 02h = 080482C2h,
; unde 080482C1h este valoarea inițială a EIP la intrarea în program și 01h este dimensiunea INT 03h.

; Setați EIP la comanda urmând instrucțiunile corelate.
:reip 80482C2
reg:eip=80482C2

Aceste dansuri cu tamburin trebuie aranjate. Si ce sa fac? Deci, ne-am dat seama de încărcarea programelor în depanator, acum vom distruge punctele de întrerupere pentru apelurile de sistem și funcțiile kernelului.

Comanda exp afișează numele exportate de kernel, oricare dintre ele poate apărea în expresii, de exemplu „bpx do_bkr” este echivalent cu „bpx C012C9E8”.

Listarea numelor exportate de kernel

:exp
nucleu
C0320364 mmu_cr4_features
C02AC3A4 acpi_disabled
C02AC8A0 i8253_lock
...
C012BDA8 do_mmap_pgoff
C012C764 do_munmap
C012C9E8 do_brk
C011E990 ieșire_mm
C011E69C exit_files

Apelurile de sistem sunt mai dificile. Suport direct de la Lineice nu este aici (și ar trebui să fie, având în vedere specificul Linux), așa că acest lucru trebuie făcut manual.

Tabelul de apeluri de sistem este cunoscut a fi o matrice de cuvinte duble care încep de la adresa sys_call_table (această variabilă este exportată de kernel).

Tabel de apeluri de sistem

; Punem depanatorul în modul de afișare a cuvintelor duble.
:dd

; Afișăm tabelul pe ecran.
:d sys_call_table
0018:C02AB6A8 C0126ACC F8932650 F89326A0 C013DC10
0018:C02AB6B8 C013DD18 C013D5C8 C013D724 C011F3BC
0018:C02AB6C8 C013D664 C014A8E0 C014A3B4 F893020C

Fiecare element de tabel corespunde propriului apel de sistem, iar fiecare apel are propriul său număr, care poate fi găsit uitându-se la fișierul /usr/include/sys/syscall.h, dar este mai bine să faceți acest lucru nu sub Linux, unde există Nu există numere directe, dar pentru a împrumuta același fișier de la BSD - la fel, numerele apelurilor de sistem principal pe toate sistemele sunt aceleași. În special, apelul de sistem deschis este numărul 5.

Pentru a seta un punct de întrerupere la deschidere, trebuie să cunoașteți adresa acestuia, care se află în al cincilea cuvânt dublu din tabelul de apeluri de sistem, numărând de la zero și egală (în acest caz) C013D5C8h.

Setarea unui punct de întrerupere la apelul de sistem deschis

; Setați un punct de întrerupere la apelul de sistem deschis,
:bpx C013D5C8
; ieși din depanator
:X
...
# deschide un fișier
...
; depanatorul apare imediat, spunându-ne despre asta,
: Punct de întrerupere din cauza BPX 01

; dăm comanda proc pentru a ne asigura că ne-am blocat în procesul nostru.
:proc
PID TSS Starea sarcinii uid nume gid
1049 0000 F6364000 adormit 0 0 getty
1145 0000 F61CC000 DORMAT 0 0 mc
1146 0000 F614A000 SORMIT 0 0 cons.saver

În acest fel, este ușor să vă conectați la procesele care rulează deja, setând puncte de întrerupere pe apelurile de sistem pe care le folosesc, precum și făcând o mulțime de alte lucruri care sunt vitale pentru hacking.

Concluzie

În ciuda umidității sale clare, Lineice destul de potrivit pentru depanarea aplicațiilor protejate, deși destul de des trebuie să recurgeți la soluții care sunt efectuate automat în depanatoarele normale. De aceea Lineiceîn niciun caz nu înlocuiește gdb, ci doar îl completează.

Termenul „depanare a nucleului” înseamnă examinarea structurii interne de date a nucleului și/sau trecerea prin funcții din nucleu. Această depanare este o modalitate foarte utilă de a explora elementele interne ale Windows, deoarece oferă afișări ale informațiilor interne ale sistemului care nu sunt disponibile prin alte mijloace și vă oferă o vedere clară a progresului codului din nucleu.

Înainte de a analiza diferitele modalități de depanare a nucleului, haideți să explorăm setul de fișiere care vor fi necesare pentru a efectua orice fel de astfel de depanare.

Simboluri de depanare a nucleului

Fișierele cu simboluri conțin numele funcțiilor și variabilelor, precum și schema și formatul structurilor de date. Ele sunt generate de programul linker și sunt folosite de depanatori pentru a se referi la aceste nume și pentru a le afișa în timpul unei sesiuni de depanare. Aceste informații nu sunt de obicei stocate în binar, deoarece nu sunt necesare atunci când codul este executat. Aceasta înseamnă că fără el, binarul devine mai mic și rulează mai repede. Dar î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, blocuri de fire, lista de drivere încărcate, informații despre utilizarea memoriei etc.), aveți nevoie de fișiere de simboluri adecvate și de cel puțin un fișier de simboluri. 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 Windows Service Pack sau un patch de actualizare a nucleului, trebuie să obțineți fișiere de simbol actualizate corespunzător.

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

Instrucțiuni detaliate pentru utilizarea serverului de caractere pot fi găsite în fișierul de ajutor Instrumente de depanare sau pe Internet la 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 DESPRE KHUFTPKUFCHB, OE SCHMSAEYEUS KHUFTPKUFCHBNY RPDLBYULY, OBRTYNET, MEOFSHCH, CH DBOOSCHK NPNEOF OE RPDDETSYCHBAFUS.

Notă: YURPMSHЪKhKFE LPNBODH benzi (8) DMS HLBBOYS SDTH NEUFB, ZDE OHTSOP UPITBOSFSH BCHBTYKOSHCHE DBNRSHCH. rPUME OBUFTPCLY RP LPNBODE schimb (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 config 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 ЪBCHESHUPTBY ЪBCHESHUPTBY.

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

bacsis: eUMMY CHSH YURPMSHHEFE FreeBSD CHETUYY 3 YMY VPMEE TBOOAA, CHSH DPMTSOSCH CHSHCHRPMOYFSH HUEYUEOYE PFMBDPYUOPZP SDTB LPNBODPK bandă, 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 TBURPMBZBFSPSHOPUS. la VPMSHYPK FBVMYGEK UYNCHPMCH CHOE HUEYUEOOOPN PFMBDPYUOPN SDTE LFP YЪMYYOSS FTBFB. rPUMEDOYE TEMYJSHCH FreeBSD YURPMSHJHAF SDTB CH JPTNBFE ELF, AICI EFP OE SCHMSEFUS RTPVMENPK.

еУМЙ ​​​​ЧЩ ФЕУФЙТХЕФЕ ОПЧПЕ СДТП, УЛБЦЕН, ОБВЙТБС ЙНС ОПЧПЗП СДТБ Ч РТЙЗМБЫЕОЙЙ ЪБЗТХЪЮЙЛБ, ОП ЧБН ОХЦОП ЪБЗТХЦБФШ Й ТБВПФБФШ У ДТХЗЙН СДТПН, ЮФПВЩ УОПЧБ ЧЕТОХФШУС Л ОПТНБМШОПНХ ЖХОЛГЙПОЙТПЧБОЙА, ЪБЗТХЦБКФЕ ЕЗП ФПМШЛП Ч ПДОПРПМШЪПЧБФЕМШУЛПН ТЕЦЙНЕ РТЙ РПНПЭЙ ЖМБЗБ -s , ХЛБЪЩЧБЕНПЗП РТЙ ЪБЗТХЪЛЕ , B UBFEN CHSHCHRPMOYFE FBLIE 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

uFB RPUMEDPCHBFEMSHOPUFSH HLBSCHCHBEF RTPZTBNNE savecore(8) DESPRE 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 SDMYUB VHDHF

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

Fișier-simbol kernel.debug fișier exec /var/crash/kernel.0 fișier-nucleu /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: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, -266509185e în db_fncall) 14:#4 0xf0101586 în db_command (-266509132, -266509132, -26651:010185e 0xf010185e) () 16:#6 0xf01040a0 în db_trap() 17:#7 0xf0192976 în kdb_trap(12, 0, -272630436, -266743723) 18:#8 0xf019d2976 în ... 20:#10 0xf019cb2f în capcană (...) 21:#11 0xf01932a1 în excepție:calltrap () 22:#12 0xf0191503 în cnopen (...) 23:#13 0xf0132c34 în spec_xf0132c34 în spec_4:f4 în spec_open #1 () 22:#12 0xf0191503 în cnopen (...) vn_open () 25:#15 0xf012a183 în deschis () 26:#16 0xf019d4eb în syscall (...) 27: (kgdb) up 10 28:Citirea simbolurilor pentru ../../i386/i386 /trap.c ...Terminat. 29:#10 0xf019cb2f în capcană (cadru=(tf_es = -260440048, tf_ds = 16, tf_\ 30:edi = 3072, tf_esi = -266445372, tf_ebp = -276445372, tf_ebp = -276445372, tf_ebp = -276445372, tf_ebp = -2726:30:30:30:30:30:30:30:6, tf_6:2726) 12, tf_ecx = -266427884, tf\ 32:_eax = 64772224, tf_trapno = 12, tf_err = -272695296, tf_eip = -26\ 33:6672343, = 33:6672343, = tf_6672343, = 3672343, = 3672343, = 3672343, = 3672343, = 3672343, = 3672343, = 3672343 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=03, 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 0xf012a186 in ()kg) sus 68:#5 0xf019d4eb în syscall(frame=(tf_es=39, tf_ds=39, tf_edi=\69:2158592, tf_esi=0, tf_ebp=-272638436, tf_isp=-278:1 =-278: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 :=8 -256 = 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 CHSHCHYERTYCHEDEOOOPNKH TsHTOBMH:

UFTPLB 6:

yFP DBNR, CHJSFC RTY RPNPEY DDB (UNPFTY OYCE), RPFPNH LPNNEOFBTYK L BCHBTYKOPNH PUFBOPCH YNEEF YNEOOP CHYD ``Pentru că ai spus! PDOBLP YOBYUBMSHOPK RTYUYOPK RETEIPDB CH DDB VSCHMB BCHBTYKOBS PUFBOPCHLB RTY CHPOYOLOPCHEOYA PYYVLY UFTBOIGSC RBNSFY.

UFTPLB 20:

ffp NEUFPOBIPTSDEOYE JHOLGYY capcană() H FTBUUYTPCHLE UFEBL.

UFTPLB 36:

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

UFTPLB 52:

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

UFTPLB 56:

pDOBLP, PYUECHIDOP, UFP PE HLBSCHCHBEF DESPRE NUPT, FBL UFP NSC OBYMY GENERAL 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 NBMEOSHLPEUMPEMPE)

  • Autori:

    Barinov S.S., Shevchenko O.G.

  • An:
  • O sursă:

    Informatică și tehnologii informatice / Materiale ale celei VI 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

Se face 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 în organizarea depanării acestuia din urmă. Pe baza rezultatelor obținute se formulează principalele cerințe pentru construcția depanatoarelor în mod kernel în cazul depanării de urgență și interactive. 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 din 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 depanatorul, 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.

Setul de instrumente de dezvoltare a aplicațiilor software oferă programatorului o gamă largă de posibilități. Orice mediu de dezvoltare integrat include, de asemenea, capacitatea de depanare fără a fi nevoie de 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. Fiecare dintre ele necesită condiții speciale: scrierea unui cod de program se realizează pe un sistem computerizat cu drepturi depline, depanare - pe un sistem de depanare, testare - în funcție de circumstanțe etc. Depanatorul în mod 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 aceste instrumente sunt disponibile, alternativele nu sunt adesea discutate. De exemplu, Microsoft Windows Debugger are un prag de intrare prea mare. Mulți programatori vorbesc despre prima experiență negativă atunci când se familiarizează cu ea, iar majoritatea caracteristicilor sale rămân nerevendicate.

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

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

Pentru a facilita lucrul cu codul dezasamblat, așa-numitul. simboluri de depanare. În timpul funcționării linkerului, pe lângă imaginea fișierului executabil, se poate crea și un fișier de date care să conțină informații care nu sunt necesare la executarea programului, dar sunt extrem de utile la depanarea acestuia: numele funcțiilor, variabile globale. , și descrieri ale structurilor. Simbolurile de depanare sunt disponibile pentru toate fișierele executabile ale sistemului de operare Windows.

Controlul execuției se referă la capacitatea de a întrerupe și relua execuția codului de program la atingerea unei anumite instrucțiuni din 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ă. Cu execuția liberă, întreruperea execuției are loc în secțiuni predeterminate de cod - locuri în care sunt setate punctele de întrerupere.

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

Părți ale depanatorului trebuie să ruleze și în modul kernel pentru a accesa memoria kernel-ului. 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ând memoria lor. Sistemul de operare Windows traduce adresele virtuale în adrese fizice pe baza conceptului de context de fir. Contextul firului - o structură care reflectă starea firului ș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. Comutarea contextului unui fir de execuție la un fir de execuție al altui proces schimbă, de asemenea, directorul paginii folosit pentru a traduce adresele virtuale în cele fizice.

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 întrerupe expedierea sau executarea firelor de execuție a sistemului. 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 sistem, pe de altă parte, 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 accesul la memorie relocabilă. O mare parte din informațiile din memorie sunt relocabile și pot fi mutate din memoria fizică pe hard disk în orice moment î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 va fi gestionată de managerul de memorie și, ca urmare, pagina va fi citită din fișierul de pagină și încărcată în memoria fizică.

Acest comportament este întrerupt dacă codul de depanare este forțat să utilizeze niveluri ridicate de cerere de întrerupere (IRQL). Dacă IRQL-ul este egal sau mai mare decât 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 bloca sistemul de operare.

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

Prin urmare, depanarea de urgență nu necesită instalarea unui instrument 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 cauza. Aceste informații salvate într-un fișier se numesc memorie dump.

Principalele instrumente de depanare în modul kernel sunt furnizate de producătorul sistemului de operare Windows 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 mecanismele furnizate de dezvoltatorii sistemului de operare și încorporate în nucleul acestuia.

Modul principal pentru Windows Debugger este modul interpret de comenzi. Datorită structurii sale modulare, împreună cu comenzile furnizate de dezvoltator, Windows Debugger acceptă module terțe numite extensii. De fapt, majoritatea comenzilor încorporate sunt formatate și ca extensii.

Windows Debugger este axat pe depanarea interactivă de la distanță și de urgență, folosindu-se toate capabilitățile sale. În același timp, depanarea interactivă locală cu drepturi depline nu este acceptată: depanatorul vă permite doar să vizualizați unele structuri ale nucleului.

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

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

Depanatorul nucleului SoftICE, lansat de Compuware în pachetul software DriverStudio, a acționat în mod tradițional ca o alternativă la pachetul Instrumente de depanare pentru Windows. Un semn distinctiv al 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, familia de produse DriverStudio a fost întreruptă din cauza „multelor probleme tehnice și de afaceri, precum și a condițiilor generale de piață”. Cea mai recentă versiune a sistemului de operare acceptată este Windows XP Service Pack 2. În general, pachetele de service nu modifică API-ul sistemului de operare, dar numerele de apel de sistem și alte informații nedocumentate se pot modifica. Depanatorul SoftICE s-a bazat pe adresele hardcoded ale structurilor de date interne. Ca urmare, odată cu lansarea Service Pack 3, compatibilitatea a fost întreruptă. 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.

Windows Debugger este în prezent principalul instrument printre dezvoltatorii de module kernel. Este folosit și de echipa de dezvoltare a nucleului sistemului de operare Windows.

Uneori am o situație în care Windows așteaptă un timp de pornire pentru depanatorul nucleului. Veți vedea textul „Pornire Windows”, dar nu și logo-ul.

Dacă atașez acum depanatorul, se redă animația logo-ului Windows 7. După aceea, logo-ul începe să pulseze. În acest moment, procesul de descărcare nu mai progresează. Utilizarea procesorului este redusă la minimum. De obicei aștept câteva minute, dar nu se întâmplă nimic.

Acest lucru nu se întâmplă întotdeauna. Cu toate acestea, dacă se întâmplă acest lucru, resetarea VM-ului nu va ajuta. Pentru a remedia această problemă, trebuie să folosesc repararea la pornire. Din păcate, acest lucru durează o veșnicie.

Aveți idee despre ce pot face în afară de efectuarea unei reparații la pornire?

Multumesc anticipat!

3

2 raspunsuri

Pentru a remedia problema pe care o întâmpinați, apăsați pur și simplu F10 în timpul pornirii. Și eliminați/depanați și opțiunile conexe. Apoi apăsați enter.

Sugestie: Nu utilizați opțiunea /debug pentru opțiunea implicită din meniul de pornire. Copiați configurația de pornire într-o intrare nouă. Apoi setați-l în modul de depanare. Windows nu știe când veți folosi depanatorul. Prin urmare, el trebuie să aștepte.