Nástroje na ladenie režimu jadra systému Windows. Ako funguje ladiaci program jadra operačného systému Životný cyklus vývoja zneužívania na úrovni jadra

Niekedy mám situáciu, že Windows čaká na bootovací čas ladiaceho programu jadra. Zobrazí sa text „Štart systému Windows“, ale nie logo.

Ak teraz pripojím debugger, spustí sa animácia loga Windows 7. Potom logo začne pulzovať. V tomto okamihu proces sťahovania už nepokračuje. Zaťaženie procesora je znížené na minimum. Obvykle počkám niekoľko minút, ale nič sa nestane.

Nie vždy sa to stane. Ak sa to však stane, resetovanie virtuálneho počítača nepomôže. Na vyriešenie tohto problému musím použiť Opravu pri spustení. Žiaľ, toto trvá večnosť.

Máte nejaké nápady, čo môžem urobiť okrem opravy spustenia?

Vopred ďakujem!

3

2 odpovede

Ak chcete vyriešiť problém, s ktorým sa stretávate, počas spustenia jednoducho stlačte kláves F10. A odstrániť / ladiť a súvisiace možnosti. Potom stlačte kláves Enter.

Návrh: Nepoužívajte možnosť / debug pre predvolenú možnosť ponuky zavádzania. Skopírujte konfiguráciu zavádzania do nového záznamu. Potom ho nastavte do režimu ladenia. Windows nevie, kedy budete debugger používať. Preto musí čakať.

chPF OELPFPTSCHE KHLBBOYS RP TBVPFE U PFMBDLPK SDTB U BCHBTYKOSCHNY DBNRBNY RBNSFY. lBL RTBCHYMP, CHBN OKHTSOP VKHDEF JBDBFSH PDOP YJ KHUFTKUFCH RPDLBULY, RETEYUUMEOOSHI CH JBKME / etc / fstab. uVTPU PVTBHPCH RBNSFY O KHUFTKUFCHB, OE SCHMSAEYEUS KHUFTPKUFCHBNY RPDLBULY, OBRTYNET, MEOFSCH, CH DBOOSCHK NPNEOF OE RPDDETSYCHBAFUS.

Poznámka: yURPMSHKHKFE LPNBODH knedľa (8) DMS KHLBBOYS SDTH NEUFB, ZDE OKHTSOP UPITBOSFSH BCHBTYKOSCHE DBNRSCH. RPUME OBUFTKLY RP LPNBODE swapon (8) TBDEMB RPDLBULY DPMTSOB VSCHFSH CHSCHBOB RTPZTBNNB dumpon. pvshchuop lfp CHCHRPMOSEFUS JBDBOYEN RETENEOOPK dumpdev CH ZHBKME rc.conf (5)... eUMY ЪBDBB FB RETENEOOBS, FP RPUME UVPS RTY RETCHPK NOPZPRPMSHCHBFEMSHULPK RETEGBZTHHLE VHDEF BCHFPNBFYUEEULY BRHEEBNRTPZT savecore (8)... POB UPITBOYF BCHBTYKOSCHK DBNR SDTB CH LBFBMPZ, ABDBOOCHK CH RETENEOOPK dumpdir ZhBKMB rc.conf. rP KhNPMYUBOYA LBFBMPZPN DMS BCHBTYKOSHI DBNRPC SCHMSEFUS / var / crash.

mYVP CHCH NPTSEFE vBDBFSH KHUFTKUFPCHP DMS UVTPUB PVTBBB RBNSFY SCHOP YUETE RBTBNEFT dump CH UVTPLE config LPOZHYZKHTBGYPOOPZP ZhBKMB CHBYEZP SDTB. fBLPK URPUPV YURPMShPChBFSh OE TELPNEODHEFUS Y RPMTSEO YURPMShPChBFShUS, FPMShLP EUMY CHCH IPFIFE RPMKHYUBFSH BCHBTYKOSCHE PVTBCHSCH RBNSPEYP

Poznámka: dBMEE FETNYO gdb POOBYUBEF PFMBDUYL gdb, ABRHEEOOSCHK CH „TEZYNE PFMBDLY SDTB“ “. RETEIPD CH FPF TETZYN DPUFIZBEFUS ЪBRKHULPN gdb U RBTBNEFTPN -k. h TETZYNE PFMBDLY SDTB gdb YUNEOSEF UCHPЈ RTYZMBYEOYE O (kgdb).

