Kaip veikia operacinės sistemos branduolio derinimo priemonė. Branduolio režimo derinimo įrankiai, skirti Windows operacinei sistemai Kas yra branduolio derinimas

Kaip paleisti branduolio derintuvą?

Meistro atsakymas:

Programinės įrangos kūrimo procese yra vienas labai svarbus komponentas – derinimas. Link taikomosios programos tai atlieka įrankiai, kurie veikia vartotojo režimu ir dažnai yra integruoti į IDE. Kad galėtumėte derinti, pavyzdžiui, tvarkykles, turite paleisti branduolio derinimo priemonę.

Reikia paleisti procesorių komanda cmd. 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ė kopija boot.ini failą. Pirmiausia išsiaiškinkite srovės įrengimo kelią „Windows“ kopijos, 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 įrašo, kurį kopijuosite, identifikatorių, 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 įkrovos parinktis Operacinė sistema. 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 langai mygtuką "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.

Š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 reikalingas atskiras derinimo aparatas, galintis susisiekti su sistema, kurioje derinamas branduolys, peržiūrėti atminties 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: sąranka darbo aplinka
    • 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 į tai atsižvelgti.

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 perkelsime išnaudojimą Win7 x64 sistemai. 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 derinimo funkcijos bus prieinamos ir automatinis ryšysį sistemoje įdiegtą VirtualKD serverį, 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,
NETEISINGA
&DeviceObject);

  • Šioje procedūroje yra iškvietimas į funkciją IoCreateDevice, kuriame yra tvarkyklės, kurią naudosime komunikacijos metu, pavadinimas.
  • Prie DriverObject objekto bus pridėtos reikalingos 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. Įjungta Šis momentas Vienintelis naudingas krovinys yra skirtas pavogti ž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.

  • 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 vartotojo režimo ir branduolio režimo derinimo analizė, atsižvelgiant į operacinę sistemą. Microsoft Windows, išryškinami pastarųjų derinimo organizavimo skirtumai ir problemos. Remiantis gautais rezultatais, suformuluoti pagrindiniai reikalavimai branduolio režimo derintuvų kūrimui avarinio ir interaktyvaus derinimo atveju. Analizė atlikta esamus sprendimus už reikalavimų laikymąsi. 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ų komunalinės paslaugos. Jeigu mes kalbame apie apie sistemos programinę įrangą ir ypač tvarkyklių kūrimą, tuomet 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: programos kodas rašomas visu mastu kompiuterio sistema, derinimas – derinimo sistemoje, 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į ją sutikdami, o dauguma jos galimybių lieka nepanaudotos.

Remiantis virtualios adresų erdvės struktūra, jei programa padaro klaidą, dėl kurios programa įrašo duomenis į savavališką atminties vietą, programa tik sugadins savo atmintis ir neturės įtakos kitų programų bei operacinės sistemos veikimui. kadangi programos kodas branduolio režimas 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 suteikia: pagrindinės funkcijos:
  • lygio derinimas pirminis kodas;
  • 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 nereikalinga vykdant programą, tačiau itin naudinga ją derinant: funkcijų pavadinimai, globalūs kintamieji, aprašymai. konstrukcijų. Derinimo simboliai yra prieinami visoms operacinės sistemos vykdomosioms programoms Windows sistemos.

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 vienu metu 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, pasiekdami savo atmintį. „Windows“ operacinė sistema verčia virtualius adresus į fizinius, remdamasi gijos konteksto koncepcija. 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. Didžiąją dalį atmintyje esančios informacijos galima perkelti į kitą vietą ir iš jos galima perkelti Fizinė atmintisįjungta HDDį 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į.

