Modul de depanare a kernelului Windows 7. Principiul depanatorului de bază al sistemului de operare. Simboluri pentru depanarea kernel-ului

Termenul "depanare de bază" înseamnă studierea structurii interne a datelor nucleului și (sau) urmărirea pas cu pas a funcțiilor în kernel. Această depanare este o modalitate foarte utilă de a studia dispozitivul interne Windows, deoarece vă permite să afișați afișarea informațiilor interne ale sistemului inaccesibile atunci când se utilizează alte mijloace și oferă o idee clară despre progresul codului în kernel.

Înainte de a examina diverse metode de depanare a kernelului, să explorăm un set de fișiere care vor fi necesare pentru a pune în aplicare orice astfel de depanare.

Simboluri pentru depanarea kernel-ului

Fișierele de simboluri conțin caracteristici și nume variabile, precum și o diagramă și formatul structurilor de date. Acestea sunt generate de programul Linker (Linker) și sunt folosite de depanare pentru legături cu aceste nume și să le afișeze în timpul sesiunii de depanare. Aceste informații nu sunt de obicei stocate în cod binar, deoarece nu este necesar la executarea codului. Aceasta înseamnă că, fără ea, codul binar devine mai mic și se efectuează mai repede. Dar înseamnă, de asemenea, că atunci când depanarea, trebuie să oferiți acces la depanare la fișierele asociate cu imagini binare la care sunt conectate legăturile în timpul sesiunii de depanare.

Pentru a utiliza orice instrument de depanare în modul kernel pentru a studia dispozitivul intern al structurii datelor Windows Kernel (lista de procese, blocuri de flux, o listă de drivere încărcate, informații despre utilizarea memoriei etc.) Aveți nevoie de fișierele de caractere potrivite Și, cel puțin, fișierul personajelor pentru imaginea binară a kernel-ntoskrnl.exe. Fișierele de table de caractere trebuie să corespundă versiunii imaginii binare din care au fost extrase. De exemplu, dacă pachetul Windows Service Pack este instalat sau o anumită remediere care actualizează kernelul, trebuie să obțineți fișiere actualizate ale caracterelor.

Încărcarea și instalarea caracterelor pentru diferite versiuni de Windows nu este dificilă, dar nu este întotdeauna posibilă actualizarea corecțiilor pentru remedii. Cea mai ușoară modalitate de a obține versiunea dorită a caracterelor de depanare contactând serverul Microsoft Simbol proiectat special pentru aceasta, utilizând sintaxă specială pentru acest lucru pe calea către simbolurile specificate în depanator. De exemplu, următoarea cale către simboluri face depanarea pentru a descărca caractere de pe serverul de internet simbol și salvați copia locală în folderul C: \\ Simboluri: SRV * C: \\ simboluri * http: //msdl.microsoft.com/download/ Simboluri

Instrucțiuni detaliate pentru utilizarea unui server simbolic pot fi găsite în fișierul de ajutor Debug sau pe Internet de pe pagina web http://msdn.microsoft.com/en-us/windows/hardware/ggg462988.aspx.

  • Autori:

    Barinov S.S., Shevchenko o.g.

  • An:
  • O sursă:

    Informatică și tehnologii informatice / Materiale ale Conferinței științifice și tehnice internaționale VI, studenți, absolvenți și tineri oameni de știință - 23-25 \u200b\u200bnoiembrie 2010, Donetsk, Donntu. - 2010. - 448 p.

adnotare

O analiză comparativă a depunerii modului de utilizator și a modului de kernel este aplicată sistemului de operare Microsoft Windows, distinge și problemele de organizare a celor din urmă de depanare. Pe baza rezultatelor obținute, cerințele principale pentru construirea debugarilor de regim de kernel în caz de urgență și de depanare interactivă. O analiză a soluțiilor existente a fost efectuată pentru respectarea cerințelor. În special, o atenție deosebită este acordată depanatorului Microsoft Windows Debugger.

Parte principală

Depanarea este procesul de determinare și eliminare a cauzelor erorilor din software. În unele proiecte, depanarea durează până la 50% din timpul total de dezvoltare. Debugging-ul poate fi simplificat semnificativ atunci când se utilizează instrumente specializate care sunt îmbunătățite constant. Principalul instrument este debuggerul, care vă permite să controlați implementarea software-ului, să vă urmăriți mișcarea și să interferați cu acesta. Instrumentele de depanare a kernelului sunt folosite în mod predominant de către dezvoltatorii de șoferi.

Aplicații Software Development Toolkit oferă o gamă largă de caracteristici. Orice mediu de dezvoltare integrat include posibilitatea depanării fără a fi nevoie să utilizeze utilități terță parte. Dacă vorbim despre software-ul sistemic și dezvoltarea driverelor în special, atunci în virtutea specificului său, procesul de dezvoltare este extrem de dificil și are puțin automat. Toate fazele de dezvoltare, inclusiv depanarea, sunt separate. Pentru a realiza fiecare dintre ele, sunt necesare condiții speciale: scrierea codului programului se efectuează pe un sistem informatic complet, depanarea - pe sistemul de depanare, testarea - în funcție de circumstanțe etc. Același debugger de regim de kernel este mai complex în dezvoltarea și, în consecință, mai puțin prietenos.

În general, putem vorbi despre lipsa de depanare de bază. Deși acest mijloc sunt disponibile, adesea nu este necesar să vorbim despre alternative. De exemplu, Debuggerul Microsoft Windows Debugger are un prag prea mare de intrare. Mulți programatori vorbesc despre prima experiență negativă atunci când îl întâlnesc și majoritatea posibilităților sale rămân ars.

Pe baza structurii spațiului de adresă virtuală, dacă se efectuează o eroare în aplicație, ca rezultat, aplicația va înregistra date într-o locație de memorie arbitrară, aplicația va deteriora numai memoria proprie și nu va afecta funcționarea altora Aplicații și sistemul de operare. În timp ce codul modului de bază este capabil să deterioreze structurile importante de date ale sistemului de operare, ceea ce va duce în mod inevitabil la un eșec comun. Driverul ineficient scris poate provoca degradarea gravă a întregului sistem de operare.

    Debuggerii moderni oferă următoarele funcții de bază:
  • depanarea la nivelul codului sursă;
  • gestionarea executării;
  • vizualizați și modificați memoria;
  • vizualizați și modificați conținutul registrelor procesorului;
  • vizualizați stiva de apeluri.