Tip: eUME CHCH YURPMSHYHEFE FreeBSD CHETUYY 3 YMY WPME TBOOAA, CHS DPMCOSCH CHCHRPMOYFSH HUEEEOYE PFMBDPYUOPZP SDTB LPNBODPK pás, B OE HUFBOBUFSHMPEYCHMYE

# cp kernel kernel.debug # strip -g jadro

FPF YBZ OE FBL HTS Y OEPVIPDYN, OP TELPNEODKHEN. (PE FreeBSD 4J VPMEE RPDOYI TEMYBI FPF YBZ CHSCHRPMOSEFUS BCHFPNBFYYUEULY H LPOGE RTPGEUUB RPUFTPEOYS SDTB make.) LPZDB RAS HUEYUEOP, BCHFPNBFYYUEULY YMY pery RPNPEY LPNBOD CHSCHYE, BL NPTSEFE HUFBOPCHYFSH EZP PVSCHYUOSCHN PVTBPN, OBVTBCH make nainštalovať.

ъBNEFSHFE, UFP CH UFBTSCHI CHETUISI FreeBSD (DP 3.1, OE CHLMAUBS LFPF TEMYЪ), YURPMSHHEFUS SDTB Ch ZHPTNBFE a.out, RPFPNKH YI FBVMYGSCHUBSPUNSPUMP na VPMSHYPK FBVMYGEK UYNCHPMPCH CH OE HUEOOOPN PFMBDPYUOPN SDTE LFP YMYYOSS FTBFB. rPUMEDOYE TEMYUSCH FreeBSD YURPMSHHHAF SDTB CH ZHPTNBFE ELF, ZDE LFP OE SCHMSEFUS RTPVMENPK.

eUMY BL FEUFYTHEFE OPCHPE RAS, ULBTSEN, OBVYTBS YNS OPCHPZP SDTB RTYZMBYEOYY BZTHYUYLB W, OP CHBN OHTSOP BZTHTSBFSH J TBVPFBFSH majú DTHZYN SDTPN, YUFPVSCH UOPCHB CHETOHFSHUS A OPTNBMSHOPNH ZHHOLGYPOYTPCHBOYA, BZTHTSBKFE EZP FPMSHLP B PDOPRPMSHPCHBFEMSHULPN TETSYNE pery RPNPEY ZHMBZB -S HLBSCHCHBENPZP pery BZTHLE, B ABFEN CHCHRPMOIFE FBLYE YBZY:

# fsck -p # mount -a -t ufs # aby bol váš súborový systém pre / var / crash zapisovateľný # savecore -N /kernel.panicked / var / crash # exit # ... pre viacerých používateľov

ьФБ RPUMEDPCHBFEMSHOPUFSH HLBSCHCHBEF RTPZTBNNE savecore (8) O YURPMSHPCHBOYE DTHZPZP SDTB DMS YCHMEUEOYS UYNCHPMYUEEULYI YNEO. yOBYUE POB VKHDEF YURPMSHSPCHBFSH SDTP, TBVPFBAEE CH DBOOSCHK NPNEOF Y, ULPTEE CHUEZP, OYUEZP OE UDEMBEF, RPFPNKH UFP BCHBTYKOSCHKFVTBYUBYUBT

b FERETSH, RPUME UVTPUB BCHBTYKOPZP DBNRB, RETEKDIFE CH LBFBMPZ / sys / compile / WHATEVER J ABKHUFE LPNBODH gdb -k. yb RTPZTBNNSCH gdb UDEMBKFE PPF UFP:

Súbor symbolov kernel.debug exec-file /var/crash/kernel.0 jadrový súbor /var/crash/vmcore.0 J CHHBMS-CHCH NPTSEFE PFMBTSYCHBFSH BCHBTYKOSCHK DBNR, YURPMSHJKHS YUIPDOSCH LEFUFSCH SDTB FPPUTPK

chPF TSKHTOBM LPNBOD UEBUB TBVPFSch gdb, YMMAUFTYTKHAEYK LFKH RTPGEDKHTH. DMYOOSCHE UFTPLY VSCHMY TBPTCHBOSCH DMS HMHYUEOYS YUIFBVEMSHOPUFY Y DMS HDPVUFCHB UFTPLY VSCHMY RTPOHNETPCHBOSCH. CHUE POOFBMSHOPE SCHMSEFUS FTBUYTPCHLPK PYIVLY, TEBMSHOP CHUOYLOHCHYEK PE CHTENS TBVPFS OBD DTBKCHETPN LPOUPMY pcvt.