Aprašytas veiksmas sugenda, jei derinimo kodas yra priverstas naudoti aukštas lygis pertraukimo užklausų lygiai (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 vykdomi skirtingos sistemos. 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 programinės įrangos virtualizacijos plėtros tendencijų skirtingi lygiai abstrakcijos vis labiau traukia 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 modulinės struktūros, kartu su kūrėjų pateiktomis „Windows“ komandos Debugger palaiko trečiųjų šalių modulius, vadinamus plėtiniais. Tiesą sakant, dauguma integruotų komandų taip pat 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 bruožas SoftICE buvo vietinio interaktyvaus derinimo įgyvendinimas palaikomoje sistemoje aparatūra. 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 versija Operacinė sistema, kuriai buvo įdiegtas palaikymas, 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ų leidimai modernios versijos Windows.

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

Derintuvas yra antras dalykas po kompiliatoriaus, kurio reikia programoms kurti. Tačiau daugelis tų, kurie rašo kompiuterines programas ir naudoja derintuvą, nežino jo veikimo principų ir mechanizmų.


Sunku būti derintoju...

Atsižvelgiant į tai, kad programuotojai derintuvą naudoja dieną ir naktį, ypač kai įjungiamas gilaus derinimo režimas, verta pasakyti, kad jei derinimo priemonė būtų ne programa, o aparatinės įrangos dalis, ji greičiausiai perkaistų ir sugestų. Nes net kompiliatorius neturi tiek daug darbo, kiek derinimo programa.

Žinoma, kadangi dabar yra daug skirtingų programavimo kalbų, kiekvienai iš jų yra skirtingi derintuvai. Natūralu, kad skirtingoms šių kalbų kategorijoms derinimo priemonių darbas skiriasi: pavyzdžiui, programų derinimo priemonė interpretuojamame Ruby veiks kitaip nei Java kalba, sudaryta į baitinį kodą, ir derinimo priemonė, skirta Java, pasukti, turės skirtumų nuo derinimo programos Visual C++.

Pakalbėsiu apie „Windows“ platformos derinimą. Suvokus jai skirtų derintuvų veikimo principus, bus galima suprasti ir POSIX sistemų derintuvus, ir derintuvus, kurie veikia ne operacinės sistemos, o virtualios mašinos ar kokio nors interpretatoriaus lygiu.


„Windows“ derinimo priemonės: dviejų tipų

Yra du iš esmės skirtingi „Windows“ derintuvų tipai. Manau, kad visi su pirmuoju susidūrė programuodami Delfyje (jame neprogramavote? Sunku patikėti. Ką programavote mokykloje ir jaunesniajame koledže?). Tai yra pasirinktiniai programų derinimo įrenginiai. Jų yra daug ir jie egzistuoja tiek atskirai, tiek (ypač, beje, dažnai) kaip integruotų programų kūrimo aplinkų dalis. Tarp derinimo priemonių, platinamų kaip atskiri programinės įrangos produktai, tradiciškai paryškinamas OllyDbg, apie kurį kažkada rašiau „Computer News“.

Antrasis derinimo tipas yra operacinės sistemos branduolio derintuvas. Jie randami ir naudojami rečiau, o jų dizainas labai skiriasi nuo pritaikytų programų derinimo priemonių. Garsiausias ir tuo pačiu geriausias branduolio derinimo įrankis yra „SoftIce“. Galbūt jūs ne tik girdėjote apie tai, bet netgi naudojote.

Kadangi kiekvieno iš dviejų derintuvų tipų darbas turi savo specifiką, apie kiekvieną iš jų pakalbėsiu plačiau.


Pasirinktinis programų derinimo įrankis

Naudotojų programų derinimo priemonė yra paprastesnė, nes operacinė sistema atlieka patį menkiausią ir nešvariausią darbą. „Windows“ turi specialias programinės įrangos sąsajas, kurios yra skirtos vartotojo lygio taikomųjų programų derinimui – jos vadinamos „Windows Debugging API“. Tai yra derinimo API, kurias naudoja visi derinimo įrenginiai, kurie yra integruoti į populiarias integruotas „Windows“ kūrimo aplinkas.

Kad derinimas prasidėtų, derintuvas turi paleisti derinamą procesą ypatingu būdu – kad sistema žinotų, jog šis procesas bus derinamas. Po to prasideda derinimo ciklas: programa vykdoma tol, kol įvyksta tam tikras įvykis, kuris vadinamas derinimo įvykiu. Tai paleidžia derinimo kilpą atskiroje gijoje, kad derintuvas nekabintų.

Bet tai tik pradžia. Nes derinimo programos linksmybės prasideda tada, kai įvyksta derinimo įvykis. Galų gale, koks yra derintojo darbas? Padėti programuotojui tiksliai lokalizuoti klaidą konkrečiai funkcijai, konkrečiai operacijai, konkrečiam kintamajam. Tuo nelengva užduotis Derintojui taip pat gali padėti operacinė sistema.

Taigi, įvyko derinimo įvykis, ir tada turime kažkaip išsiaiškinti, kaip tai susiję su programos tekstu. Tai įmanoma tik tuo atveju, jei pačioje programoje yra speciali derinimo informacija – derinimo simbolių lentelė. Jame pateikiama informacija apie adresų ir funkcijų pavadinimų atitikimą, duomenų tipus ir kodo eilučių numerius. Būtent jų dėka galimas derinimas, kurį žino kiekvienas Windows programuotojas. Simbolių lentelės yra skirtingų formatų, todėl ne visada įmanoma derinti vieno kūrėjo kompiliatoriaus sudarytą programą naudojant kito gamintojo derintuvą. Tačiau vis tiek galima nurodyti labiausiai paplitusią formatą - tai PDB (Programų duomenų bazė), kurį, žinoma, sukūrė „Microsoft Corporation“.

Taigi, jei derinimo simbolių lentelė yra PBP formatu, tuomet galite naudoti specialų Microsoft įrankį – simbolinį derinimo procesorių. Kadaise ji buvo sistemos branduolio dalis ir vadinosi Imagehlp.dll, bet seniai buvo atskirta į atskirą biblioteką. Simbolių procesorius leidžia rasti artimiausią atvirą funkciją arba visuotinį kintamąjį nurodytu adresu, taip pat eilutės numerį ir šaltinio failo, kuriame yra ši eilutė, pavadinimą. Taip pat palaikomos atvirkštinės operacijos, pavyzdžiui, funkcijos adreso paieška pagal jos pavadinimą.

Žinoma, tai dar ne visas darbas, kurį atlieka pasirinktinės programos derinimo priemonė. Pavyzdžiui, derinant kelių gijų programas, iškyla daug labai subtilių problemų, susijusių su gijų sąveika. Net ir derinant tokius gana paprastus dalykus kaip paslaugos, yra tam tikrų niuansų.

Bet mes dabar nesigilinsime į niuansus - straipsnio pabaigoje aš jums pasakysiu, kur apie juos skaityti. Dabar pažvelkime į branduolio derinimo priemones.


Branduolio derinimo priemonė

Branduolio derintuvai yra daug sudėtingesnės programos nei vartotojo programų derinimo priemonės, ir manau, kad visiškai aišku kodėl: jie neturi operacinės sistemos asistento. Šiuo atveju ji yra jų klientė, nes ji galiausiai turi derinti.

Daugumai branduolio derintuvų reikia dviejų kompiuterių, sujungtų nuliniu modemo kabeliu. Nulinis modemas yra būdas tiesiogiai sujungti du kompiuterius per jų COM arba LTP prievadus. Antras kompiuteris reikalingas, nes derintuvo dalis, esanti pirmame (tame, kuriame įdiegta derinama sistema), turi ribotas priėjimasį aparatinę įrangą, todėl visi duomenys perduodami per nulinį modemą į antrąjį kompiuterį.

Šiuolaikiniai Intel x86 architektūros procesoriai turi specialius derinimo registrus (tiek senuose 368, tiek naujesniuose procesorių modeliuose jų yra tik aštuoni, jie vadinami DR0-DR7). Šie registrai leidžia derintojui nustatyti atminties nuskaitymo ir rašymo, taip pat įvesties / išvesties prievadų lūžio taškus. Apskritai viskas atrodo tiksliai taip, ir nemanau, kad dabar verta išsamiai aprašinėti, už ką atsakingas kiekvienas derinimo registras, kas pertraukia diegimo lūžio taškus ir duoti kitos panašios informacijos. Geriau papasakoti apie konkrečias esamas „Windows“ branduolio derinimo priemones.

Na, pirma, tai yra derinimo priemonė, įmontuota pačiame operacinės sistemos branduolyje. Jis yra visose NT linijos operacinėse sistemose, pradedant nuo Windows 2000. Jis yra NTOSKRNL.EXE failo dalis ir gali būti įjungtas nustačius "/Debug" operacinės sistemos parinktį BOOT.INI. Šiam derintuvui reikalingas nulinio modemo ryšys ir antras kompiuteris su ta pačia OS.

Yra dar vienas „Microsoft“ branduolio derinimo įrankis - WinDBG. Griežtai kalbant, tai ne branduolio derintuvas, o hibridinis derintuvas, kuris taip pat gali būti naudojamas derinant vartotojo lygio programas. Jis, skirtingai nei branduolyje įmontuotas derintuvas, turi grafinį apvalkalą, todėl jį lengviau naudoti. Šis derinimo įrankis taip pat palaiko specialius plėtinius, kurie gali būti naudingi atliekant kai kurias derinimo užduotis. Tačiau branduoliui derinti taip pat reikia dviejų kompiuterių.

Tačiau yra branduolio derinimo priemonė, kuri gali derinti viename kompiuteryje. Tai yra SoftIce. Tuo pačiu metu „SoftIce“ taip pat gali derinti taikomąsias programas. Šio derinimo priemonės naudojimas vartotojų programoms yra pateisinamas, pavyzdžiui, derinant realaus laiko sistemas, susietas su sistemos laikmačiu. Jei derinate naudodami įprastą derintuvą, rezultatas gali būti neteisingas, net jei programa veikia tinkamai, o SoftIce sustabdys ir programą, ir laikmatį. Tai naudinga derinant kelių gijų programas. Be to, SoftIce turi labai labai gerai išvystytas priemones, rodančias informaciją apie visas sistemoje esančias gijas, apie kelių gijų programų gijų sinchronizavimą, informaciją apie rankenas... Vienintelis šio derintuvo trūkumas yra sudėtingumas programų programuotojui. Tačiau iš branduolio derinimo priemonių tai yra pati paprasčiausia ir efektyviausia.


Smalsiausiems

Žinoma, dabar pokalbis apie „Windows“ programų derinimo priemones nėra toks aktualus, kaip prieš dešimt metų. Visas pasaulis susidomėjo internetu, o pagrindiniai „SoftIce“ vartotojai buvo krekeriai, nenuilstantys piratavimo srities darbuotojai. Tačiau tai nėra taip blogai. Bendravimas su SoftIce neabejotinai lavina žmogų kompiuterinių žinių prasme, nors, žinoma, jei bendrauji tik su derintojais, o ne su tikrais žmonėmis, galimi tam tikri šalutiniai poveikiai.

Derintuvai yra vieni iš labiausiai išsiskiriančių programinės įrangos tipų, tačiau kūrimo požiūriu net vartotojo lygio programų derintuvai yra gana sudėtingi. Tačiau, nepaisant to, jei turėsite noro ir laiko kurti savo derintuvą, jūsų žinios operacinių sistemų ir programavimo srityje žymiai padidės, o tai reiškia, kad padidės jūsų šansai gauti gerai apmokamą darbą.

Taigi, jei norite sukurti savo derintuvą, pirmiausia turėtumėte perskaityti medžiagą šia tema. Mano nuomone, geriausia knyga pradėti yra Johno Robbinso knyga „Windows programų derinimas“. Ji jau sena, išleista 2001 m., tačiau jame esanti informacija aktuali ir šiandien, nes yra bendro, net kažkaip esminio pobūdžio. Šioje knygoje pateikiami Windows derinimo priemonių rašymo pavyzdžiai. Ji taip pat bus naudinga, jei programuojate C++ ir norite geriau suprasti išimčių tvarkymą. Tiesą sakant, būtent iš šios knygos sužinojau straipsnyje pateiktą informaciją apie derinimo priemones. Jei nerandate šios knygos (juk ji jau gana sena), yra keli adresai, kurie jums gali būti naudingi. Pirmasis yra toks: www.xakep.ru/post/19158/default.asp. Šiame žurnalo „Hacker“ straipsnyje daugiau nei aš aprašiau branduolio derintuvus, be to, jame yra paprasto derinimo priemonės kodas. O kalashnikoff.ru/Assembler/issues/016.htm galite sužinoti, kaip parašyti DOS derintuvą. Bet, žinoma, geriausia perskaityti MSDN ir tuo pačiu metu rasti atvirojo kodo derintuvą, kad jį suprastumėte. Ir, žinoma, jei ėmėtės rašyti derinimo programą, sėkmės jums atliekant šią sunkią užduotį!

Norėdami derinti branduolį, turite prisijungti prie kompiuterio naudodami Nulinis modemo kabelis arba modemo prijungimas. Kompiuteris, atliekantis derinimą, bus vadinamas „Host“, o probleminis kompiuteris – „Target“.

Abu kompiuteriai turi veikti vienodai Windows versijos, o tikslinio kompiuterio simbolių failai turi būti įdiegti pagrindiniame kompiuteryje. Simbolių failai pateikiami Windows diegimo kompaktiniame diske, kataloge Support\Debug.

Norėdami įjungti derinimą, turite atlikti BOOT.INI failo pakeitimus tiksliniame kompiuteryje.

1. Pakeiskite BOOT.INI failo atributus:

attrib c:\boot.ini –r –s

2. Redaguokite šį failą ir į eilutę Windows paleidimas pridėkite parametrą /debug (kad nurodytų sistemai paleisti RAM branduolio derinimo priemonė paleidžiant „Windows“.). Papildomi parametrai yra /Debugport, kuris nurodo sistemai, kuris COM prievadas turi būti naudojamas (COM2 pagal nutylėjimą) ir /Baudrate - duomenų perdavimo spartai nurodyti (numatytasis yra 19200 bodų, bet geriau naudoti 9600). Pavyzdžiui:


multi(0)disk(0)disk(0)partition(0)\WINDOWS="Windows NT" /debug /debugport=com2 /baudrate=9600

3. Išsaugokite failą.

4. Nustatykite ankstesnius BOOT.INI failo atributus:

attrib c:\boot.ini +r +s

IN šiame pavyzdyje Tikslinis kompiuteris leido prisijungti per COM2 prievadą 9600 bps greičiu.

Pagrindiniame kompiuteryje turi būti sukonfigūruoti derinimui reikalingi nustatymai. Be to, reikia įdiegti simbolių failus. Norėdami juos įdiegti, eikite į diegimo kompaktinio disko katalogą \support\debug ir įveskite šią komandą:

expndsym : <целевой диск и каталог>

Pavyzdžiui:

expndsym f: d:\simboliai

Diegimas gali užtrukti. Atminkite, kad jei pakeitimų paketai buvo įdiegti tiksliniame kompiuteryje, tų paketų simbolių failai taip pat turi būti įdiegti pagrindiniame kompiuteryje. Naujinimo paketų simbolių failus galima atsisiųsti iš „Microsoft“ svetainės.

Kitas etapas yra sąranka aplinkos įvairovė, būtini derinant, pavyzdžiui, kintamieji, nurodantys simbolių failų vietą ir kt. Toliau pateikiamas šių kintamųjų aprašymas.

Sistemos kintamųjų aprašymas

Šių kintamųjų apibrėžimas gali būti įtrauktas paketinis failas kad nebūtų įvedamos atitinkamos komandos kiekvienos įkrovos metu:

aidas išjungti
set_nt_debug_port=com2
set_nt_debug_baud_rate=9600
nustatyti _nt_symbol_path=d:\ymbols\i386
set _nt_log_file_open=d:\debug\logs\debug.log

Dabar reikia nukopijuoti branduolio derinimo programinę įrangą, esančią kataloge support\debug\<процессор>diegimo kompaktiniame diske (support\debug\I386). Lengviausias būdas yra nukopijuoti visą katalogą, nes jis yra mažas (apie 2,5 MB). I386 platformai naudojamas derinimo įrankis, kuris pateikiamas kaip failas I386KD.EXE. Derinimo priemonė paleidžiama naudojant komandą I386KD. Norėdami įvesti komandą, paspauskite klavišų kombinaciją ir palaukite, kol pasirodys raginimas komandinė eilutė kd>.

Dalintis