Pentru a facilita lucrul cu codul de dezasamblare, așa-numitele sunt utilizate. Debuging personaje. În timpul lucrării linkerului, în plus față de imaginea fișierului executabil, poate fi creat și un fișier de date care conține informații care nu sunt necesare atunci când execută programul, dar este extrem de util la depanarea: numele funcțiilor, globale Variabile, descrierea structurilor. Caracterele de depanare sunt disponibile pentru toate fișierele de sistem de operare Windows executabil.

Sub controlul execuției înseamnă capacitatea de a întrerupe și de a reînnoi executarea codului programului pentru a obține o comandă specificată în codul programului. Dacă codul programului este executat în modul pas cu pas - întreruperea apare pentru fiecare limbă de programare Lexeme sau la ieșirea subrutină. Cu execuție gratuită, întreruperea executării are loc în secțiunile avansate ale codului - locurile în care sunt instalate punctele de oprire.

La întreruperea codului modului de bază, apare următoarea dilemă. Debuggerul pentru a interacționa cu programatorul utilizează interfața cu utilizatorul. Acestea. La minimum, partea vizibilă a debuggerului este efectuată în modul utilizator și utilizează în mod natural interfața de programare a aplicației (Windows API), care la rândul său se sprijină pe modulele modului de kernel. Astfel, suspendarea codului modului de bază poate duce la blocarea reciprocă: sistemul va înceta să răspundă solicitărilor utilizatorilor.

Pentru a accesa memoria kernelului, componentele debuggerului trebuie să fie efectuate și în modul kernel. Acest lucru duce la apariția a două probleme imediat, ceea ce reprezintă o consecință evidentă a organizării memoriei în modul procesor protejat.

Prima problemă se referă la difuzarea adreselor virtuale de memorie. Driverele interacționează în mod constant cu aplicațiile de regim de utilizare prin adăugarea de acces la memoria lor. Sistemul de operare Windows difuzează adresele virtuale fizice, ghidate de conceptul contextului fluxului. Contextul fluxului este o structură care reflectă starea fluxului și incluzând, în special, un set de registre și alte informații. Când controlul este transmis către un alt flux, apare un comutator de context, în care sunt salvate informații despre un flux și sunt restaurate informații despre celălalt. Când comutați contextul fluxului la un flux al unui alt proces, directorul de pagină utilizat pentru a difuza adresele virtuale la fizice este, de asemenea, comutat.

Particularitatea este că atunci când sistemul de expediere a sistemului, sistemul de operare Windows nu comută contextul. Datorită acestui lucru, codul modului de kernel poate utiliza adresa virtuală a modului utilizator.

În caz contrar, situația este atunci când sunt expediate întreruperi sau fire de sistem de performanță. Întreruperea poate apărea în orice moment, deci este imposibil să se prezică în ce context al fluxului va fi utilizat. Fluxurile sistemice nu aparțin niciun proces și nu pot difuza adresa virtuală a modului utilizator. De aici rezultă că în aceste situații este imposibil să se facă referire la memoria regimului de utilizare.

A doua problemă este de a apela la memoria mobilă. Majoritatea informațiilor din memorie sunt mișcate și în orice moment pot fi mutate din memoria fizică pe un hard disk din fișierul de pagină. Dacă vă referiți la pagina care este absentă în memoria fizică, într-o situație normală, procesorul va genera o întrerupere a memoriei managerului de memorie și, ca rezultat, pagina va fi citită din fișierul de pagină și încărcată în memorie fizică.

Comportamentul descris este încălcat dacă codul programului Debugger este forțat să utilizeze un nivel ridicat de interogare a întreruperii (niveluri de cerere de întrerupere, IRQL). Cu IRQL, care coincide cu sau depășește managerul de memorie IRQL, doamna nu va putea încărca pagina lipsă, deoarece Sistemul de operare va bloca defecțiunea paginii de întrerupere. Acest lucru va duce la prăbușirea sistemului de operare.

Debugging-ul este acceptat pentru interactiv și de urgență. Cu depanarea locală interactivă, debuggerul este efectuat în același sistem ca și obiectul de depanare. Cu depanarea interactivă la distanță, debuggerul și obiectul de depanare se efectuează în diferite sisteme. La depanarea codului de kernel, sistemul trebuie monitorizat, pornind de la primii pași de descărcare, când rețeaua nu funcționează încă, prin urmare, interfețele seriale simple, cum ar fi com, Firewire, USB, sunt utilizate pentru a comunica sistemele. Recent, din cauza tendințelor în dezvoltarea de virtualizare a software-ului la diferite niveluri de abstracții, mașinile virtuale sunt din ce în ce mai atrase. OS de oaspeți acționează ca un depanat, sistemul de operare include interfața utilizatorului debugger.

Astfel, pentru depanarea de urgență, nu este necesar să instalați un 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 o poate analiza și de a afla cauza. Aceste informații stocate într-un fișier se numește o haldă de memorie.

Mijloacele de depanare a modului de bază de bază sunt furnizate de producătorul sistemului de operare Windows în cadrul instrumentelor de depanare gratuite pentru pachetul Windows. Instrumentele includ dispozitivele grafice și consolă ale WindBG și KD (denumită în continuare Windows Debugger). Activitatea acestor depapri se bazează pe mecanismele prevăzute de dezvoltatorii sistemului de operare și se află în kernelul său.

Modul principal pentru Windows Debugger este modul de interpret de comandă. Datorită structurii modulare, împreună cu dezvoltatorii furnizați, comenzile Windows Debugger suportă module de partid numite extensii. De fapt, cele mai multe comenzi încorporate sunt, de asemenea, decorate sub formă de extensii.

Windows Debugger este axat pe depanarea interactivă și de urgență la distanță, atunci când se utilizează toate capacitățile sale sunt dezvăluite. În același timp, depanarea integrală locală locală nu este acceptată: Debuggerul permite doar vizualizarea unor structuri de kernel.

Există un modul de extensie pentru Windows Debugger numit Livekd, creat de Mark Russinianovici, care într-un anumit sens implementează depanarea interactivă locală. Livekd pe Go creează o hartă a memoriei sistemului de lucru și o folosește pentru depanare.