1: Skript sa spustil 30. decembra 23:15:22 1994 2: # cd / sys / compile / URIAH 3: # gdb -k kernel /var/crash/vmcore.1 4: Čítanie údajov symbolu z / usr / src / sys / compile / URIAH / jadro ... hotovo. 5: IdlePTD 1f3000 6: panika: pretože ste to povedali! 7: aktuálna doska na 1e3f70 8: Čítanie v symboloch pre ../../i386/i386/machdep.c..dokončené. 9: (kgdb) kde 10: # 0 boot (arghowto = 256) (../../i386/i386/machdep.c riadok 767) 11: # 1 0xf0115159 v panike () 12: # 2 0xf01955bd v dieiedie ( ) (../../i386/i386/machdep.c riadok 698) 13: # 3 0xf010185e v db_fncall () 14: # 4 0xf0101586 v db_command (-266509132, -266509516, -267381073) 15: # 5 0xf0101711 v db_command_loop () 16: # 6 0xf01040a0 v db_trap () 17: # 7 0xf0192976 v kdb_trap (12, 0, -272630436, -266743723) 18: # 8 0xf019d2eb v trap_fatal (...) 19: # 9p60 0xf0 ... ) 20: # 10 0xf019cb2f in trap (...) 21: # 11 0xf01932a1 in exception: calltrap () 22: # 12 0xf0191503 in cnopen (...) 23: # 13 0xf0132c34 in spec_open () 24: # 14 0xf012d014 v vn_open () 25: # 15 0xf012a183 v otvorenom () 26: # 16 0xf019d4eb v syscall (...) 27: (kgdb) hore 10 28: Čítanie v symboloch pre ../../i386/i386/trap. c ... hotovo. 29: # 10 0xf019cb2f v pasci (rám = (tf_es = -260440048, tf_ds = 16, tf_ \ 30: edi = 3072, tf_esi = -266445372, tf_ebp = -272630356, tf_isp = -27 \ 31: 2630396, tf_ebx6 2664 tf_edx = 12, tf_ecx = -266427884, tf \ 32: _eax = 64772224, tf_trapno = 12, tf_err = -272695296, tf_eip = -26 \ 33: 6672343, tf_cs = -266469 30fags, tf_e66 tf_ \ 34: )) (../../i386/i386/trap.c riadok 283) 35: 283 (neplatné) trap_pfault (& rám, NEPRAVDA); 36: (kgdb) rámový rámec-> tf_ebp rámec-> tf_eip 37: Čítanie v symboloch pre ../../i386/isa/pcvt/pcvt_drv.c..done. 38: # 0 0xf01ae729 in pcopen (dev = 3072, flag = 3, mode = 8192, p = (struct p \ 39: roc *) 0xf07c0c00) (../../i386/isa/pcvt/pcvt_drv.c line 403) 40: 403 návrat ((* linesw.l_open) (dev, tp)); 41: (kgdb) zoznam 42: 398 43: 399 tp-> t_state | = TS_CARR_ON; 44: 400 tp-> t_cflag | = CLOCAL; / * nemôže byť modem (:-) * / 45: 401 46: 402 #if PCVT_NETBSD || (PCVT_FREEBSD> = 200) 47: 403 návrat ((* linesw.l_open) (dev, tp)); 48: 404 #else 49: 405 návrat ((* linesw.l_open) (dev, tp, flag)); 50: 406 #endif / * PCVT_NETBSD || (PCVT_FREEBSD> = 200) */51: 407) 52: (kgdb) tlač tp 53: Čítanie v symboloch pre ../../i386/i386/cons.c..vybavené. 54: $ 1 = (struct tty *) 0x1bae 55: (kgdb) print tp-> t_line 56: $ 2 = 1767990816 57: (kgdb) up 58: # 1 0xf0191503 in cnopen (dev = 0x00000000, flag = 3, mode = 8192, p = (st \ 59: ruct proc *) 0xf07c0c00) (../../i386/i386/cons.c riadok 126) 60: return (( * cdevsw.d_open) (dev, flag, mode, p)); 61: (kgdb) up 62: # 2 0xf0132c34 in spec_open () 63: (kgdb) up 64: # 3 0xf012d014 in vn_open () 65: (kgdb) up 66: # 4 0xf012a183 in open () 67: (kgdb) hore 68: # 5 0xf019d4eb v syscall (rámec = (tf_es = 39, tf_ds = 39, tf_edi = \ 69: 2158592, tf_esi = 0, tf_ebp = -272638436, tf_isp = -272629788, tf \ 70: _f_fed = 7086, = 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 riadok 673) 73: 673 chyba = (* callp-> sy_call) (p, args, rval); 74: (kgdb) až 75: Zvolený počiatočný rámec; nemôžeš ísť hore. 76: (kgdb) ukončiť 77: # výjazd 78: výjazd 79: 80: Skript bol vyhotovený v piatok 30. decembra 23:18:04 1994

