„Windows 7“ branduolio derinimo režimo vykdymo laikas. Kaip veikia derinimo priemonė

  • Autoriai:

    Barinovas S.S., Ševčenka O.G.

  • Metai:
  • Šaltinis:

    Informatika ir kompiuterinės technologijos / VI tarptautinės studentų, magistrantų ir jaunųjų mokslininkų mokslinės techninės konferencijos medžiaga - 2010 m. lapkričio 23-25 ​​d., Doneckas, DonNTU. - 2010. - 448 p.

anotacija

Pateikiama lyginamoji derinimo vartotojo režimo ir branduolio režimo analizė Microsoft Windows operacinės sistemos atžvilgiu, išryškinami pastarosios derinimo organizavimo skirtumai ir problemos. Remiantis gautais rezultatais, suformuluoti pagrindiniai reikalavimai branduolio režimo derintuvų kūrimui avarinio ir interaktyvaus derinimo atveju. Atlikta esamų sprendimų atitikties reikalavimams analizė. Ypatingas dėmesys skiriamas Microsoft Windows Debugger.

Pagrindinė dalis

Derinimas – tai programinės įrangos klaidų priežasčių nustatymo ir pašalinimo procesas. Kai kuriuose projektuose derinimas trunka iki 50 % viso kūrimo laiko. Derinimas gali būti labai supaprastintas naudojant specializuotus įrankius, kurie nuolat tobulinami. Pagrindinis toks įrankis yra derintuvas, leidžiantis kontroliuoti programinės įrangos vykdymą, stebėti jos eigą ir trukdyti. Branduolio derinimo įrankius pirmiausia naudoja tvarkyklių kūrėjai.

Programinės įrangos kūrimo įrankiai programuotojui siūlo daugybę galimybių. Bet kuri integruota kūrimo aplinka apima galimybę derinti nenaudojant trečiųjų šalių paslaugų. Jei kalbame apie sistemos programinę įrangą ir ypač tvarkyklių kūrimą, tai dėl jos specifikos kūrimo procesas yra itin sunkus ir mažai automatizuotas. Visi kūrimo etapai, įskaitant derinimą, yra atskiri. Kiekvienam iš jų atlikti reikalingos specialios sąlygos: pilnavertėje kompiuterinėje sistemoje rašomas programos kodas, derinimo sistemoje – derinimas, testavimas, priklausomai nuo aplinkybių ir kt. Pats branduolio režimo derintuvas yra sunkiau išmokstamas ir atitinkamai mažiau draugiškas.

Apskritai galime kalbėti apie branduolio derinimo įrankių trūkumą. Nors tokių priemonių yra, apie alternatyvas dažnai nekalbama. Pavyzdžiui, „Microsoft Windows Debugger“ turi labai aukštą įėjimo slenkstį. Daugelis programuotojų kalba apie pirmąją neigiamą patirtį, kai ją sutinka, ir dauguma jos galimybių lieka nepanaudotos.

Atsižvelgiant į virtualiosios adresų erdvės struktūrą, jei programa padaro klaidą, dėl kurios programa įrašo duomenis į savavališką atminties vietą, programa tik sugadins savo atmintį ir neturės įtakos kitų programų veikimui bei operacinei sistemai. . Nors branduolio režimo programos kodas gali pažeisti svarbias operacinės sistemos duomenų struktūras, o tai neišvengiamai sukels bendrą gedimą. Neefektyviai parašyta tvarkyklė taip pat gali sukelti rimtą visos operacinės sistemos pablogėjimą.

    Šiuolaikiniai derintuvai atlieka šias pagrindines funkcijas:
  • derinimas šaltinio kodo lygiu;
  • vykdymo valdymas;
  • peržiūrėti ir keisti atmintį;
  • procesorių registrų turinio peržiūra ir keitimas;
  • skambučių krūvos peržiūra.

Kad būtų lengviau dirbti su išardytu kodu, vadinamasis. derinimo simboliai. Veikiant linkeriui, be vykdomojo failo vaizdo gali būti sukurtas ir duomenų failas, kuriame yra informacija, kuri nėra būtina vykdant programą, tačiau yra itin naudinga ją derinant: funkcijų pavadinimai, globalūs kintamieji, aprašymai. konstrukcijų. Derinimo simboliai galimi visoms „Windows“ operacinės sistemos vykdomosioms programoms.

Vykdymo kontrolė reiškia galimybę nutraukti ir atnaujinti programos kodo vykdymą pasiekus nurodytą komandą programos kode. Jei programos kodas vykdomas žingsnis po žingsnio režimu, pertraukimas įvyksta kiekvienam programavimo kalbos žetonui arba išeinant iš paprogramės. Laisvo vykdymo metu vykdymo pertraukimai atsiranda iš anksto nustatytose kodo dalyse - vietose, kur nustatomi lūžio taškai.

Pertraukiant branduolio režimo kodą, iškyla tokia dilema. Derinimo priemonė sąveikauja su programuotoju naudoja vartotojo sąsają. Tie. bent jau matoma derinimo priemonės dalis veikia vartotojo režimu ir natūraliai naudoja programų programavimo sąsają (Windows API), kuri savo ruožtu remiasi branduolio režimo moduliais, kad ją sukurtų. Taigi, branduolio režimo kodo pristabdymas gali sukelti aklavietę: sistema nustos reaguoti į vartotojo užklausas.