Instrumentele "Instrumente de Debugging for Windows" sunt actualizate periodic și acceptă toate sistemele moderne de operare Windows.

Debuggerul de kernel softice, produs de compuware în pachetul de software DriveRstudio, a efectuat în mod tradițional o alternativă la pachetul "Instrumente de Debugging for Windows". O caracteristică distinctivă a softice a fost implementarea depanării interactive locale pe hardware-ul acceptat. Debuggerul ar putea controla aproape complet funcționarea sistemului de operare.

Începând cu 3 aprilie 2006, vânzarea produselor familiale de la DriveRstudio au fost întrerupte din cauza "multor probleme tehnice și de afaceri, precum și statutul general al pieței". Ultima versiune a sistemului de operare, a căror suport a fost implementată este Windows XP Service Pack 2. De regulă, actualizările serviciului nu modifică interfața aplicației sistemului de operare, dar numărul de numere de apel de sistem și alte informații nedocumentate pot fi supuse Schimbare. Debuggerul softice a bazat pe adrese rigid prescrise ale structurilor interne de date. Ca o consecință - cu menținerea pachetului de servicii 3 a fost întreruptă compatibilitatea. Evident, mai multe versiuni ulterioare ale sistemului de operare Windows nu sunt de asemenea acceptate.

Syser Kernel Debugger creat de o mică companie chineză SyserSoft ca înlocuitor al unui depanare softice. Prima versiune finală a fost lansată în 2007. La fel ca Softice, Debugger-ul Syser Kernel este capabil să efectueze depanarea interactivă pe sistemul de operare. Suportat sunt doar ediții pe 32 de biți ale versiunilor moderne de ferestre.

În prezent, Windows Debugger este instrumentul principal dintre dezvoltatorii modulelor de kernel. De asemenea, utilizează echipa de dezvoltare a sistemului de operare Windows.

cPP OelpFpt Program Hlbbeus RP Tbvpffu la Pfmbdlpk SDTB la BTBTKYKY DBNRBNY RBNSFY. Lbn rtbchymp, chbn okthtsop vkdef obbdbfs PDOP yuy khufftspufch rpdlbüli, webcme retauyuyuyui / etc / fstab. Uptpu pvtbfcf rbnsfy pe Hufpkufchb, Oe Scamsayus Huftspuchby Rapdlbüli, Ottinet, Mephisp, H Cleaner NPNOFOF OE Rapdabychbafus.

Notă: Yurpmshkfa lpnbodh. dumpon (8) DMS Chlbobyus SDTX Street, Zej Okhtsop Upbosfsh Bchbtchchch. RPUME FITTPLY RP LPNBODE swapon (8) TBDEMB RPDLBYL DPMTOB VSSFSHBBBRTRTBNNB Dumpon. PVSHUUP LFP CHRCHRPostopus Кабддбуенен Реесеенопк Dumpdev H Zbkme rc.conf (5) . Emuy bdbdbob lfb reseteobi, fp rpume Ohps ittchpk nopzprshpchbfemshulpk retebzthely vkhdaf bchpngfyeyely obbrheeb rtpztbnnb saveecore (8) . BCNR Bchbtkokok DBNR SDTB H LBFBMS, BDBDIR HT RETENOPC Dumpdir ZBKMB RC.CONF. Rp khnpmyuba lbfbmpn dms bchbtky dbnrph scmsefus / var / accident.

mIVP chist NPSFF CBDBFS HUFTPKUFCHP DMS OTTPUB PVTBBB RBNSFY SCHOPA UTAIL RBTBNEXT HUPSHTBGOPOPZP ZBBKMB CHBESP SDTB. FBLPK URROPV YURPMSHPCHBSH OE TELPNOODHEFUS pe DPMTSEO YURPMSHPCHBFSHUS, FPMSLP Emuy Chist IPFIFE RPMKHYUBFSH BTBTYKHOTS PVTBTP RBNSFY SDTB, LPFTPP BTBTYKOP Bchetefff Tbvff ^ Des Obbzth.

Notă: DBME Fetallo GDB Pedobyubef Pfumbdyuil GDB, obrechoeosobhe hl` `thesin pfambdles sdtb" ". Rfpf teco dpufyzbefus obkulpn gdb în rbtbnefpn -k. H Tecine Pfmbdly SDTB GDB Studii de școală Yena despre (KGDB).

Bacsis: Emum Chist Yurpmshefe FreeBSD Chetuy 3 YMI NMEA TBOAA, Chheeyuye PfLDPYOPSP SDTB LPBodPK Strip, B OE HUFBOBCHBFSH VSSHPE PFLDPYOPE SDTP:

# Cp kernel kernel.debug # Strip -G kernel

lFPF IBZ OE FBL HTS Opepipdine, op TVPneiodh. (PE FreeBSD 4 J VPMEE RPDOYI TEMYBI FPF YBZ CHSCHRPMOSEFUS BCHFPNBFYYUEULY H LPOGE RTPGEUUB RPUFTPEOYS SDTB make.) LPZDB RAS HUEYUEOP, BCHFPNBFYYUEULY YMY RTY RPNPEY LPNBOD CHSCHYE, BL NPTSEFE HUFBOPCHYFSH EZP PVSCHYUOSCHN PVTBPN, make OBVTBCH instalare.

babnefshet, YUFP H Ufbitschi Chetuyi FreeBsd (DP 3.1, OE Chlmayubs LFPF Temm), Yurpmshhefus sdtb H Zhpstnbfe A.Out, Ripfpnh Yi Fbvmygsk Uinchpmpchus rpufsopspc h rbnsfy. La vpmshiktkin fbvmygegk uinchpmpc h oe hueyuyoopn pfampuopop sdte lfb ymyyoss ftbfb. RPUMEDAYEE Teme de FreeBSD YUPMSHHAF SDTB H Zhptnbfe Elf, Zea LFP OE SCMSEFUS RTPVEMPK.