LPNNEOFBTYY L CHCHYERTYCHDEOOOPNKH TSKHTOBMH:

UVTPLB 6:

ьFP DBNR, CHSFSCHK RTY RPNPEY DDB (UNPFTY OYTSE), RPFPNKH LPNNEOFBTIK L BCHBTYKOPNKH POOFBOPCHH YNEEF YNEOOP CHYD „pretože ste povedali!“ PDOBLP YOBYUBMSHOPK RTYYUYOPK RTEIPDB CH DDB VSCHMB BCHBTYKOBS PUFBOPCHLB RTY CHOOYLOPCHEOYA PYIVLY UVTBOYGSCH RBNSFY.

UVTPLB 20:

ьFP NEUFFPOBIPTSDEOYE ZhHOLGYY pasca () CH FTBUYTPCHLE UFELB.

UVTPLB 36:

rTYOHDYFEMSHOPE YURPMSHSPCHBOYE OPCHPK ZTBOYGSCH UFELB; FERETSH LFP OE OKHTSOP. rTEDRPMBZBEFUS, UFP ZTBOYGSCH UFELB KHLBSCHCHBAF O RTBCHYMSHOP TBURPMPTSEOYE, DBTS CH UMKHYUBE BCHBTYKOPZP PUFBOPCHB. zMSDS O UFTPLKH YUIPDOPZP LPDB 403, NPTSOP ULBBFSH, UFP CHEUSHNB CHETPSFOP, UFP MYVP CHYOPCHBF DPUFHR RP KhLBBBFEMA `tp"

UFTPLB 52:

rPIPTSE, UFP CHYOPCHBF KhLBBFEMSH, OP PO SCHMSEFUS DPRKHUFINSHN BDTEUPN.

UVTPLB 56:

pDOBLP, PYUECHIDOP, UFP PO KHLBSCHCHBEF O NHUPT, FBL UFP NSCH OBYKH PYIVLH! (dMS FEI, LFP OE OBLPN U ЬFPK YUBUFSHA LPDB: tp-> t_line UMKHTSIF DMS ITBOEOYS TECYNB LBOBMB LPOUPMSHOPZP HUFTPKUFFCHB, J FP DPMESHYUPSHUP VHP NSPP.

Ladiaci program je druhá vec po kompilátore na vytváranie programov. Mnohí z tých, ktorí píšu počítačové programy a používajú debugger, si však nie sú vedomí zásad a mechanizmov jeho práce.


Je ťažké byť debugger ...

Vzhľadom na skutočnosť, že programátori používajú debugger vo dne v noci, najmä keď vstúpia do režimu hlbokého ladenia, stojí za to povedať, že keby debugger nebol program, ale kus hardvéru, pravdepodobne by sa prehrial a zlomil. Pretože ani kompilátor nemá toľko práce, ako dostane ladiaci program.

Samozrejme, pretože teraz existuje mnoho rôznych programovacích jazykov, potom debuggery pre každý z nich sú odlišné. A samozrejme, pre rôzne kategórie týchto jazykov existujú rozdiely v práci debuggerov: napríklad debugger pre interpretované programy Ruby bude fungovať inak ako pre Java kompilovanú do bytecode a debugger pre Java naopak, bude mať rozdiely od ladiaceho programu Visual C ++.

Budem hovoriť o ladení pre platformu Windows. Po pochopení princípov debuggerov pre to bude možné porozumieť debuggerom pre systémy POSIX aj debuggerom, ktoré nefungujú na úrovni. operačný systém, ale na úrovni virtuálneho stroja alebo nejakého druhu tlmočníka.


Debuggery pre Windows: dva druhy

Existujú dva zásadne odlišné druhy debuggerov pre Windows. Myslím si, že každý bol prvý, s kým sa stretol, keď programoval v Delphi (neprogramoval v ňom? Je ťažké tomu uveriť. Čo ste programovali v škole a v juniorskom veku?). Jedná sa o vlastné ladiace programy aplikácií. Existuje veľa z nich a existujú oddelene a (obzvlášť, mimochodom, často) ako súčasť integrovaného prostredia na vývoj aplikácií. Medzi ladiacimi programami distribuovanými ako samostatné softvérové ​​produkty sa tradične rozlišuje OllyDbg a kedysi som o tom písal v „Computer News“.

Druhým typom ladiaceho programu je ladiaci program jadra operačného systému. Nachádzajú sa a používajú sa menej často a výrazne sa líšia svojim dizajnom od debuggerov pre vlastné aplikácie. Najslávnejším a zároveň najlepším z debuggerov jadra je SoftIce. Možno ste o tom nielen počuli, ale dokonca ste to použili.

Keďže práca každého z týchto dvoch typov debuggerov má svoje vlastné špecifiká, o každom z nich vám poviem viac.


Vlastný debugger aplikácií

Ladiaci program vlastných aplikácií je jednoduchší, pretože najšpinavšiu a najšpinavšiu prácu vykonáva operačný systém. Windows má špeciálne programovacie rozhrania na ladenie aplikácií na úrovni používateľov - nazývajú sa Windows Debugging API. Sú to ladiace API, ktoré používajú všetky debuggery zabudované do obľúbených IDE systému Windows.

Na spustenie ladenia musí ladiaci program spustiť proces ladenia špeciálnym spôsobom, aby systém vedel, že tento proces bude ladiť. Potom sa začne ladiaci cyklus: program sa spustí, kým nenastane určitá udalosť, ktorá sa nazýva udalosť ladenia alebo udalosť ladenia. Spustí sa ladiaca slučka v samostatnom vlákne, aby sa ladiaci program nezavesil.

Ale to je len začiatok. Pretože to najzaujímavejšie v práci debuggera začína už vtedy, keď nastala udalosť ladenia. Koniec koncov, v skutočnosti, aká je práca ladiaceho programu? Pomáha programátorovi lokalizovať chybu až po konkrétnu funkciu, konkrétnu operáciu alebo konkrétnu premennú. Debugger pri tejto neľahkej úlohe môže pomôcť aj operačný systém.

Došlo teda k udalosti ladenia a potom musíme nejako zistiť, ako to súvisí s textom programu. To je možné iba vtedy, ak samotný program obsahuje špeciálne informácie o ladení - tabuľku symbolov ladenia. Obsahuje informácie o korešpondencii medzi adresami a názvami funkcií, typmi údajov, číslami riadkov kódu. Vďaka nim je možné ladenie, ktoré pozná každý programátor systému Windows. Tabuľky symbolov majú rôzne formáty, a preto nie je vždy možné ladiť program zostavený kompilátorom jedného dodávateľa pomocou debuggera od iného dodávateľa. Najbežnejší formát je však stále možné špecifikovať - ​​jedná sa o PDB (programová databáza) a bol vyvinutý, samozrejme, spoločnosťou Microsoft.

Ak je teda tabuľka symbolov ladenia vo formáte PDB, potom môžete použiť špeciálny nástroj od spoločnosti Microsoft - symbolický ladiaci procesor. Býval súčasťou systémového jadra a volal sa Imagehlp.dll, ale už bol dávno oddelený do samostatnej knižnice. Znakový procesor vám umožňuje nájsť najbližšiu otvorenú funkciu alebo globálnu premennú na danej adrese, ako aj číslo riadku a názov zdrojového súboru, v ktorom sa tento riadok nachádza. Podporované sú aj inverzné operácie, napríklad nájdenie adresy funkcie podľa jej názvu.

To samozrejme nie je všetka práca, ktorú robí vlastný nástroj na ladenie aplikácií. Napríklad pri ladení viacvláknových aplikácií existuje mnoho veľmi jemných problémov spojených s interakciou vlákien. Aj keď ladenie relatívne jednoduchých vecí, ako sú služby, existujú nuansy.

Teraz sa však nebudeme zaoberať nuansami - na konci článku vám poviem, kde si o nich môžete prečítať. Teraz sa pozrime na ladiče jadra.


Ladiaci program jadra

Ladiče jadra sú oveľa komplexnejšie programy ako vlastné ladiče aplikácií a hádam je pochopiteľné, prečo: nemajú pomocníka pre operačný systém. V tomto prípade je ich klientkou, pretože práve ona ich musí v konečnom dôsledku odladiť.

Väčšina debuggerov jadra vyžaduje na spustenie dva počítače prepojené nulovým modemovým káblom. Nulový modem je spôsob, ako prepojiť dva počítače priamo káblom prostredníctvom ich portov COM alebo LTP. Druhý počítač je potrebný, pretože časť ladiaceho programu, ktorá sedí na prvom (na tom, kde je nainštalovaný ladený systém), má obmedzený prístup na hardvér, a preto všetok dátový výstup prechádza nulovým modemom do druhého počítača.

V moderných procesoroch architektúry Intel x86 existujú špeciálne ladiace registre (v starom 368 aj v novších modeloch procesorov je ich iba osem, označujú sa ako DR0-DR7). Tieto registre umožňujú ladiacemu programu nastaviť kontrolné body na čítanie a zápis do pamäte, ako aj na I / O porty. Vo všeobecnosti všetko vyzerá presne takto a nemyslím si, že by stálo za to teraz podrobne popísať, za čo sú zodpovedné jednotlivé registre ladenia, aké prerušenia sa používajú na implementáciu bodov prerušenia a poskytnutie ďalších podobných informácií. Radšej by som hovoril o konkrétnych existujúcich ladičoch jadra pre Windows.

V prvom rade je to debugger zabudovaný do samotného jadra operačného systému. Je k dispozícii vo všetkých operačných systémoch NT od systému Windows 2000. Je súčasťou súboru NTOSKRNL.EXE a je možné ho povoliť nastavením možnosti „/ Debug“ pre operačný systém v systéme BOOT.INI. Tento debugger potrebuje nulové modemové pripojenie a druhý počítač s rovnakým OS.

Existuje ďalší ladiaci program jadra od spoločnosti Microsoft - WinDBG. Presne povedané, nejedná sa o ladiaci program jadra, ale o hybridný debugger, ktorý je možné použiť aj na ladenie aplikácií na úrovni používateľov. Na rozdiel od debuggeru zabudovaného do jadra má grafický shell, a preto sa jednoduchšie používa. Tento debugger podporuje aj špeciálne rozšírenia, ktoré sa môžu hodiť pri niektorých úlohách ladenia. Na ladenie jadra však vyžadujú aj dva počítače.

Existuje však ladiaci program jadra, ktorý je možné ladiť na jednom počítači. Toto je SoftIce. SoftIce môže súčasne ladiť aj aplikačné programy. Použitie tohto ladiaceho programu pre užívateľské programy je odôvodnené napríklad v prípade ladenia systémov v reálnom čase viazaných na systémový časovač. Ak ladíte bežným ladiacim programom, výsledok môže byť nesprávny, aj keď program beží správne, a SoftIce zastaví program aj časovač. Je to užitočné pri ladení aplikácií s viacerými vláknami. SoftIce má navyše veľmi, veľmi dobre vyvinutý spôsob zobrazovania informácií o všetkých vláknach v systéme, o synchronizácii vlákien pre viacvláknové aplikácie, informácií o úchytke „ah ... Jedinou nevýhodou tohto debuggera je jeho komplexnosť pre programátora aplikácií. Ale z debuggerov jadra je to najjednoduchšie a najefektívnejšie.


Pre tých najzaujímavejších

Teraz, samozrejme, rozprávanie o debuggeroch pre aplikácie Windows nie je také relevantné, ako pred desiatimi rokmi. O internet sa začal zaujímať celý svet a hlavnými užívateľmi SoftIce boli krekry, neúnavní pracovníci v oblasti pirátstva. Nie je to však také zlé. Komunikácia so SoftIce nepochybne rozvíja človeka z hľadiska znalostí o počítači, aj keď, samozrejme, ak komunikujete iba s debuggermi a nekomunikujete so skutočnými ľuďmi, sú možné niektoré vedľajšie účinky. Myslím si, že o tom už každý vie.

Ladiace programy sú jedným z najvýraznejších typov softvéru, ale pokiaľ ide o vývoj, dokonca aj ladiace nástroje na úrovni používateľov sú dosť zložité. Ale napriek tomu, ak máte chuť a čas vyvinúť vlastný debugger, vaše znalosti operačných systémov a programovania sa výrazne zvýšia, čo znamená, že sa zvýši aj šanca na dobre platenú prácu.

Ak si teda chcete vytvoriť vlastný debugger, mali by ste si najskôr prečítať materiály na túto tému. Podľa mňa je najlepšie začať knihou Johna Robbinsa Ladenie aplikácií Windows. Je už starý, publikovaný v roku 2001, ale informácie v ňom obsiahnuté sú stále aktuálne aj teraz, pretože majú všeobecný, dokonca až zásadný charakter. Táto kniha obsahuje príklady písania debuggerov pre Windows a je tiež užitočná, ak ste programátorom v jazyku C ++ a chcete lepšie porozumieť spracovaniu výnimiek. V skutočnosti som z tejto knihy získal informácie o debuggeroch uvedených v článku. Ak nemôžete nájsť túto knihu (koniec koncov, je už dosť stará), existuje niekoľko adries, ktoré vám môžu byť užitočné. Prvý z nich je takýto: www.xakep.ru/post/19158/default.asp. Tento článok z časopisu „Hacker“ hovorí o ladičoch jadra trochu viac ako ja a navyše obsahuje kód jednoduchého ladiaceho programu. A na kalashnikoff.ru/Assembler/issues/016.htm sa môžete naučiť písať debugger pre DOS. Ale samozrejme, je najlepšie prečítať si MSDN a nájsť na ceste debugger s otvoreným zdrojovým kódom, aby ste na to prišli. A samozrejme, ak sa pustíte do písania ladiaceho programu, úspech v tejto náročnej úlohe!

Termín „ladenie jadra“ sa týka skúmania vnútornej dátovej štruktúry jadra a / alebo podrobného sledovania funkcií v jadre. Toto ladenie je veľmi užitočný spôsob skúmanie interného zariadenia systému Windows, pretože vám umožňuje získať zobrazenie interného zariadenia systémové informácie ktorý nie je dostupný inými prostriedkami a poskytuje jasný pohľad na priebeh vykonávania kódu v jadre.

Pred zvažovaním rôzne cesty ladenie jadra, preskúmajme množinu súborov, ktoré budú potrebné na vykonanie akéhokoľvek druhu takéhoto ladenia.

Symboly ladenia jadra

Symbolové súbory obsahujú názvy funkcií a premenných a schému a formát dátových štruktúr. Sú generované programom linker a debuggery ich používajú na odkazovanie na tieto názvy a na ich zobrazenie počas relácie ladenia. Tieto informácie zvyčajne nie sú uložené v binárnom formáte, pretože nie sú potrebné pri spustení kódu. To znamená, že bez neho sa binárny kód zmenší a zrýchli. To však tiež znamená, že pri ladení musíte debuggeru poskytnúť prístup k súborom symbolov priradeným k binárnym súborom, na ktoré sa počas relácie ladenia odkazuje.

Použiť akýkoľvek nástroj na ladenie v režime jadra na vyšetrenie vnútorných štruktúr dátovej štruktúry Jadro Windows(zoznam procesov, bloky vlákien, zoznam načítaných ovládačov, informácie o využití pamäte atď.) potrebujete správne súbory symbolov a aspoň súbor symbolov pre binárny obraz jadra, Ntoskrnl.exe. Súbory tabuliek symbolov sa musia zhodovať s verziou binárneho obrázku, z ktorého boli extrahované. Ak je napríklad nastavený Balík Windows Service Pack alebo opravu jadra, budete musieť získať príslušne aktualizované súbory symbolov.

Sťahovanie a inštalácia symbolov pre rôzne verzie systému Windows nie je ťažké, ale nie je vždy možné aktualizovať symboly pre opravy. Najľahší spôsob, ako sa dostať požadovanú verziu symboly na ladenie prístupom na vyhradený server Microsoft Symbol Server pomocou špeciálnej syntaxe pre cestu symbolov uvedenú v ladiacom programe. Nasledujúca cesta symbolov napríklad núti ladiaci program stiahnuť symboly z internetového servera symbolov a uložiť lokálnu kópiu do priečinka c: \ symboly: srv * c: \ symboly * http: //msdl.microsoft.com/download /symboly

Podrobné pokyny na používanie servera so symbolmi nájdete v súbore pomoci Debugging Tools Tools alebo na internete na adrese http://msdn.microsoft.com/en-us/windows/hardware/gg462988.aspx.

Ladiace programy v režime jadra ležia medzi CPU a operačným systémom. To znamená, že keď zastavíte ladiaci program v režime jadra, úplne sa zastaví aj operačný systém. Nie je ťažké si uvedomiť, že náhle zastavenie operačného systému je užitočné, keď pracujete s problémami s časovačom a načasovaním. Avšak s výnimkou jedného ladiaceho programu, ktorý bude popísaný nižšie (v časti SoftlCE Debugger tejto kapitoly), nemôžete ladiť kód používateľského režimu pomocou ladiacich programov v režime jadra.

Debuggerov v režime jadra nie je veľa. Niektoré z nich sú: Windows 80386 Debugger (WDEB386), Kernel Debugger (1386KD), WinDBG a SoftlCE. Každý z týchto debuggerov je stručne popísaný v nasledujúcich častiach.

Ladiaci program WDEB386

WDEB386 je debugger režimu jadra systému Windows 98, ktorý je distribuovaný ako súčasť platformy SDK. Tento debugger je užitočný iba pre vývojárov, ktorí píšu virtuálne ovládače. Zariadenia so systémom Windows 98 (VxD). Rovnako ako väčšina debuggerov v režime jadra pre operačné systémy Windows, ladiaci program WDEB386 vyžaduje na spustenie dva počítače a nulový modemový kábel. Sú potrebné dva počítače, pretože časť ladiaceho programu, ktorá beží na cieľovom počítači, má obmedzený prístup k svojmu hardvéru, takže odosiela svoj výstup a prijíma príkazy z druhého počítača.

Ladiaci program WDEB386 má zaujímavý príbeh... Začalo to ako interný nástroj na pozadí spoločnosti Microsoft v ére Windows 3.0. Bolo ťažké ho používať a chýbala dostatočná podpora na ladenie. zdrojový kód a ďalšie pekné funkcie, ktorými nás pokazili ladiace programy Visual C ++ a Visual Basic.

Bodové príkazy sú najdôležitejšou vlastnosťou WDEB386. Prerušenie INT 41 je možné použiť na rozšírenie WDEB386 o pridávanie príkazov. Táto rozšíriteľnosť umožňuje autorom ovládačov VxD vytvárať vlastné ladiace príkazy, ktoré im poskytujú voľný prístup k informáciám vo ich virtuálnych zariadeniach. Ladiť Verzia Windows 98 podporuje mnoho príkazov DOT, ktoré vám umožňujú sledovať presný stav operačného systému v ktoromkoľvek bode procesu ladenia.

Ladiaci program I386KD

Windows 2000 sa líši od systému Windows 98 v tom, že skutočná časť ladiaceho programu v režime jadra je súčasťou systému NTOSKRNL. EXE - hlavný operačný súbor jadra Systémy Windows 2000. Tento debugger je k dispozícii v konfiguráciách operačného systému ako bezplatná (verzia), tak aj overená (ladiaca). Ak chcete povoliť ladenie v režime jadra, nastavte parameter / DEBUG bootloader na BOOT. INI a voliteľne možnosť / DEBUGPORT bootloader, ak chcete nastaviť inú ako predvolenú hodnotu komunikačného portu ladiaceho programu v režime jadra (COM1). I386KD beží na vlastnom počítači a komunikuje s ním Stroj Windows 2000 cez nulový modemový kábel.

Debugger režimu jadra NTOSKRNL. EXE robí iba dosť na ovládanie CPU, aby bolo možné ladiť operačný systém. Väčšina ladiacich prác - spracovanie symbolov, rozšírené zarážky a demontáž - sa vykonáva na strane 1386KD. Súprava ovládačov zariadenia Windows NT 4 (DDK) naraz dokumentovala protokol používaný v kábloch nulového modemu. Microsoft to však už nezdokumentuje.

Sila 1386KD je evidentná, keď sa pozriete na všetky príkazy, ktoré ponúka na prístup k internému Stav systému Windows 2000. Vedieť, ako fungujú ovládače zariadení v systéme Windows 2000, pomôže programátorovi sledovať výstup mnohých príkazov. Napriek všetkému, i386KD sa takmer vôbec nepoužíva, pretože je to konzolová aplikácia, ktorú je veľmi únavné používať na ladenie na úrovni zdroja.