Norint pasiekti branduolio atmintį, derinimo priemonės dalys taip pat turi veikti branduolio režimu. Tai iš karto sukelia dvi problemas, kurios yra akivaizdžios atminties organizavimo procesoriaus apsaugotu režimu pasekmė.

Pirmoji problema susijusi su virtualios atminties adresų vertimu. Vairuotojai nuolat sąveikauja su vartotojo režimo programomis ir pasiekia savo atmintį. „Windows“ operacinė sistema verčia virtualius adresus į fizinius adresus pagal gijos konteksto koncepciją. Gijos kontekstas yra struktūra, atspindinti gijos būseną ir apimanti, visų pirma, registrų rinkinį ir tam tikrą kitą informaciją. Kai valdymas perkeliamas į kitą giją, įvyksta konteksto perjungimas, kuris išsaugo informaciją apie vieną giją ir atkuria informaciją apie kitą. Kai gijos kontekstas perjungiamas į kito proceso giją, puslapių katalogas, naudojamas virtualiems adresams paversti fiziniais, taip pat persijungia.

Ypatumas tas, kad siunčiant sistemos skambučius, Windows operacinė sistema neperjungia konteksto. Tai leidžia branduolio režimo kodui naudoti vartotojo režimo virtualius adresus.

Situacija skiriasi siunčiant pertraukimus arba vykdant sistemos gijas. Pertraukimas gali įvykti bet kuriuo metu, todėl nėra galimybės numatyti, kuris gijos kontekstas bus naudojamas. Sistemos gijos nepriklauso jokiam procesui ir negali išversti vartotojo režimo virtualių adresų. Iš to išplaukia, kad tokiais atvejais negalima pasiekti vartotojo režimo atminties.

Antroji problema yra prieiga prie perkeliamos atminties. Dauguma atmintyje esančios informacijos yra perkeliama ir bet kada gali būti perkelta iš fizinės atminties į standųjį diską į puslapio failą. Jei pasiekiamas puslapis, kurio nėra fizinėje atmintyje, procesorius paprastai sugeneruos puslapio gedimo pertraukimą, kurį tvarkytų atminties tvarkyklė, todėl puslapis nuskaitomas iš puslapio failo ir įkeliamas į fizinę atmintį.

Šis elgesys sugenda, jei derinimo kodas yra priverstas naudoti aukštus pertraukimo užklausos lygius (IRQL). Jei IRQL atitinka arba viršija atminties tvarkyklės IRQL, pastaroji negalės įkelti trūkstamo puslapio, nes operacinė sistema blokuos puslapio gedimo pertraukimą. Dėl to operacinė sistema sugenda.

Derinimas paprastai skirstomas į interaktyvųjį ir avarinį. Atliekant interaktyvų vietinį derinimą, derinimo priemonė veikia toje pačioje sistemoje kaip ir derinimo priemonė. Atliekant interaktyvų nuotolinį derinimą, derinimo priemonė ir derinimo objektas veikia skirtingose ​​sistemose. Derinant branduolio kodą, sistema turi būti valdoma nuo pirmųjų jos įkrovos etapų, kai tinklas dar nefunkcionuoja, todėl komunikacijai tarp sistemų naudojamos paprastos nuoseklios sąsajos, tokios kaip COM, FireWire, USB. Pastaruoju metu dėl skirtingų abstrakcijos lygių programinės įrangos virtualizacijos vystymosi tendencijų vis dažniau naudojamos virtualios mašinos. Svečių OS veikia kaip derinimo OS, priglobtoje OS yra derinimo vartotojo sąsaja.

Todėl avariniam derinimui nebūtina, kad bandomajame kompiuteryje būtų įdiegtas derinimo įrankis. „Windows“ operacinės sistemos platinimas apima avarinio derinimo diegimo mechanizmus. Prieš paleisdama iš naujo, operacinė sistema gali išsaugoti informaciją apie savo būseną, kurią kūrėjas gali analizuoti ir išsiaiškinti priežastį. Tokia informacija, įrašyta į failą, vadinama atminties iškrovimu.

Pagrindinius branduolio režimo derinimo įrankius pateikia pats „Windows“ operacinės sistemos gamintojas kaip laisvai platinamo „Windows“ derinimo įrankių paketo dalį. Įrankius sudaro atitinkamai grafiniai ir konsoliniai derintuvai WinDbg ir KD (toliau – Windows Debugger). Šių derintuvų darbas pagrįstas mechanizmais, kuriuos pateikia operacinės sistemos kūrėjai ir kurie yra įterpti į jos branduolį.

Pagrindinis „Windows Debugger“ režimas yra komandų interpretatoriaus režimas. Dėl savo modulinės struktūros „Windows Debugger“ be kūrėjo pateiktų komandų palaiko ir trečiųjų šalių modulius, vadinamus plėtiniais. Tiesą sakant, dauguma integruotų komandų taip pat yra supakuotos kaip plėtiniai.

„Windows Debugger“ yra orientuota į nuotolinį interaktyvų ir avarinį derinimą, kuris, kai naudojamas, atskleidžia visas savo galimybes. Tuo pačiu metu pilnas vietinis interaktyvus derinimas nepalaikomas: derintuvas leidžia peržiūrėti tik kai kurias branduolio struktūras.