eUMY BL FEUFYTHEFE OPCHPE RAS, ULBTSEN, OBVYTBS YNS OPCHPZP SDTB RTYZMBYEOYY BZTHYUYLB W, OP CHBN OHTSOP BZTHTSBFSH J TBVPFBFSH au DTHZYN SDTPN, YUFPVSCH UOPCHB CHETOHFSHUS A OPTNBMSHOPNH ZHHOLGYPOYTPCHBOYA, BZTHTSBKFE EZP FPMSHLP B PDOPRPMSHPCHBFEMSHULPN TETSYNE RTY RPNPEY ZHMBZB -s, HLBSCHCHBENPZP RTY BZTHLE, B Obbfen Khshchpmife FBLY SBZY:

# FSCK-PP # Mount -a -t UFS # Deci sistemul dvs. de fișiere pentru / var / accident este scris # Savecore -n /kernel.panicked / var / crash # Exit # ... la multi-utilizator

bFB RPMEDPCHBFEMSHOFFS HLBCHBFF RTPZTBNN saveecore (8) Despre yurpmshptbe dtzpzp sdtb dm yuchmeyuyuyuyus yehno. Yobyuyk vekdef yurpmshpchbfs sdtp, tbvpfbaee h tb npneoph, ulpse chuzp, Oyuzp Oe UltMBEF, RPFPH UFP BTBTKOKSK RBNSFY Y UINCHPMSK SDTB VHDHF PFMYUBFSUS.

b FiRTH, RPUME UTILTUB BTBTYKOPP DBNRB, Retekdife H LBFbbbs / Sys / Compile / Oricare Y Bromhufyfe LPNBODH GDB -K. YA RTPZTBNCH GDB UFP SPF UFP:

Simbol-fișier kernel.debug exec-fișier /var/crash/kernel.0 Core-fișier /var/crash/vmcore.0th chbms - chist npsef Pfmbychbfs btbtkom dbnr, yurpmshks yuipdocke Felufshs sdtb fbbefe, llb chiste mavpk dtzpk rtpztbnnpk.

cHPF TSKTOBM LPNBO OBEBUB TBVPFSH GDB, YmMauftHakek BFH RTPGEDCHT. DMYO-VOSTHPLY Vshmy TBPTCHBS DMS Hmkhyuyus Yufbvemshopufy DMSU DMS HDpvufchb SftPly Wills RTPokHNet Adezivi. Chuu PUFBMSHOP SCMSEFUS FTBUYTPCHLPK POYVLY, TEBMSHOP CHPYULOKHCYK CHP TBETS TBVPFSHD DTBCHTPN LPOPMY PCVT.

1: Scriptul a început la Fri Dec 30 23:15:22 1994 2: # CD / Sys / Compile / Uria 3: # GDB-Kernel /vcore.1 4: Citirea datelor simbolurilor de la / USR / SRC / Sys / compilă / uriah / kernel ... făcut. 5: IDLEPDD 1F3000 6: Panică: Pentru că ai spus! 7: PCB curent la 1E3F70 8: Citirea în simboluri pentru ../../i386/i386/machdep.c...done. 9: (KGDB) în cazul în care 10: # 0 boot (arghowto \u003d 256) (.. /../i386/i386/machdep.c linia 767) 11: # 1 0xf0115159 în panică () 12: # 2 0xf01955bd în Diedie ( ) (.. /../i386/i386/machdep.c linia 698) 13: # 3 0xf010185e în db_fncall () 14: # 4 0xf0101586 în db_command (-266509132, -266509516, -267381073) 15: # 5 0xf0101711 in DB_COMMAND_LOOP () 16: # 6 0xF01040A0 în DB_TRAP () 17: # 7 0xf0192976 în KDB_TRAP (12, 0, -272630436, -266743723) 18: # 8 0xf019d2eb în cap_fatal (...) 19: # 9 0xf019CE60 în Trap_pfault ( ...) 20: # 10 0xf019cb2f în capcana (...) 21: # 11 0xf01932A1 În mod excepțional: Calltrap () 22: # 12 0xf0191503 în CNOPEN (...) 23: # 13 0xf0132C34 în Spec_Open () 24: # 14 0xF012D014 în VN_OPEN () 25: # 15 0xf012A183 în Open () 26: # 16 0xf019d4eb în Syscall (...) 27: (KGDB) Up 10 28: Citirea în simboluri pentru ../../I386/i386 /trap.c...done. 29: # 10 0xf019Cb2f în capcana (TF_ES \u003d -260440048, TF_DS \u003d 16, TF_ \\ 30: EDI \u003d 3072, TF_ESI \u003d -266445372, TF_EBP \u003d -272630356, TF_ISP \u003d -27 \\ 31: 2630396, TF_EBX \u003d - 266427884, tf_edx \u003d 12, tf_ecx \u003d -266427884, tf \\ 32: _eax \u003d 64772224, TF_TRAPNO \u003d 12, TF_ERR \u003d -272695296, TF_EIP \u003d -2695296, TF_EIP \u003d -266469368, TF_EFLAGS \u003d 66066, TF_ESP \u003d 3072, TF_ \\ 34: SS \u003d -266427884)) (.. /../i386/i386/trap.c linia 283) 35: 283 (Void) Trap_pfault (& cadru, fals); 36: (KGDB) Frame cadru-\u003e TF_EBP Frame-\u003e TF_EIP 37: Citirea în simboluri pentru ../../386/isa/pcvt/pcvt_drv.c...done. 38: # 0 0xF01AE729 în PCOPEN (Dev \u003d 3072, Steag \u003d 3, Mod \u003d 8192, P \u003d (Struct P \\ 39: ROC *) 0xF07C0C00) (.. /../i386/isa/pcvt/pcvt_drv.c Linie 403) 40: 403 Întoarcere ((* linkw.l_open) (dev, tp)); 41: (KGDB) Lista 42: 398 43: 399 TP-\u003e T_State | \u003d ts_carr_on; 44: 400 TP-\u003e T_Cflag | \u003d Clocal; / * Nu poate fi un modem (:-) * / 45: 401 46: 402 #if pcvt_netsd || (PCVT_Freebsd\u003e \u003d 200) 47: 403 Return ((* linesw.l_open) (dev, tp)); 48: 404 #Lese 49: 405 Return ((* linesw.l_open) (dev, tp, pavilion)); 50: 406 #DIF / * PCVT_NETBSD || (PCVT_Freebsd\u003e \u003d 200) * / 51: 407) 52: (KGDB) Imprimare TP 53: Citirea în simboluri pentru ../../i386/i386/cons.c...done. 54: $ 1 \u003d (Struct Tty *) 0x1bae 55: (KGDB) Imprimare TP-\u003e T_line 56: $ 2 \u003d 1767990816 57: (KGDB) Up 58: # 1 0xf0191503 în CNOPEN (DEV \u003d 0x00000000, Steag \u003d 3, Mod \u003d 8192, p \u003d (St \\ 59: RUCT PROC *) 0xF07C0C00) (..../i386/i386/cons.c linia 126) 60: Return ((* cdevsw.d_open) (dev, pavilion, mod, p)); 61: (KGDB) Up 62: # 2 0xF0132C34 în Spec_Open () 63: (KGDB) Up 64: # 3 0xf012d014 în VN_OPEN () 65: (KGDB) Up 66: # 4 0xf012A183 în Open () 67: (KGDB) UP 68: # 5 0xF019D4EB în Syscall (Frame \u003d (TF_ES \u003d 39, TF_DS \u003d 39, TF_EDI \u003d \\ 69: 2158592, TF_ESI \u003d 0, TF_EBP \u003d -272638436, TF_SP \u003d -272629788, TF \\ 70: _ebx \u003d 7086, TF_EDX \u003d 1, tf_ecx \u003d 0, TF_EAX \u003d 5, TF_TRAPNO \u003d 582, \\ 71: TF_ERR \u003d 582, TF_CS \u003d 31, TF_EFLAGS \u003d 582, TF_ESP \\ 72: \u003d -272638456, TF_SS \u003d 39)) ( ./../386/i386/trap.c linia 673) 73: 673 Eroare \u003d (* Callp-\u003e Sy_Call) (P, Args, Rval); 74: (KGDB) Up 75: Cadrul inițial selectat; Nu poți să te ridici. 76: (KGDB) Quit 77: # Exit 78: Ieșire 79: 80: Scriptul făcut pe Fri Dec 30 23:18:04 1994