Yra Marko Russinovičiaus sukurtas „Windows Debugger“ plėtinio modulis LiveKD, kuris tam tikra prasme įgyvendina vietinį interaktyvų derinimą. LiveKD sukuria darbinės sistemos atminties išklotinę ir naudoja ją derinimui.

„Windows“ derinimo įrankių paketas yra reguliariai atnaujinamas ir palaiko visas šiuolaikines „Windows“ operacines sistemas.

„SoftICE“ branduolio derinimo priemonė, kurią „Compuware“ pagamino „DriverStudio“ programinės įrangos pakete, tradiciškai buvo alternatyva „Windows“ skirtų derinimo įrankių paketui. Išskirtinis SoftICE bruožas buvo vietinio interaktyvaus derinimo įdiegimas palaikomoje aparatinėje įrangoje. Derintuvas galėjo beveik visiškai valdyti operacinės sistemos veikimą.

Nuo 2006 m. balandžio 3 d. „DriverStudio“ šeimos produktų pardavimas buvo nutrauktas dėl „įvairių techninių ir verslo problemų, taip pat dėl ​​bendrų rinkos sąlygų“. Naujausia palaikoma operacinės sistemos versija yra „Windows XP Service Pack 2“. Paprastai pakeitimų paketai nekeičia operacinės sistemos taikomosios programos sąsajos, tačiau gali pasikeisti sistemos skambučių numeriai ir kita nedokumentuota informacija. SoftICE derinimo priemonė rėmėsi sunkiai užkoduotais vidinių duomenų struktūrų adresais. Dėl to suderinamumas nutrūko išleidus 3 pakeitimų paketą. Akivaizdu, kad vėlesnės „Windows“ operacinės sistemos versijos taip pat nepalaikomos.

„Syser Kernel Debugger“ sukūrė nedidelė Kinijos įmonė „Sysersoft“ kaip „SoftICE“ derinimo priemonės pakaitalas. Pirmoji galutinė versija buvo išleista 2007 m. Kaip ir SoftICE, Syser Kernel Debugger gali interaktyviai derinti veikiančioje sistemoje. Palaikomi tik 32 bitų šiuolaikinių „Windows“ versijų leidimai.

Šiuo metu „Windows Debugger“ yra pagrindinis branduolio modulių kūrėjų įrankis. Jį taip pat naudoja „Windows“ operacinės sistemos branduolio komanda.

Ši straipsnių serija pasirodė dėl dviejų priežasčių. Visų pirma, man patinka dirbti su projektu HackSysExtremeVulnerableDriver. Antra, gavau daug linkėjimų aprėpti šią temą.

Visas kodas, naudojamas rašant šią seriją, yra mano saugykloje.

Šioje straipsnių serijoje apžvelgsime branduolio lygio išnaudojimų rašymą sistemoje Windows. Svarbu pažymėti, kad susidursime su žinomais pažeidžiamumais ir nereikia atvirkštinės inžinerijos (bent jau tvarkyklei).

Tikimasi, kad perskaitę visus straipsnius žinosite visas dažniausiai pasitaikančias pažeidžiamumo klases ir išnaudojimo būdus, taip pat gebėsite perkelti exploitus iš x86 architektūros į x64 architektūrą (jei įmanoma) ir susipažinti su naujais apsaugos metodais. „Windows 10“.

Branduolio derinimo grandinė

Skirtingai nuo vartotojo lygio derinimo, kuris sustabdo vieno proceso vykdymą, branduolio lygio derinimas apima visą sistemą ir mes negalėsime naudoti šio metodo. Atitinkamai mums reikia atskiros derinimo mašinos, kuri galėtų susisiekti su sistema, kurioje derinamas branduolys, peržiūrėti atmintį ir branduolio struktūras, taip pat užfiksuoti sistemos gedimus.

Papildoma medžiaga studijuoti:

Branduolio pažeidžiamumų išnaudojimas

Šis procesas yra daug smagesnis nei veikti vartotojo J lygiu.

Pagrindinis tikslas yra pasiekti privilegijuotą vykdymą branduolio kontekste. O toliau viskas priklauso nuo mūsų fantazijos – nuo ​​vaišių su naminiu alumi iki valstybės remiamų kenkėjiškų programų įvedimo.
Apskritai mūsų užduotis yra gauti apvalkalą su sistemos privilegijomis.

Šios serijos straipsnių temos

  • 1 dalis: Darbo aplinkos nustatymas
    • Konfigūruojamos trys virtualios mašinos ir sistema, kuri veiks kaip derinimo priemonė.
    • WinDBG derintuvo konfigūravimas.
  • 2 dalis: Naudingi kroviniai
    • Ištirkite dažniausiai naudojamus krovinius. Tolesnėse dalyse bus nagrinėjami konkretūs pažeidžiamumai ir, jei reikia, pateikiamos nuorodos į šį straipsnį.
  • Likusios dalys.
    • Atsižvelgimas į pažeidžiamumą.

Branduolio išnaudojimo kūrimo gyvavimo ciklas

  • Pažeidžiamumo radimas. Ši tema šioje serijoje nebus aptariama, nes mes jau tiksliai žinome, kur yra spragos.
  • Pertraukiama vykdymo gija. Kai kurie pažeidžiamumai susiję su kodo vykdymu, o kai kuriems keliami papildomi reikalavimai.
  • Privilegijų eskalavimas. Pagrindinis tikslas yra gauti apvalkalą su sistemos privilegijomis.
  • Vykdymo gijos atkūrimas. Dėl nepažymėtų išimčių branduolio lygiu sistema sugenda. Jei neketinate rašyti DoS atakos išnaudojimo, turėtumėte atsižvelgti į šį faktą.

Tikslinių sistemų tipai

Dirbsime su pažeidžiamumu šiose sistemose (konkreti versija nesvarbi):

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

Pradėkime nuo x86 architektūros, o tada išnaudojimą perkelsime į Win7 x64 sistemą. Kai kurie išnaudojimai neveiks „Win10“ įrenginiuose dėl naujų apsaugos priemonių. Tokiu atveju arba pakeisime išnaudojimo logiką, arba naudosime visiškai kitokį požiūrį.

Naudota programinė įranga:

  • Hipervizorius (daug parinkčių).
  • Windows 7 x86 VM
  • Windows 7 x64 VM
  • Windows 10 x64 VM

Derinimo sistemų nustatymas

Derinimo sistemos, su kuriomis bendrausime, yra sukurtos pažeidžiamai tvarkyklei įkelti. Šios mašinos dažnai sugenda, nes dauguma branduolio išimčių prisideda prie tokio pobūdžio reiškinių. Šioms sistemoms turite skirti pakankamai RAM.

Kiekviename kompiuteryje, kuris bus derinamas, turite atlikti šiuos veiksmus:

  • „VirtualKD“ kataloge paleiskite failą target\vminstall.exe. Bus pridėtas naujas įkrovos įrašas ir bus pasiekiamos derinimo funkcijos bei automatinis prisijungimas prie sistemoje įdiegto VirtualKD serverio, kuris veikia kaip derinimo priemonė.

Windows 10 VM atveju reikia įjungti bandomąjį pasirašymo režimą, kuris leidžia į branduolį įkelti nepasirašytas tvarkykles.

Paleidus komandą bcdedit /set testsinging ir paleidus iš naujo, darbalaukyje pasirodys „Test Mode“.

Trumpas HEVD modulio aprašymas

DriverEntry procedūra yra kiekvieno vairuotojo paleidimo procedūra:

NTSTATUS DriverEntry (Į PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) (
UINT32 i = 0;
PDEVICE_OBJECT DeviceObject = NULL;
NTSTATUS Būsena = STATUS_UNSUCCESSFUL;
UNICODE_STRING DeviceName, DosDeviceName = (0);

UNREFERENCED_PARAMETER(RegistryPath);
PAGED_CODE();

RtlInitUnicodeString(&Įrenginio pavadinimas, L"\\Įrenginys\\HackSysExtremeVulnerableDriver");
RtlInitUnicodeString(&DosDeviceName, L"\\DosDevices\\HackSysExtremeVulnerableDriver");

//Sukurkite įrenginį
Būsena = IoCreateDevice(DriverObject,
0,
&Įrenginio pavadinimas,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
NETIESA,
&DeviceObject);

  • Šioje procedūroje yra iškvietimas į funkciją IoCreateDevice, kuriame yra tvarkyklės, kurią naudosime komunikacijos metu, pavadinimas.
  • Prie DriverObject objekto bus pridėtos būtinos struktūros ir funkcijų rodyklės.
  • Mums svarbus funkcijos rodyklė, susieta su procedūra DriverObject->MajorFunction, kuri yra atsakinga už IOCTL (I/O Control) apdorojimą;
  • HEVD ši funkcija vadinama IrpDeviceIoCtlHandler, kuri yra didelė sąlyginė išraiška su daugybe šakų kiekvienam IOCTL. Kiekvienas pažeidžiamumas turi unikalų IOCTL.

Pavyzdys: HACKSYS_EVD_IOCTL_STACK_OVERFLOW yra IOCTL, naudojamas kamino perpildymo išnaudojimui suaktyvinti.

Tuo baigiama pirmoji dalis. Kitame straipsnyje kalbėsime apie naudingąsias apkrovas. Šiuo metu vienintelis naudingas krovinys yra skirtas vogti žetonus, kurie bus naudojami trečiojoje dalyje.

P.S. Suprantu, kad galite susidurti su daugybe įmantrybių ir problemų. Kadangi šioje serijoje pagrindinis dėmesys skiriamas išnaudojimų kūrimui, visas susijusias problemas turėsite išspręsti patys. Tačiau visus klausimus galite užduoti komentaruose.

chPF OELPFPTSCHE KHLBBOYS RP TBVPFE U PFMBDLPK SDTB U BCHBTYKOSHNY DBNRBNY RBNSFY. lBL RTBCHYMP, CHBN OHTSOP VKDEF ЪBDBFSH PDOP YЪ KHUFTPKUFCH RPDLBULY, RETEYUYUMEOOSCHI CH ZHBKME /etc/fstab . uvtpu pvtbpch RBNSFY O KHUFTPKUFCHB, OE SCHMSAEYEUS KHUFTPKUFCHBNY RPDLBYULY, OBRTYNET, MEOFSHCH, CH DBOOSCHK NPNEOF OE RPDDETSYCHBAFUS.

Pastaba: yURPMSHHKFE LPNBODH dumponas (8) DMS KHLBBOYS SDTH NEUFB, ZDE OHTsOP UPITBOSFSH BCHBTYKOSHCHE DBNRSCH. rPUME OBUFTPKLY RP LPNBODE apsikeitimas (8) TBDEMB RPDLBYULY DPMTSOB VSHCHFSH CHSHCHBOB RTPZTBNNNB sąvartynas . pVSHYUOP LFP CHSHRPMOSEPHUS ЪBDBOYEN RETENOOOPK dumpdev CH ZHBKME rc.conf (5). еUMY ЪБДБOB ьФБ RATENEOOBS, FP RPUME UVPS RTY RETCHPK NOPZPRPMSHЪPCHBFEMSHULPK RETEЪBZTHЪLE VHDEF BCHFPNBFYUEULY ЪBRHEEOOB RTPZTBNNNB savecore (8). pOB UPITBOIF BCHBTYKOSHCHK DBNR SDTB CH LBFBMPZ, ЪBDBOOSCHK CH RETENEOOOPK dumpdir ZHBKMB rc.conf . rP KHNPMYUBOYA LBFBMPZPN DMS BCHBTYKOSCHI DBNRPCH SCHMSEFUS /var/crash .

mYVP CHSC NPTSEFE ЪBDBFSH KHUFTPKUFCHP DMS UVTPUB PVTBB RBNSFY SCHOP YUETE RBTBNEFT dump CH UFTPLE konfigūracija LPOZHYZHTBGYPOOPZP ZHBKMB CHBYEZP SDTB. fBLPK URPUPV YURPMSHЪPCHBFSH OE TELPNEODHEFUS Y BY DPMTSEO YURPMSHЪPCHBFSHUS, FPMSHLP EUMY CHSCH IPFYFE RPMKHYUBFSH BCHBTYKOSHCHE PVTBSCH RBNSFY SDTB, RPFPTTYBTHBTHBTYKTBVPPE ЪLE.

Pastaba: dBMEE FETNYO gdb PYOBYUBEF PFMBDYUYL gdb , ЪBRHEEOOSCHK CH „TETSINE PFMBDLY SDTB“. RETEIPD CH LFPF TETSYN DPUFYZBEFUS ЪBRHULPN gdb U RBTBNEFTPN -k . h TETSYNE PFMBDLY SDTB gdb YЪNEOSEF UCHPЈ RTYZMBYEOYE APIE (kgdb) .

Patarimas: eUMY CHSH YURPMSH'HEFE FreeBSD CHETUYY 3 YMY VPMEE TBOOAA, CHCH DPMTSOSCH CHSHRPMOYFSH HUEYEOYE PFMBDPUOPZP SDTB LPNBODPK juostelė, B OE KHUFBOBCHMYCHBFSH VPMSHYPE SDTP: PFMBDPUOPE

# cp branduolys kernel.debug # strip -g branduolys

bFPF YBZ OE FBL KhTS Y OEPVIPDYN, OP TELPNEODKHEN. (PH FreeBSD 4th VPMEE TEMYYBI LFPF YBZ CHSPRMOSEFUS BCHFPNBFYUEULY CH LPOGE RTPGEUUB RPUFTPEOOYS SDTB markė Įdiegti SCHN PVTBBPN, OVTTBCH.

ъBNEFSHFE, YuFP CH UFBTSHCHETUISI „FreeBSD“ (DP 3.1, OE CHLMAYUBS LFPF TEMY), YURPMSHHEFUS SDTB CH ZHTNBFE a.out, RPFPNH YI FBVMYGSH UYNCHPMPCH DPMTSOSCH TBURPPUMBZBSOPFShu CHRBFPFPNSBSOFShu. u VPMSHYPK FBVMYGEK UYNCHPMPCH CH OE HUEYOOOPN PFMBDPUOPN SDTE LFP YЪMYYOSS FTBFB. rPUMEDOYE TEMYYSH FreeBSD YURPMSHJHAF SDTB CH ZHTNBFE ELF, ZHE LFP OE SCHMSEFUS RTPVMENPK.

eUMY CHCH FEUFYTHEFE OPChPE SDTP, ULBTSEN, OBVYTBS YNS OPCHPZP SDTB CH RTYZMBYYE OYBZTHYUYLB, OP CHBN OHTSOP ЪBZTHTSBFSH Y TBHVPFBFSH U DTHZYN TBVPFBFSH U DTHZYN USDTPSHPHFPONH YTPCHBOYA, ЪBZTHTSBKFE EZP FPMSHLP CH PDOPRPMSHЪPCHBFEMSHULPN TETSYNE RTY RPNPEY ZHMBZB -s , KHLBSCCHBENPZP RTY ЪBZTH ЪLE, B ЪBFEN CHSHRPMOYFE FBLYE YBZY:

# fsck -p # mount -a -t ufs # kad jūsų /var/crash failų sistema būtų įrašoma # savecore -N /kernel.panikuotas /var/crash # išeiti # ...į kelių vartotojų

bFB RPUMEDPCHBFEMSHOPUFSH KHLBSCCHBEF RTPZTBNNE savecore (8) APIE YURPMSHЪPCHBOYE DTHZPZP SDTB DMS YЪCHMEYUEOYS UYNCHPMYUEULYI YNEO. YOBYUE POB VKhDEF YURPMSHЪPCHBFSH SDTP, TBVPFBAEE CH DBOOSHK NPNEOF Y, ULPTEE CHUEZP, OYUEZP OE UDEMBEF, RPFPNH YuFP BCHBTYKOSHCHK PVTB RBNSFY YYNCHPFMYUBFFSTB F.

b FERETSH, RPUME UVTPUB BCHBTYKOPZP DBNRB, RETEKDYFE CH LBFBMPZ /sys/compile/WHATEVER Y ЪBRKHUFYFE LPNBODH gdb -k . yЪ RTPZTBNNSH gdb UDEMBKFE CHPF SFP:

Simbolio failas kernel.debug exec-file /var/crash/kernel.0 core-file /var/crash/vmcore.0 Y CHBMS - CHCH NPTSEFE PFMBTSYCHBFSH BCHBTYKOSHK DBNR, YURPMSHЪHS YUIPDOSCH FBLCEFPEMBESCH FBLCE FFEMBYu SDTB MAVPC DTHZPK RTPZTBNNPK.

chPF TsKHTOBM LPNBOD UEBOUB TBVPFSH gdb, YMMAUFTYTHAEIK bfh RTPGEDHTH. dMYOOSCH UFTPLY VSHMY TBPTCHBOSH DMS KHMHYUYEOYS YUYFBVEMSHOPUFY Y DMS KHDPVUFCHB UFTPLY VSHCHMY RTPOKHNETPCHBOSHCH. CHUE PUFBMSHOPE SCHMSEFUS FTBUUYTPCHLPK PYYVLY, TEBMSHOP CHPOYLOKHCHYEK PE CHTENS TBVPFSCH OBD DTBKCHETPN LPOUPMY pcvt.

1:Scenarijus pradėtas 1994 m. gruodžio 30 d., penktadienį, 23:15:22 sys/compile/URIAH/kernel ...atlikta. 5:IdlePTD 1f3000 6:panika: nes tu sakei! 7: dabartinė PCB esant 1e3f70 8: Nuskaitomi simboliai, skirti ../../i386/i386/machdep.c...atlikta. 9: (kgdb) kur 10:#0 įkrova (arghowto=256) (../../i386/i386/machdep.c, 767 eilutė) 11:#1 0xf0115159 panikoje () 12:#2 0xf01955bied (diediedied ) (../../i386/i386/machdep.c, 698 eilutė) 13:#3 0xf010185e, esantis db_fncall () 14:#4 0xf0101586, esantis db_command (-266509132, -36509132, -266509132, -3:51,1:06) 0101711col db_komanda 019ce60 trap_pfault ( ...) 20:#10 0xf019cb2f spąstuose (...) 21:#11 0xf01932a1 išimties atveju: calltrap () 22:#12 0xf0191503 cnopen (...) 23:#13 0xf0132c3 (4 spec2_open) : #14 0xf012d014 in vn_open () 25:#15 0xf012a183 in open () 26:#16 0xf019d4eb in syscall (...) 27: (kgdb) aukštyn 10 28:Skaitymas simboliais, skirtas 3.8/././. i386 /trap.c...atlikta. 29:#10 0xf019cb2f spąstuose (kadras = (tf_es = -260440048, tf_ds = 16, tf_\ 30:edi = 3072, tf_esi = -266445372, tf_ebp = -3:7_26 30396, tf_ebx = - 266427884, tf_edx = 12, tf_ecx = -266427884, tf\ 32:_eax = 64772224, tf_trapno = 12, tf_err = -272695296, -272695296, -3:tf_3 -6_3 2664693 68, tf_flags = 66066, tf_esp = 3072 , tf_\ 34:ss = -266427884)) (../../i386/i386/trap.c 283 eilutė) 35:283 (void) trap_pfault(&frame, FALSE); 36: (kgdb) frame frame->tf_ebp frame->tf_eip 37:Simbolių skaitymas, skirtas ../../i386/isa/pcvt/pcvt_drv.c...atlikta. 38:#0 0xf01ae729 programoje pcopen (dev=3072, flag=3, mode=8192, p=(struct p\ 39:roc *) 0xf07c0c00) (../../i386/isa/pcvt/pcvt_drv.c eilutė 403) 40:403 return ((*linesw.l_open)(dev, tp)); 41: (kgdb) sąrašas 42:398 43:399 tp->t_state |= TS_CARR_ON; 44:400 tp->t_cflag |= CLOCAL; /* negali būti modemas (:-) */ 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) spausdinti tp 53: Simbolių skaitymas ../../i386/i386/cons.c...atlikta. 54:$1 = (struct tty *) 0x1bae 55: (kgdb) spausdinti tp->t_line 56:$2 = 1767990816 57: (kgdb) aukštyn 58:#1 0xf0191503 naudojant cnopen (dev=0x0000=3, 0x000000 , p=(st\ 59:ruct proc *) 0xf07c0c00) (../../i386/i386/cons.c 126 eilutė) 60: return ((*cdevsw.d_open)(dev, flag, mode, p) ); 61: (kgdb) aukštyn 62:#2 0xf0132c34 spec_open () 63: (kgdb) aukštyn 64:#3 0xf012d014 vn_open () 65: (kgdb) aukštyn 66:#4 0xf012a186) (kg) aukštyn 68:#5 0xf019d4eb in syscall (frame=(tf_es = 39, tf_ds = 39, tf_edi =\ 69: 2158592, tf_esi = 0, tf_ebp = -272638436, tf_7, 2 x = 708 6, tf_edx = 1, tf_ecx = 0, tf_eax = 5, tf_trapno = 582, \ 71: tf_err = 582, tf_eip = 75749, tf_cs = 31, tf_eflags = 58, \ 7 = 58, \ 7 = 58 tf_ss = 39)) (. ./../i386/i386/trap.c line 673) 73:673 error = (*calp->sy_call)(p, args, rval); 74: (kgdb) aukštyn 75: pasirinktas pradinis kadras; tu negali pakilti. 76: (kgdb) quit 77: # exit 78:exit 79: 80:Scenarijus padarytas 1994 m. gruodžio 30 d. penktadienį 23:18:04

lPNNEOFBTYY L CHSHCHYYERTYCHEDEOOPNH TSHTOBMKH:

UFTPLB 6:

ьФП DBNR, CHSFSHCHK RTY RPNPEY DDB (UNPFTY OITSE), RPPFPNH LPNNEOFBTYK L BCHBTYKOPNH PUFBOPCHH YNEEF YNEOOP CHYD ``kadangi tu sakei!'' Y FTBUUYTPCHLB UFELB ZMHVPLUBBTYK; PDOBLP YOBYUBMSHOPK RTYYUYOPK RETEIPDB CH DDB VSHMB BCHBTYKOBS PUFBOPCHLB RTY CHPOYLOPCHEOYA PYYVLY UFTBOIGSC RBNSFY.

UFTPLB 20:

lFP NEUFPOBIPTSDEOOYE ZHKHOLGYY trap() CH FTBUUYTPCHLE UFELB.

UFTPLB 36:

rTYOKHDIFEMSHOPE YURPMSHЪPCHBOIE OPChPK ZTBOYGSCH UFELB; FERTSH LFP OE OHTSOP. rTEDRPMBZBEFUS, YuFP ZTBOYGSCH UFELB KHLBSCCHBAF APIE RTBCHYMSHOP TBURPMPTSEOYE, DBCE CH UMHUBE BCHBTYKOPZP PUFBOPCHB. zMSDS APIE UFTPLH YUIDOPZP LPDB 403, NPTsOP ULBBFSH, YuFP CHEUSHNB CHETPSFOP, YuFP MYVP CHYOPCHBF DPUFHR RP KHLBBFEMA ``tp", MYVP VSHM CHSHCHIPD ЪBNB ZТBOYGSHB.

UFTPLB 52:

rPIPTSE, YuFP CHYOPCHBF KHLBBFEMSH, OP ON SCHMSEFUS DPRKHUFYNSCHN BDTEUPN.

UFTPLB 56:

pDOBLP, PYUECHYDOP, UFP ON KHLBSCCHBEF APIE NHUPT, FBL UFP NSCH OBYMY OBYKH PYYVLH! (DMS FEI, LFP OE OBLPN U LFPC YUBUFSHHA LPDB: tp->t_line UMHTSYF DMS ITBOEOYS TETSYNB LBOBMSB LPOUPMSHOPZP HUFTPKUFCHB, Y LFP DPMTSOP VShchFSH DPUFBFPYuOP GEMPEOSYuOP YUBUFSHHA NBMEOSY.)

Terminas „branduolio derinimas“ reiškia branduolio vidinės duomenų struktūros tyrimą ir (arba) nuoseklų branduolio funkcijų sekimą. Šis derinimas yra labai naudingas būdas ištirti vidinį „Windows“ veikimą, nes jis leidžia matyti vidinę sistemos informaciją, kuri nėra pasiekiama naudojant kitas priemones, ir suteikia aiškų vaizdą apie kodo eigą branduolyje.

Prieš nagrinėdami įvairius branduolio derinimo būdus, išnagrinėkime failų rinkinį, kurio jums reikės norint atlikti bet kokį branduolio derinimą.

Branduolio derinimo simboliai

Simbolių failuose yra funkcijų ir kintamųjų pavadinimai, taip pat duomenų struktūrų išdėstymas ir formatas. Juos generuoja susiejimo programa, o derintojai juos naudoja, kad nurodytų šiuos pavadinimus ir rodytų juos derinimo seanso metu. Ši informacija paprastai nėra saugoma dvejetainiame kode, nes jos nereikia, kai kodas vykdomas. Tai reiškia, kad be jo dvejetainis kodas tampa mažesnis ir veikia greičiau. Tačiau tai taip pat reiškia, kad derindami turite užtikrinti, kad derintuvas turėtų prieigą prie simbolių failų, susijusių su dvejetainiais vaizdais, nurodytais derinimo sesijos metu.

Norėdami naudoti bet kokį branduolio režimo derinimo įrankį, kad ištirtumėte vidines „Windows“ branduolio duomenų struktūros dalis (procesų sąrašą, gijų blokų sąrašą, įkeltų tvarkyklių sąrašą, atminties naudojimo informaciją ir kt.), jums reikia teisingų simbolių failų ir mažiausiai simbolio failas, skirtas branduolio dvejetainiam vaizdui - Ntoskrnl.exe. Simbolių lentelės failai turi atitikti dvejetainio vaizdo, iš kurio jie buvo išgauti, versiją. Pavyzdžiui, jei įdiegėte „Windows“ pakeitimų paketą arba tam tikrą pataisą, kuri atnaujina branduolį, turite atitinkamai atnaujinti simbolių failus.

Įvairių „Windows“ versijų simbolius atsisiųsti ir įdiegti lengva, tačiau atnaujinti pataisų simbolius ne visada įmanoma. Paprasčiausias būdas gauti derinimui reikalingą simbolių versiją yra susisiekti su specialiai tam skirtu Microsoft simbolių serveriu, naudojant specialią derinimo priemonėje nurodyto simbolio kelio sintaksę. Pavyzdžiui, dėl šio simbolio kelio derinimo įrankiai atsisiunčia simbolius iš internetinio simbolių serverio ir išsaugo vietinę kopiją c:\symbols:srv*c:\symbols*http://msdl.microsoft.com/download/ simboliai

Išsamias simbolių serverio naudojimo instrukcijas rasite derinimo įrankių pagalbos faile arba internete adresu http://msdn.microsoft.com/en-us/windows/hardware/gg462988.aspx.

Kaip paleisti branduolio derintuvą?

Meistro atsakymas:

Programinės įrangos kūrimo procese yra vienas labai svarbus komponentas – derinimas. Kalbant apie taikomąsias programas, tai atliekama priemonėmis, kurios veikia vartotojo režimu ir dažnai yra integruotos į IDE. Kad galėtumėte derinti, pavyzdžiui, tvarkykles, turite paleisti branduolio derinimo priemonę.

Turite paleisti cmd komandų procesorių. Užduočių juostoje atidarykite meniu Pradėti. Atsidariusiame lange spustelėkite elementą „Vykdyti…“. Pasirodys langas „Vykdyti programą“. Teksto lauke įveskite cmd, tada spustelėkite Gerai.

Dabar sukurkite atsarginę failo boot.ini kopiją. Pirmiausia sužinokite dabartinės „Windows“ kopijos diegimo kelią naudodami komandą: echo %SystemRoot%

Tada eikite į diską su įdiegta operacine sistema, įvesdami įrenginio raides, o po to dvitaškį. Naudodami komandą cd eikite į šakninį katalogą. Dabar, naudodami komandą attrib, pašalinkite atributus "paslėpti", "tik skaityti" ir "sistema" iš failo boot.ini. Naudokite kopijavimo komandą, kad sukurtumėte atsarginę kopiją, tada nustatykite atributus.

Norėdami pamatyti dabartinį įkrovos parinkčių sąrašą, naudokite komandą bootcfg /query. Peržiūrėkite sąrašą ir nustatykite elementą, kurio pagrindu bus sukurti nauji nustatymai su galimybe derinti branduolio režimu. Reikėtų atsiminti įkrovos įrašo ID.

Norėdami sukurti įkrovos įrašą, naudokite komandą bootcfg/copy. Norėdami nurodyti kopijuojamo įrašo ID, naudokite parametrą /id. Naudodami /d parinktį nurodykite įrašo, kuris bus rodomas, pavadinimą. Dabar turite grįžti į įkrovos parinkčių sąrašą naudodami komandą bootcfg /query ir pažvelgti į pridėto įrašo ID.

Dabar į anksčiau sukurtą įkrovos įrašą turite įtraukti parinktis, kad paleistumėte branduolio derintuvą. Jei derinsite tiksliniame kompiuteryje, tereikia pridėti parinktį /debug.

Jei norite atlikti nuotolinį derinimą, prijungdami tikslinį kompiuterį per com prievadą prie pagrindinio kompiuterio, naudokite parinktis /port ir /baud, kad nurodytumėte prievado numerį ir perdavimo spartą.

Jei atliksite nuotolinį derinimą naudodami FireWire kabelį (IEEE 1394 sąsaja), naudokite parinktį /dbg1394, kad įgalintumėte atitinkamą režimą, ir parinktį /ch, kad nurodytumėte kanalo numerį.

Norėdami įsitikinti, kad pakeitimai buvo atlikti, patikrinkite įkrovos failus naudodami komandą bootcfg su parametru /query. Įvykdę išėjimo komandą, uždarykite apvalkalo langą.

Jei reikia, pakeiskite operacinės sistemos įkrovos nustatymus. Atidarykite valdymo skydelį per meniu Pradėti ir jame atidarykite elementą Sistema. Atsidariusiame lange „Sistemos ypatybės“ pasirinkite skirtuką „Išplėstinė“. Šiame skirtuke pasirinkite skyrių „Įkrovimas ir atkūrimas“ ir spustelėkite mygtuką „Parinktys“. Pasirodžiusiame lange „Įkrovimas ir atkūrimas“ turite suaktyvinti parinktį „Rodyti operacinių sistemų sąrašą“. Uždarykite abu dialogo langus mygtuku „Gerai“.

Iš naujo paleiskite kompiuterį. Pasirinkite įkrovą su derintuvu. Prisijunkite ir pradėkite dirbti su tiksliniu kompiuteriu arba pradėkite derinti nuotoliniu būdu. Naudokite tokius įrankius kaip WinDbg ir KD.