lPNDEFBTY L Chtchtobmh:

SFTPLB 6:

lFP DBNR, CHSFSHK ^ DDB (OSET OST), RPPPNH LPNNEFBTYK L BCHBTYKOKOPH PUFBOPCH YNEF Yneoop chede `` Pentru că ați spus! "" FTBYTPCHLB UFELB ZMHVPLB; Pdoblp yebubyubmshopk quyupk reteypdb h ddb linchem btbtkobs PUFBOPCHLB ^ Dery spyohophea poyvly uftbugshchy rbnsfy.

SWFLB 20:

lFP Trep () h ftbuytpchle ufeelb.

SWFLB 36:

quhdifemshope yurpmshptoma orthrch zabugshchy ufeelb; Ferretsh LFP Oe Okhtsi. RTERPPZUFUS, YUFP Ztbugshchs Ufelb Chlbzhchbaf Despre RTBCHIMSHOPE TBBRPMPSEYE, DBCU H UMKHYUBI BTBTYKOPP PUFBOCHB. ZMSDS Despre UFTPLH YUIPDOPP PDB 403, NPSOP ULBBFSH, YUFP CEUSHNB CHETPSFOP, YUFP MIVP CHEPCHBF DPUFHR RP HLBBFEMA `TP" ", Myvp Vshshpd Kba Zubugshb Nbychb.

SWFLB 52:

rPIPCE, YUFP Cheopchbf Hlbbfensh, Op pe SCMSEFUS DPRHUFINSHN BDTEUP.

SFTPLB 56:

pdoblp, Puehuydop, YUFP pe Chlbchchchbf Despre Nhepta, FBL YUFP NSH Brofly Oby Mills! .

Cum de a lansa depanatorul de kernel?

Răspunsul Maestrului:

În procesul de dezvoltare a software-ului, există o componentă foarte importantă - aceasta este depanarea. În ceea ce privește programele de aplicare, se efectuează prin intermediul că lucrările în modul utilizator și adesea încorporate în IDE. Pentru a putea să se abată, de exemplu, șoferul, trebuie lansat depanatorul de kernel.

Trebuie să rulați procesorul de comandă CMD. Deschideți meniul Start din bara de activități. În fereastra care apare, faceți clic pe "Run ...". Se afișează fereastra "Program de pornire". În caseta de text, introduceți CMD, apoi faceți clic pe butonul "OK".

Acum creați o copie de rezervă a fișierului boot.ini. Aflați mai întâi calea de instalare a copiei curente a Windows utilizând comanda: Echo% Systemroot%

Apoi, accesați discul, cu sistemul de operare instalat introducând dispozitivul Listers și după ele, punând colonul. Utilizând comanda CD, accesați directorul rădăcină. Folosind acum comanda APS, scoateți atributele "ascunse", "numai pentru citire" și "System" din fișierul Boot.ini. Comanda copiere Creați o copie de rezervă și apoi setați atributele la locul respectiv.

Pentru a elimina lista de opțiuni de descărcare curentă, utilizați comanda bootcfg / interogare. Vizualizați lista și definiți acest element pe baza cărora vor fi create noi setări cu posibilitatea depanării în modul kernel. Identificatorul de înregistrare a încărcăturii trebuie să fie reținut.

Utilizați comanda bootcfg / copy pentru a crea o înregistrare de boot. Pentru a specifica identificatorul de înregistrare pe care îl veți copia, utilizați parametrul / ID. Folosind parametrul / D, setați numele de înregistrare care va fi afișat. Acum trebuie să reveniți la lista de opțiuni de descărcare utilizând comanda bootcfg / interogare și uitați-vă la identificatorul de intrare adăugat.

Acum trebuie să activați opțiunile pentru a porni depanatorul de kernel la înregistrarea de boot create anterior. Dacă depanați pe mașina țintă, trebuie doar să adăugați opțiunea / Debug.

Dacă doriți să implementați o depanare la distanță cu conexiunea computerului țintă prin portul COM la mașina gazdă, utilizați opțiunile / port și / baud pentru a specifica numărul portului și cursul de schimb.

Dacă depanați de la distanță prin cablul firewire (interfața IEEE 1394), atunci Pentru a activa modul corespunzător, utilizați opțiunea / DBG1394 și pentru a specifica opțiunea Număr de canale / CH.

Pentru a vă asigura că modificările sunt efectuate, verificați boot-ul utilizând comanda bootcfg cu parametrul / interogare. Prin punerea comenzii de ieșire, închideți fereastra procesorului de comandă.

Dacă este necesar, schimbați setările de încărcare a sistemului de operare. Deschideți panoul de control prin meniul Start și deschideți elementul "Sistem" deja în el. În fereastra "Proprietăți sistem" care se deschide, selectați fila Avansat. În această filă, selectați o secțiune cu numele "Descărcare și recuperare" și faceți clic pe butonul "Parametri". În fereastra "încărcare și recuperare" care apare, trebuie să activați opțiunea "Lista de afișare a sistemelor de operare". Închideți ambele casetă de dialog cu butonul "OK".

Efectuați un computer pentru a reporni. Selectați Încărcarea cu debugger. Conectați-vă la sistem și începeți să lucrați la mașina țintă sau să începeți depanarea la distanță. Profitați de mijloacele precum WindBG și KD.

Depandiile decente la nivel nuclear și sub ferestre sunt un pic, iar în Linux pot fi numărate pe degetele unei mâini, iar cele mai multe brute, neterminate sau abandonate și mușchi au depășit ... astăzi vom vorbi despre cele mai populare și cele mai interesante dintre ele -
Linice..

Introducere

Cum poți ghici după titlu, Linice. - acesta este un "port" neoficial al legendarului
Soare sub Linux., Salvați interfața, sistemul de comandă și majoritatea caracteristicilor din urmă: flăcări fierbinți (în Linice. aceasta este ); Instalarea punctelor de rupere hardware pentru toate funcțiile și apelurile de sistem; Vizualizați paginile fizice de memorie GDT / LDT / IDT; Caracteristicile împrumutate de la GDB (apeluri arbitrare apel, salvarea / restaurarea contextului registrelor, a variabilelor interne etc.).

Spre deosebire de majoritatea altor debugri care lucrează prin nerenți și ușor de detectat prin apărare, mecanismul PTRACE (Windows-Analog este debug_proces utilizat de depanarea aplicată), Linice. Utilizează o urmă nativă, la fel ca în softice, care permite ambelor debugri să depaneze programele protejate pe care alții nu le folosesc.

De fapt, acest lucru nu este un port (de aici și citate), ci un proiect independent scris de la zero și extinderea în textele sursă gratuite (de la softice există o singură inspirație). Partea principală a codului, destinată lui Kernel-ul 2.4, a fost scrisă de o fată germană Hacker Goran, dar complet diferite persoane au fost deja implicate în sprijinul Core 2.6: Daniel Reznick, Peter K. și Carlos Manuel Duclos Vergara. Și compatriot - Oleg Khudakov - rescris fișierele asamblor cu NASM "și pe
GCC.

Textele sursă se află pe site-ul oficial al proiectului -
Linice% 0a..com "\u003e www.linice.com, există o documentație, întrebări frecvente și o legătură cu forumul
Linice% 0a."\u003e grupes.google.com/group/llinice. Nu există ansambluri binare gata.
Creatorii proiectului și-au deschis propriul cont asupra Sourceforge, dar au fost stabilite pentru a stabili orice fișiere pe acesta, prezentând doar 3 screenshot pe recenzie "și calitate foarte scăzută:
.

Cerințe de sistem

Ultima versiune Linice. Păstrează numărul 2.6 și datează din 28 iunie 2005, susținând pe deplin kernelul de 2.4.x și modul VGA consola. Problemele grave sunt observate cu nuclee mai noi, iar kernelul 2.6.x este susținut numai în modul limitat.
Debuggerul a fost dezvoltat și testat sub Debian 2.6. Compatibilitatea acestuia cu restul distribuitorilor nu este garantată că ne obligă să recurgem la tamburine, dar, în unele cazuri, nu ajută și tamburină. Păstrați de fapt mașina dvs. Debian doar pentru a lucra cu Linice., - Este destul de normal. Cu mult timp în urmă, când implementarea SOFCECE pentru NT nu a existat încă, mulți hackeri au instalat câștigul 9x doar pentru a sparge programul, deși ei înșiși au stat sub
NT. Pentru că a acoperit toate subtilitățile instalației Linice. Într-un articol, practic nu este realist, voi limita descrierea procesului de compilare și lansare. Linice. Sub un kit de distribuție specific - KNOPPIX 3.7 cu un miez 2.4.1 în modul Consola VGA.
Linice. Suportă mașinile ACPIS și multiprocesor, dar este foarte prietenos cu X "MI, în special pe cardurile video, altele decât NVIDIA. Adâncime de culoare pe 24 de biți. Nu percepe," digestând "doar 8, 16 și 32 de biți, astfel încât depanarea lui X Aplicațiile sunt mai convenabile pentru a conduce printr-un terminal la distanță conectat prin portul COM de pe protocolul VT100. În acest caz, tastatura locală va funcționa și cu
Linice.!

Compilație și configurare linice

Descărcați arhiva GZIP a textelor sursă www. Linice..devic.us / Linice.-2.6.tar.gz, care ocupă un pic mai puțin decât megaocteții, despachetați pe disc, mergeți la director. / Docs și din fișierul Readme, aflați că ansamblul de depanare sub kernel 2.4 se efectuează astfel:

# CD construiește
# ./make_bin-2.4.
# CD ../bin.
# Face curat; Mak.e.

Cu toate acestea, înainte de a începe efectuarea, trebuie să deschideți fișierul. / BIN-2.4 / Makefile și să editați șirul țintă în conformitate cu configurația și arhitectura platformei țintă. În special, pe mașinile ACPI cu procesoare multi-core sau hiperthreading, va arăta astfel:

TARGET \u003d -DSMP -dio_Apic

După finalizarea compilării în director. / BIN Vor fi multe fișiere și directoare, dar semnificative ale acestora sunt:

linsym este modulul de boot de debugger;
Linince.dat - Fișier de configurare;
XICE - Suport X "OV, Când lucrați în modul text, îl puteți șterge;
./LINICE_2.4.27/LLINICE.O - Modulul de kernel încărcat conține direct depanatorul în sine.

proces de asamblare Linice.

Prin colectarea kitului minim de lucru, ar fi frumos să obțineți orice altceva - exemple de depanare demo situate în directorul. / Test și compilate de scriptul compilați, precum și modulul de expansiune (în opinia noastră, plugin) situată în director . / EXT colectat de comanda face și descărcabil de comanda insmod. Nici un beneficiu de la el, dar, după ce am studiat textul sursă, vom putea să-și scriem propriile module care extind funcționalitatea
Linice..

La pornirea Knoppix "și în linia de jos a ecranului, invitația" Boot: "apare în cazul în care trebuie să introduceți" Knoppix 2 VGA \u003d Normal ". Cod de cheat" Knoppix "Selectează kernelul 2.4 (încărcat automat în mod automat, deci Knoppix Poate fi redus), "2" blochează încărcarea X "OV și" VGA \u003d Normal "stabilește modul standard VGA cu o rezoluție de 80x25.

După așteptarea descărcării, spuneți "su", apoi "passwd" și introduceți o nouă parolă pentru rădăcină "A, sub care intră imediat în sistem, utilizând comanda de conectare. Dacă acest lucru nu este făcut, încercarea de început Linice. Se termină cu o defecțiune zdrobitoare cu "Defecțiunea segmentării" Scream.

Când descărcați Knoppix "și de pe un hard disk (la care puteți instala comanda" Sudo Knoppix-Installer ", marcat în fereastra Terminal din sesiunea LiveCD), va apărea un meniu Start cu o listă de nuclee disponibile. Selectați Linux (2.4) -1 și faceți clic pe Pentru a specifica parametrii de descărcare - "2 VGA \u003d Normal". Cuvântul "Knoppix" nu trebuie să scrie, deoarece kernelul este deja ales. După ce descărcarea este completă, oferim comanda de conectare și introduceți sistemul rădăcină "OHM (se presupune că contul a fost creat anterior).

Lansarea debuggerului este efectuată de comandă. / Linsym -i, după care apare imediat pe ecran. Dacă acest lucru nu se întâmplă, încercați să specificați cheia "--verbose 3" pentru a afișa mesaje de diagnosticare.
Unul dintre motivele eșecului de descărcare poate fi lipsa fișierului /boot/system.map care conține adresa funcțiilor nucleare. Descărcarea eșuează și dacă conținutul sistemului.map nu se potrivește cu nucleul curent, care poate apărea, de exemplu, în timpul recompilării sale. Unele compilatoare de distribuții sau nu includ sistemul.Map (crezând că va consolida securitatea sistemului, deoarece Rootkit "AM va fi mai dificil de interceptat de syscall") sau este plasat aici ceva complet stâng și de neînțeles unde este nevoie. În astfel de cazuri, este suficient doar să recompilați kernelul, specificând calea de debugger către fișierul sistem.map folosind cheia "-m", dacă nu este în / boot, și în altă parte. Astfel, siguranța nu suferă și Linice. Pot lucra!
Revenirea de la debugger la sistem are loc sau cu ajutorul "x " Combinaţie Provoacă un debugger din orice program. Cu toate acestea, nu este deloc faptul că suntem găsiți în contextul său, deoarece Linux este un sistem de multitasking, procesele de comutare unul câte unul și comenzile addr (contexte de comutare) în lexicon Linice. Totuși nu există și când apare - necunoscut. Prin urmare, este necesar să se îmbolnăvească, setarea punctelor de oprire pentru apelurile de sistem utilizate de un anumit program sau ruperea procesului prin metoda INT 03H, despre care vom vorbi acum.

Pentru descărcarea debuggerului (dacă într-adevăr dorește să descărcă), răspunde la cheia "-x", transmisă de același Linsym "Y.

Bazele de lucru S. Linice.

Pentru cei care au lucrat deja cu Softice, stăpânindu-se Linice. Nu va exista nici o problemă. Toate aceleași comenzi sunt folosite aici: D - memorie Dump, E - Editare de memorie, T - pas cu pas, P - Trasare fără a intra în funcție, R - Vizualizare / Modificare registre, BPM / BPX - Setarea punctului de oprire / Execuția memoriei și etc. O listă completă a comenzilor este inclusă în ajutorul încorporat, numit de ajutor (apropo, numele "Ajutor Name_Name" oferă informații suplimentare despre echipă) și în documentația personalului.

Să apăsați Și intrăm în lista de procese afișate pe ecran Comanda Proc, iar procesul curent este evidențiat în albastru:

: Proc.

1 0000 C1C3E000 Sleeping 0 0 Init
2 0000 F7EE8000 Sleeping 0 0 Keventd
3 0000 F7EE2000 SLEEPING 0 0 KSOFTIRQD_CPU0
4 0000 F7E0000 Sleeping 0 0 ksoftirqd_cpu1
5 0000 F7ED0000 Sleeping 0 0 KSWAPD
6 0000 F7EA000 Sleeping 0 0 BDFLUSH
7 0000 F7EA8000 Sleeping 0 0 Kupdated
56 0000 F6A36000 Sleeping 0 0 Kjournald
1006 0000 F7A34000 Rularea 0 0 Automaount
1013 0000 F68E6000 Sleeping 0 0 Cupsd
...
1105 0000 F6DDE000 Sleeping 0 0 MC
1106 0000 F6DDD4000 Sleeping 0 0 Conc.Saver

Procesele sunt, desigur, bune, dar cum încă depanăm programele? Cel mai simplu lucru este să conectați punctul de intrare al mașinii CCH, care corespunde instrucțiunilor INT 03, pre-scrierea conținutului octetului original. Acest lucru se poate face de către orice editor hexagonal, de exemplu, menționat în mod repetat de mine.
HTE.

Prin descărcarea fișierului la editor, faceți clic pe (MODE), alegeți Elf / Imagine, personalizați cursorul la entrypoint:, Davim (editați) și schimbați primul octet pe CCh, salvăm modificările la (Salvați) și ieșiți. Când începeți un program progresiv Linice. imediat apare, deranjat de excepția generată de CCH, după care EIP indică sfârșitul
CCh.

Condiția programului cu un punct de intrare prelungit în momentul depanatorului

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țiunile din EAX, DX (EDH), care este un fragment din comanda Xor EBP Patched, EBP (31H EDH). Acum (în teorie), trebuie să restabilim octetul original prin schimbarea CCH la 31h, reducerea registrului EIP pe unitate și continuați să urmăriți în modul normal.

Dar nu a fost aici! Linice. - Aceasta este, desigur, portul, dar numai foarte crud, și nu știe cum să modifice memoria imaginii paginii, chiar dacă deschideți mai întâi segmentul de cod pentru a înregistra. Nici E (editare), nici F (umplere), nici M (Copiere de memorie) nu funcționează! Dar funcționează pe stivă, iar noi, hackerii, este destul de suficient.

Îmi amintesc valoarea actuală a registrului EIP; Copiați mașina patch-urilor în partea superioară a stivei; Realizăm byte-ul acolo; Transmitem controlul la acesta prin schimbarea valorii EIP; Îl realizăm prin efectuarea unui singur act de urmărire; Și întoarceți-l pe EIP la locul, adică la următoarea mașină:

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

; Ne uităm la partea de sus a stivei (de la curiozitatea pură).
: D esp-10
0018: BFFFFC0 C0 82 04 08 00 00 00 00 5D 0C 00 40 DC EF FF BF

; Copiați comanda mașinii dovedite în partea de sus a stack-ului.
; Numărul 10h este dimensiunea maximă posibilă a comenzii mașinii pe X86.
: M EIP-1 \u200b\u200bL 10 ESP-10

; Ne uităm la modul în care stiva sa schimbat.
: D esp-10
0018: BFFFFC0 CC ED 5E 89 E1 83 E4 F0 50 54 52 68 F0 85 04 08

; Da! Stack-ul sa schimbat într-adevăr, este timpul să corectați CCH la 31h.
: E esp-10 31
Editați datele imediate care nu sunt implementate încă.

; Oops! Atribuirea directă a datelor în Linice nu este implementată,
; Dar putem edita dumpul în modul interactiv (de asemenea
; ca în softice) sau dați comanda F ESP-10 L 1 31, luați în considerare numai
; Ce, spre deosebire de Softice, debuggerul Linice nu actualizează fereastra de depozitare,
; Prin urmare, după executarea comenzii f se pare că
; nici un rezultat; De fapt, nu merită actualizat
; Echipa Dump D ESP-10, și totul va cădea în loc.

; Transmitem controlul la comanda copiată la stivă,
; Ne amintim valoarea registrului EIP.
: R EIP (ESP-10)
Reg: EIP \u003d BFFFEC0

; Face un singur acct de urmărire.
: T.
0023: BFFFFC2 5E POP ESI

; Așa cum vedem, registrul EIP a crescut cu 2 (bfffefc2h - bfffefc0h) \u003d 02h,
; În consecință, adresa următoarei comenzi este: 080482C1H - 01H + 02H \u003d 080482C2H,
; unde 080482C1H este valoarea inițială a EIP la intrarea în program, o 01h - dimensiunea INT 03H.

; Instalați EIP pe comanda după instrucțiunea progresivă.
: R EIP 80482C2
Reg: EIP \u003d 80482C2

Acestea sunt dansuri cu tamburina trebuie să aranjeze. Și ce să facă? Deci, cu încărcarea programelor în debugger, ne-am dat seama, acum suntem strânși de punctul de întrerupere a apelurilor de sistem și a funcțiilor nucleare.

Comanda EXP afișează numele exportate de miez, dintre care oricare dintre acestea pot apărea în expresii, de exemplu, "BPX DO_BKR" este echivalent cu "BPX C012C9E8".

Retragerea numelor exportate de nucleu

: Exp.
nucleu
C0320364 mmu_cr4_featuri.
C02AC3A4 ACPI_DISABLED.
C02AC8A0 i8253_lock.
...
C012BDA8 DO_MMAP_PGOFF.
C012C764 DO_MUNMAP.
C012C9E8 DO_BRK.
C011E990 EXIT_MM.
C011E69C EXIT_FILES.

Provocările sistemului au reprezentat mai dificile. Suport direct de la Linice. Nu există aici (dar se presupune că este, având în vedere specificul Linux), așa că trebuie să faceți acest lucru.

Tabelul de apel al sistemului este cunoscut ca o serie de cuvinte duble, începând cu adresa Sys_Call_table (această variabilă este exportată în kernel).

Tabelul de apel al sistemului

; Transferați debuggerul la modul de afișare a cuvintelor duble.
: DD.

; Luați tabelul de 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 al mesei se potrivește cu apelul său de sistem, iar fiecare apel are un număr propriu care poate fi găsit prin căutarea în fișierul / brelock/sys/syscall.h, dar este mai bine să o faceți sub Linux, unde nu există Numere directe, dar împrumutați că același fișier de la BSD este același număr de apeluri principale ale sistemului pe toate sistemele coincid. În particular, apelul de apel deschis trece la numărul 5.

Pentru a seta punctul de oprire pe Deschidere, trebuie să cunoașteți adresa sa localizată în cel de-al cincilea cuvânt dublu al tabelului de apel al sistemului, numărând de la zero și egal (în acest caz) C013D5C8H.

Setarea punctului de oprire pe apelul de sistem deschis

; Instalați punctul de oprire pe apelul de sistem deschis,
: BPX C013D5C8.
; ieși din debugger,
: X.
...
# Deschideți un fișier
...
; Debuggerul apare imediat, spunându-ne despre asta,
: Punctul de întrerupere din cauza BPX 01

; Lăsați comanda PRO să se asigure că am intrat în propriul dvs. proces.
: Prox.
PID TSS Task State UID GID Nume
1049 0000 F6364000 dormit 0 0 Getty
1145 0000 F61CC000 Sleeping 0 0 MC
1146 0000 F614A000 Sleeping 0 0 Conc.Savor

În acest fel, este ușor de încorporat în procesele deja în desfășurare, stabilind opinia de oprire a apelurilor de sistem utilizate de acestea, precum și pentru multe alte lucruri care sunt vitale pentru hacking.

Concluzie

În ciuda umidității lor sincere Linice. Este destul de potrivit pentru depanarea aplicațiilor protejate, deși complet și în apropiere trebuie să recurgă la soluții de bypass care sunt efectuate în depanarea normală a mașinii. prin urmare Linice. Nu înlocuiește GDB, ci doar o completează.