Windows 7 ядросын жөндеу режимінің орындалу уақыты. Түзеткіш қалай жұмыс істейді

  • Авторлары:

    Баринов С.С., Шевченко О.Г.

  • Жылы:
  • Дереккөз:

    Информатика және компьютерлік технологиялар / Студенттердің, аспиранттар мен жас ғалымдардың VI халықаралық ғылыми-техникалық конференциясының материалдары – 23-25 ​​қараша 2010 ж., Донецк, ДонҰТУ. - 2010. - 448 б.

аннотация

Microsoft Windows операциялық жүйесіне қатысты пайдаланушы режимі мен ядро ​​режимін жөндеудің салыстырмалы талдауы берілген, соңғысының жөндеуін ұйымдастырудың айырмашылықтары мен мәселелері көрсетілген. Алынған нәтижелер негізінде апаттық және интерактивті жөндеу кезінде ядро ​​режимінің жөндеушілерін құруға қойылатын негізгі талаптар тұжырымдалған. Қолданыстағы шешімдердің талаптарға сәйкестігіне талдау жүргізілді. Атап айтқанда, Microsoft Windows Debugger бағдарламасына ерекше назар аударылады.

Негізгі бөлім

Түзету - бағдарламалық жасақтамадағы қателердің себептерін анықтау және жою процесі. Кейбір жобаларда жөндеу жалпы әзірлеу уақытының 50% алады. Үнемі жетілдіріліп тұратын арнайы құралдарды пайдалану арқылы жөндеуді айтарлықтай жеңілдетуге болады. Мұндай негізгі құрал бағдарламалық қамтамасыз етудің орындалуын бақылауға, оның орындалу барысын бақылауға және оған кедергі келтіруге мүмкіндік беретін отладчик болып табылады. Ядро жөндеу құралдарын негізінен драйвер әзірлеушілері пайдаланады.

Қолданбалы бағдарламалық жасақтаманы әзірлеу құралдары бағдарламашыға кең мүмкіндіктер береді. Кез келген біріктірілген әзірлеу ортасы үшінші тарап утилиталарын пайдаланудың қажетінсіз жөндеу мүмкіндігін қамтиды. Егер біз жүйелік бағдарламалық қамтамасыз ету және драйверлерді әзірлеу туралы айтатын болсақ, онда оның ерекшеліктеріне байланысты әзірлеу процесі өте қиын және аз автоматтандырылған. Барлық даму кезеңдері, соның ішінде отладтау бөлек. Олардың әрқайсысын жүзеге асыру үшін арнайы шарттар қажет: бағдарлама кодын жазу толыққанды компьютерлік жүйеде орындалады, жөндеу отладтау жүйесінде орындалады, жағдайларға байланысты тестілеу жүргізіледі және т.б. Ядро режимінің отладкасының өзін үйрену қиынырақ және сәйкесінше азырақ достық.

Жалпы, ядроны жөндеу құралдарының жоқтығы туралы айтуға болады. Мұндай құралдар бар болғанымен, балама нұсқалар туралы жиі айтылмайды. Мысалы, Microsoft Windows Debugger бағдарламасы өте жоғары кіру шегіне ие. Көптеген бағдарламашылар оны кездестірген кезде бірінші жағымсыз тәжірибе туралы айтады және оның мүмкіндіктерінің көпшілігі талап етілмейді.

Виртуалды мекенжай кеңістігінің құрылымына сүйене отырып, егер қолданба қолданбаға деректерді ерікті жад орнына жазуға себеп болатын қате жіберсе, қолданба тек өзінің жадына зақым келтіреді және басқа қолданбалардың және операциялық жүйенің жұмысына әсер етпейді. . Ядро режиміндегі бағдарлама коды операциялық жүйенің маңызды деректер құрылымдарын зақымдауы мүмкін, бұл сөзсіз жалпы ақауға әкеледі. Тиімсіз жазылған драйвер бүкіл операциялық жүйенің айтарлықтай нашарлауына әкелуі мүмкін.

    Заманауи жөндеушілер келесі негізгі функцияларды қамтамасыз етеді:
  • бастапқы код деңгейінде жөндеу;
  • орындауды басқару;
  • жадты қарау және өзгерту;
  • процессор регистрлерінің мазмұнын қарау және өзгерту;
  • қоңыраулар сағын қарау.

Бөлшектелген кодпен жұмыс істеуді жеңілдету үшін деп аталатын. отладка таңбалары. Байланыстырушы жұмыс істеп тұрған кезде, орындалатын файлдың кескінінен басқа, бағдарламаны орындау кезінде талап етілмейтін, бірақ оны жөндеу кезінде өте пайдалы ақпаратты қамтитын деректер файлын жасауға болады: функциялардың атаулары, глобалдық айнымалылар, сипаттамалар. құрылымдардың. Түзету таңбалары барлық Windows амалдық жүйесінің орындалатын файлдары үшін қол жетімді.

Орындалуды басқару программа кодында көрсетілген пәрменге жеткеннен кейін бағдарлама кодының орындалуын үзу және жалғастыру мүмкіндігін білдіреді. Егер бағдарлама коды қадамдық режимде орындалса, программалау тілінің әрбір таңбалауышы үшін немесе ішкі бағдарламадан шыққан кезде үзіліс орын алады. Еркін орындауда орындау үзілістері кодтың алдын ала анықталған бөлімдерінде – тоқтау нүктелері орнатылған жерлерде орын алады.

Ядро режимінің кодын үзген кезде келесі дилемма туындайды. Түзеткіш бағдарламашымен әрекеттесу үшін пайдаланушы интерфейсін пайдаланады. Анау. кем дегенде отладчиктің көрінетін бөлігі пайдаланушы режимінде жұмыс істейді және оны құру үшін өз кезегінде ядро ​​режимінің модульдеріне сүйенетін қолданбалы бағдарламалау интерфейсін (Windows API) пайдаланады. Осылайша, ядро ​​режимінің кодын кідірту тығырыққа әкелуі мүмкін: жүйе пайдаланушы сұрауларына жауап беруді тоқтатады.

Ядро жадына қол жеткізу үшін отладчиктің бөліктері де ядро ​​режимінде жұмыс істеуі керек. Бұл бірден екі мәселеге әкеледі, бұл процессордың қорғалған режимінде жадты ұйымдастырудың айқын салдары.

Бірінші мәселе виртуалды жады мекенжайларын аударуға қатысты. Драйверлер жадына кіру арқылы пайдаланушы режиміндегі қолданбалармен үнемі өзара әрекеттеседі. Windows операциялық жүйесі виртуалды мекенжайларды ағын контекстінің тұжырымдамасына негізделген физикалық мекенжайларға аударады. Ағынның контексті - бұл ағынның күйін көрсететін құрылым және, атап айтқанда, регистрлер жиынын және кейбір басқа ақпаратты қамтиды. Басқару элементі басқа ағынға тасымалданған кезде контекстік қосқыш пайда болады, ол бір ағын туралы ақпаратты сақтайды және басқа туралы ақпаратты қалпына келтіреді. Ағынның мәтінмәні басқа процестің ағынына ауысқанда, виртуалды мекенжайларды физикалық мекенжайларға аудару үшін пайдаланылатын бет каталогы да ауысады.

Ерекшелігі, жүйелік қоңырауларды жіберу кезінде Windows операциялық жүйесі контекстті ауыстырмайды. Бұл ядро ​​режимінің кодына пайдаланушы режимінің виртуалды мекенжайларын пайдалануға мүмкіндік береді.

Үзілістерді жіберу немесе жүйелік ағындарды орындау кезінде жағдай басқаша. Үзіліс кез келген уақытта орын алуы мүмкін, сондықтан қандай ағын мәтіні пайдаланылатынын болжау мүмкін емес. Жүйе ағындары ешбір процеске жатпайды және пайдаланушы режимінің виртуалды мекенжайларын аудара алмайды. Бұл жағдайда пайдаланушы режимінің жадына кіру мүмкін емес.

Екінші мәселе - ауыстырылатын жадқа қол жеткізу. Жадтағы ақпараттың көпшілігі орнын ауыстырады және кез келген уақытта физикалық жадтан қатты дискіге беттік файлға көшіріледі. Физикалық жадта жоқ бетке қатынасу болса, процессор әдетте жад реттеушісімен өңделетін Бет ақауының үзілуін жасайды, нәтижесінде бет бет файлынан оқылады және физикалық жадқа жүктеледі.

Түзеткіш коды жоғары үзіліс сұрау деңгейлерін (IRQL) пайдалануға мәжбүр болса, бұл әрекет бұзылады. Егер IRQL жад менеджерінің IRQL-іне сәйкес келсе немесе асып кетсе, соңғысы жетіспейтін бетті жүктей алмайды, себебі операциялық жүйе Page Fault үзілуін блоктайды. Бұл операциялық жүйенің бұзылуына әкеледі.

Түзету әдетте интерактивті және төтенше жағдайға бөлінеді. Интерактивті жергілікті жөндеуде отладчик отладчикпен бірдей жүйеде жұмыс істейді. Интерактивті қашықтан жөндеуде отладчик және жөндеу мақсаты әртүрлі жүйелерде жұмыс істейді. Ядро кодын жөндеу кезінде жүйені желі әлі жұмыс істемей тұрған кезде жүктеудің бірінші кезеңдерінен бастап басқару керек, сондықтан жүйелер арасындағы байланыс үшін COM, FireWire, USB сияқты қарапайым сериялық интерфейстер қолданылады. Жақында абстракцияның әртүрлі деңгейлерінде бағдарламалық жасақтаманы виртуализациялаудың даму тенденцияларының арқасында виртуалды машиналар жиі қолданылуда. Қонақ ОЖ отладка ОЖ ретінде әрекет етеді, орналастырылған ОЖ отладчик пайдаланушы интерфейсін қамтиды.

Сондықтан төтенше жағдайды түзету үшін сынақ компьютерінде жөндеу құралының орнатылуын талап етпейді. Windows операциялық жүйесінің дистрибуциясы төтенше жағдайды түзетуді жүзеге асыру механизмдерін қамтиды. Қайта жүктеу алдында операциялық жүйе оның күйі туралы ақпаратты сақтай алады, оны әзірлеуші ​​талдап, себебін біле алады. Файлға сақталған мұндай ақпарат жад демпі деп аталады.

Негізгі ядро ​​режимін түзету құралдарын Windows операциялық жүйесінің өндірушісі Windows үшін еркін таратылған Debugging Tools бумасының бөлігі ретінде қамтамасыз етеді. Құралдарға сәйкесінше WinDbg және KD графикалық және консольдық жөндеушілер (бұдан әрі - Windows Debugger) кіреді. Бұл отладчиктердің жұмысы операциялық жүйені әзірлеушілер ұсынған және оның ядросына енгізілген механизмдерге негізделген.

Windows Debugger үшін негізгі режим пәрменді интерпретатор режимі болып табылады. Модульдік құрылымына байланысты Windows Debugger әзірлеуші ​​қамтамасыз ететін пәрмендерге қосымша кеңейтімдер деп аталатын үшінші тарап модульдерін қолдайды. Шындығында, кірістірілген пәрмендердің көпшілігі кеңейтімдер ретінде де жинақталған.

Windows Debugger қашықтағы интерактивті және төтенше жағдайды түзетуге бағытталған, ол пайдаланылған кезде оның барлық мүмкіндіктерін ашады. Бұл ретте толық жергілікті интерактивті жөндеуге қолдау көрсетілмейді: отладчик тек кейбір ядро ​​құрылымдарын көруге мүмкіндік береді.

Windows Debugger үшін Марк Руссинович жасаған LiveKD деп аталатын кеңейтім модулі бар, ол белгілі бір мағынада жергілікті интерактивті жөндеуді жүзеге асырады. LiveKD жұмыс жүйесінің жад демпін жылдам жасайды және оны жөндеу үшін пайдаланады.

Windows жүйесіне арналған Debugging Tools бумасы жүйелі түрде жаңартылып отырады және барлық заманауи Windows операциялық жүйелеріне қолдау көрсетеді.

DriverStudio бағдарламалық пакетінде Compuware шығарған SoftICE ядросының жөндеу құралы дәстүрлі түрде Windows жүйесіне арналған отладтау құралдары бумасына балама болды. SoftICE-тің айрықша ерекшелігі қолдау көрсетілетін аппараттық құралда жергілікті интерактивті жөндеуді жүзеге асыру болды. Түзеткіш операциялық жүйенің жұмысын толығымен дерлік басқара алады.

2006 жылғы 3 сәуірдегі жағдай бойынша DriverStudio өнімдер тобының сатылымы «әртүрлі техникалық және іскерлік мәселелерге, сондай-ақ жалпы нарықтық жағдайларға» байланысты тоқтатылды. Қолдау көрсетілетін амалдық жүйенің соңғы нұсқасы Windows XP Service Pack 2 болып табылады. Әдетте, қызмет бумалары амалдық жүйенің қолданба интерфейсін өзгертпейді, бірақ жүйенің қоңырау нөмірлері және басқа құжатталмаған ақпарат өзгеруі мүмкін. SoftICE жөндеу құралы ішкі деректер құрылымдарының қатты кодталған мекенжайларына сүйенді. Нәтижесінде 3 Service Pack шығарылымымен үйлесімділік бұзылды. Windows амалдық жүйесінің кейінгі нұсқаларына да қолдау көрсетілмейтіні анық.

Syser Kernel Debugger шағын қытайлық Sysersoft компаниясымен SoftICE отладчикінің орнына жасалған. Алғашқы соңғы нұсқасы 2007 жылы шығарылды. SoftICE сияқты, Syser Kernel Debugger жұмыс істеп тұрған жүйеде интерактивті жөндеуге қабілетті. Windows жүйесінің заманауи нұсқаларының тек 32 биттік басылымдарына қолдау көрсетіледі.

Қазіргі уақытта Windows Debugger ядро ​​модулін жасаушылардың негізгі құралы болып табылады. Оны Windows операциялық жүйесінің ядро ​​командасы да пайдаланады.

Бұл мақалалар сериясы екі себеппен пайда болды. Біріншіден, маған жобамен жұмыс істеген ұнайды HackSysExtremeVulnerableDriver. Екіншіден, мен алдым тілектер көпосы тақырыпты қамту үшін.

Бұл серияны жазуда қолданылған барлық код менің репозиторийімде.

Осы мақалалар сериясында біз Windows жүйесінде ядро ​​деңгейіндегі эксплуаттарды жазуды қарастырамыз. Айта кету керек, біз белгілі осалдықтармен айналысамыз және кері инженерия қажет емес (кем дегенде жүргізуші үшін).

Барлық мақалаларды оқығаннан кейін сіз осалдықтардың барлық кең таралған сыныптары мен пайдалану әдістерін білетін боласыз, сонымен қатар эксплойттерді x86 архитектурасынан x64 архитектурасына (мүмкіндігінше) порттауға және жаңа қорғау әдістерімен танысуға болады деп күтілуде. Windows 10 жүйесінде.

Ядро жөндеу тізбегі

Бір процестің орындалуын тоқтататын пайдаланушы деңгейіндегі жөндеуден айырмашылығы, ядро ​​деңгейіндегі жөндеу бүкіл жүйені қамтиды және біз бұл әдісті пайдалана алмаймыз. Тиісінше, ядро ​​түзетіліп жатқан жүйемен байланыса алатын, жад пен ядро ​​құрылымдарын көре алатын, сондай-ақ жүйенің бұзылуын ұстай алатын жеке жөндеу машинасы қажет.

Оқуға арналған қосымша материал:

Ядроның осалдықтарын пайдалану

Бұл процесс J пайдаланушы деңгейінде жұмыс істеуге қарағанда әлдеқайда қызықты.

Негізгі мақсат - ядро ​​контекстінде артықшылықты орындауға қол жеткізу. Содан кейін бәрі біздің қиялымызға байланысты, үй сырасы бар мерекеден бастап мемлекет демеушілік ететін зиянды бағдарламаны енгізуге дейін.
Жалпы, біздің міндетіміз жүйелік артықшылықтарға ие қабық алу.

Осы сериядағы мақалалардың тақырыптары

  • 1-бөлім: Жұмыс ортаңызды орнату
    • Үш виртуалды машинаны және жөндеуші ретінде әрекет ететін жүйені конфигурациялау.
    • WinDBG жөндеу құралын конфигурациялау.
  • 2-бөлім: Пайдалы жүктемелер
    • Ең көп таралған пайдалы жүктемелерді зерттеңіз. Келесі бөліктер арнайы осалдықтарды қарастырады және қажет болған жағдайда осы мақалаға сілтемелер береді.
  • Қалған бөліктер.
    • Осалдықтарды ескеру.

Ядро эксплуатының дамуының өмірлік циклі

  • Осалдықты табу. Бұл тақырып осы серияда талқыланбайды, өйткені біз олқылықтардың қай жерде екенін қазірдің өзінде білеміз.
  • Орындау ағынын тоқтату. Кейбір осалдықтар кодты орындауды қамтиды, ал кейбіреулерінде қосымша талаптар бар.
  • Артықшылықты арттыру. Негізгі мақсат - жүйелік артықшылықтарға ие қабық алу.
  • Орындау ағынын қалпына келтіру. Ядро деңгейінде белгіленбеген ерекшеліктер жүйенің бұзылуына әкеледі. Егер сіз DoS шабуылына эксплойт жазуды жоспарламасаңыз, бұл фактіні ескергеніңіз жөн.

Мақсатты жүйелердің түрлері

Біз келесі жүйелердегі осалдықтармен жұмыс істейміз (нақты нұсқа маңызды емес):

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

x86 архитектурасынан бастайық, содан кейін біз Win7 x64 жүйесі үшін эксплойтты портқа шығарамыз. Жаңа қорғаныстардың болуына байланысты кейбір эксплойттар Win10 машиналарында жұмыс істемейді. Бұл жағдайда біз эксплуатация логикасын өзгертеміз немесе мүлдем басқа тәсілді қолданамыз.

Қолданылатын бағдарламалық құрал:

  • Гипервизор (опциялар көп).
  • Windows 7 x86 VM
  • Windows 7 x64 VM
  • Windows 10 x64 VM

Түзету жүйелерін орнату

Біз өзара әрекеттесетін жөндеу жүйелері осал драйверді жүктеуге арналған. Бұл машиналар жиі бұзылады, өйткені ядродағы ерекше жағдайлардың көпшілігі құбылыстың осы түріне ықпал етеді. Бұл жүйелер үшін жеткілікті жедел жадты бөлу керек.

Түзетілетін әрбір құрылғыда келесі әрекеттерді орындау керек:

  • VirtualKD каталогының ішінде target\vminstall.exe файлын іске қосыңыз. Жаңа жүктеу жазбасы қосылады және жөндеу функциялары қолжетімді болады және жүйеде жөндеуші ретінде әрекет ететін VirtualKD серверіне орнатылған автоматты қосылым болады.

Windows 10 VM жағдайында, ядроға қол қойылмаған драйверлерді жүктеуге мүмкіндік беретін сынақ қол қою режимін қосу керек.

bcdedit /set testing on пәрменін іске қосып, қайта жүктегеннен кейін жұмыс үстелінде «Тест режимі» пайда болады.

HEVD модулінің қысқаша сипаттамасы

DriverEntry процедурасы әрбір драйвер үшін іске қосу процедурасы болып табылады:

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath IN) (
UINT32 i = 0;
PDEVICE_OBJECT DeviceObject = NULL;
NTSTATUS күйі = STATUS_UNSUCCESSFUL;
UNICODE_STRING DeviceName, DosDeviceName = (0);

UNREFERENCED_PARAMETER(RegistryPath);
PAGED_CODE();

RtlInitUnicodeString(&DeviceName, L"\\Device\\HackSysExtremeVulnerableDriver");
RtlInitUnicodeString(&DosDeviceName, L"\\DosDevices\\HackSysExtremeVulnerableDriver");

//Құрылғыны жасаңыз
Күй = IoCreateDevice(DriverObject,
0,
&Құрылғы атауы,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
ЖАЛҒАН,
&DeviceObject);

  • Бұл процедура IoCreateDevice функциясына шақыруды қамтиды, ол байланыс кезінде біз пайдаланатын драйвердің атын қамтиды.
  • Қажетті құрылымдар мен функция көрсеткіштері DriverObject нысанына қосылады.
  • Біз үшін маңыздысы DriverObject->MajorFunction процедурасымен байланысты функция көрсеткіші болып табылады, ол IOCTL (I/O Control) өңдеуге жауап береді;
  • HEVD жүйесінде бұл функция IrpDeviceIoCtlHandler деп аталады, ол әрбір IOCTL үшін көптеген тармақтары бар үлкен шартты өрнек болып табылады. Әрбір осалдықтың бірегей IOCTL бар.

Мысал: HACKSYS_EVD_IOCTL_STACK_OVERFLOW - стектің толып кетуін іске қосу үшін пайдаланылатын IOCTL.

Осымен бірінші бөлім аяқталады. Келесі мақалада пайдалы жүктемелер туралы айтатын боламыз. Қазіргі уақытта қол жетімді жалғыз пайдалы жүктеме - үшінші бөлікте қолданылатын белгілерді ұрлауға арналған.

P.S. Түсінемін, сізде көптеген қиындықтар мен қиындықтар туындауы мүмкін. Бұл серия эксплуаттарды дамытуға бағытталғандықтан, барлық байланысты мәселелерді өзіңіз шешуге тура келеді. Дегенмен, сіз кез келген сұрақтарыңызды түсініктемелерде қоя аласыз.

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.

Ескерту: yURPMSHHKFE LPNBODH дампон (8) DMS KHLBBOYS SDTH NEUFB, ZDE OHTsOP UPITBOSFSH BCHBTYKOSHCHE DBNRSCH. rPUME OBUFTPKLY RP LPNBODE свопон (8)ТБДЕМБ РПДЛБҰЛЫ ДПМЦОБ ВШФШ ЧШЧБОБ РТПЗТБНННБ думпон. пВШЮОП ЛФП CHSHRPMOSEPHUS ЪБДБОЙЕН РЕТЕНОООПК думпдев Ч ЖБКМЕ rc.conf (5). еUMY ЪБДБОБ ьФБ 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 қоқыс CH UFTPLE конфигурациясы LPOZHYZHTBGYPOOPZP ZHBKMB CHBYEZP SDTB. fBLPK URPUPV YURPMSHЪPCHBFSH OE TELPNEODHEFUS Y БОЙЫНША DPMTSEO YURPMSHЪPCHBFSHUS, FPMSHLP EUMY CHSCH IPFYFE RPMKHYUBFSH BCHBTYKOSHCH PVTBSCH RBNSFY SDTB, LPFCHBTYBBEPPЪBBCHBCHPTYПЪБ ZTHЪLE.

Ескерту: dBMEE FETNYO gdb PYOBYUBEF PFMBDYUYL gdb , ЪBRHEEOOSCHK CH ``TETSINE PFMBDLY SDTB". RETEIPD CH LFPF TETSIN DPUFYZBEFUS ЪBRHULPN gdb U RBTBNEFTPN -k . h TETSYNE PFMBDLY SDTB gdb YЪNEOSEF UCHPЈ RTYZMBYEOYE ТУРАЛЫ (kgdb) .

Кеңес: eUMY CHSH YURPMSHJHEFE FreeBSD CHETUYY 3 YMY VPMEE TBOOAA, CHCH DPMTSOSCH CHSHRPMOYFSH HUEYEOYE PFMBDPUOPZP SDTB LPNBODPK жолағы, B OE KHUFBOBCHMYCHBFSH VPMSDPUSHYPE:

# cp kernel kernel.debug # strip -g ядросы

bFPF YBZ OE FBL HC Y OEPVIPDYN, OP TELPNEODKHEN. (PH FreeBSD 4-ші VPMEE TEMYYBI LFPF YBZ CHSPRMOSEFUS BCHFPNBFYUEULY CH LPOGE RTPGEUUB RPUFTPEOOYS SDTB жасау.) lPZDB SDTP HUEYEOP, BCHFPNBFYUEULY YMY RT YPNSECHYHB FSH EZP PVSHCHYUOSCHN PVTBBPN, OVTTBCH орнатуды жасайды.

ъBNEFSHFE, YuFP CH UFBTSHCHETUISI FreeBSD (DP 3.1, OE CHLMAYUBS LFPF TEMY), YURPMSHHEFUS SDTB CH ZHTNBFE a.out, RPFPNH YI RBVMYGSH UYNCHPMPCH DPMTSOSCHFB TBNSSOSCHFBTBPSOCHPBFMBFMBFU. 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 TBVPFBFSH UTTHPTCHOPSHNY, ОПНХ ЖОЛГЫПОЙТПЧБОЯ, ЪБЗТХЦБКФЕ ЭЗП ФПМШЛП Ч ПДОПРПМШЪПЧБФЭМШУЛПН ТЕЦЫНЕ РТЫ РПНПЕЙ ЖМБЗБ -с , ХЛБСЧБЕНПЗП РТЫ ЪБЗТХ ЖЛЕ, B ЪBFEN CHSHRPMOYFE FBLYE YBZY:

# fsck -p # mount -a -t ufs # осылайша /var/crash файлдық жүйеңіз жазылады # savecore -N /kernel.panicked /var/crash # exit # ...көп пайдаланушыға

bFB RPUMEDPCHBFEMSHOPUFSH KHLBSCCHBEF RTPZTBNNE savecore (8) YURPMSHЪPCHBOYE DTHZPZP SDTB DMS YЪCHMEYUEOYS UYNCHPMYUEULYI YNEO ТУРАЛЫ. YOBYUE POB VKhDEF YURPMSHЪPCHBFSH SDTP, TBVPFBAEE CH DBOOSHK NNEOF Y, ULPTEE CHUEZP, OYUEZP OE UDEMBEF, RPFPNH YuFP BChBTYKOSHCHK PVTB RBNSFY YYNTBSHPMSFYYNTBSHPMSFY.

b FERETSH, RPUME UVTPUB BCHBTYKOPZP DBNRB, RETEKDYFE CH LBFBMPZ /sys/compile/НАЙСЫЗ Y ЪBRKHUFYFE LPNBODH gdb -k . yЪ RTPZTBNNSH gdb UDEMBKFE CHPF SFP:

Symbol-file kernel.debug exec-file /var/crash/kernel.0 core-file /var/crash/vmcore.0 Y CHBMS - CHCH NPTSEFE PFMBTSYCHBFSH BCHBTYKOSHK DBNR, YURPMSHЪHS YUIPDOSCH FFELUFBLSCHPBLSCHFE, AT MAVPC DTHZPK RTPZTBNNPK.

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

1: Скрипт 1994 ж. 30 желтоқсан 23:15:22 басталды 2: # cd /sys/compile/URIAH 3: # gdb -k ядросы /var/crash/vmcore.1 4: /usr/src/ ішінен таңба деректерін оқу sys/compile/URIAH/ядро ...орындалды. 5:IdlePTD 1f3000 6: дүрбелең: өйткені сіз айттыңыз! 7:1e3f70-дегі ағымдағы PCB 8: ../../i386/i386/machdep.c үшін таңбалармен оқу... орындалды. 9: (kgdb) мұнда 10:#0 жүктеу (arghowto=256) (../../i386/i386/machdep.c жол 767) 11:#1 0xf0115159 дүрбелеңде () 12:#2 0xf01955bd (өлген) ) (../../i386/i386/machdep.c жолы 698) db_fcall ішіндегі 13:#3 0xf010185e () 14:#4 0xf0101586 db_command (-266509132, -21615 f0101711 db_command_loop () 16:#6 0xf01040a0 in db_trap () 17:#7 0xf0192976 in kdb_trap (12, 0, -272630436, -266743723) 18:#1902 trap... f 019ce60 дюйм trap_pfault (...) 20:#10 0xf019cb2f in trap (...) 21:#11 0xf01932a1 ерекшелікте:calltrap () 22:#12 0xf0191503 cnopen (...) 23:#13 2opc301 (спец) 24: #14 0xf012d014 вn_open () 25:#15 0xf012a183 ашық () 26:#16 0xf019d4eb жүйеде (...) 27: (kgdb) жоғары 10 28:.3/6 үшін таңбаларды оқу. /i386 /trap.c...орындалды. 29:#10 0xf019cb2f тұзақта (frame=(tf_es = -260440048, tf_ds = 16, tf_\ 30:edi = 3072, tf_esi = -266445372, tf_eb3 = -026, tf_eb3 = -026, 0396, tf_ebx = - 266427884, tf_edx = 12, tf_ecx = -266427884, tf\ 32:_eax = 64772224, tf_trapno = 12, tf_err = -272695296, -272695296, tf_63s =_63f 2664693 68, tf_eflags = 66066, tf_esp = 3072 , tf_\ 34:ss = -266427884)) (../../i386/i386/trap.c 283-жол) 35:283 (жарамсыз) trap_pfault(&frame, FALSE); 36: (kgdb) жақтау жақтауы->tf_ebp жақтау->tf_eip 37: ../../i386/isa/pcvt/pcvt_drv.c үшін таңбаларды оқу... орындалды. 38:#0 0xf01ae729 pcopen (dev=3072, flag=3, mode=8192, p=(struct p\ 39:roc *) 0xf07c0c00) (../../i386/isa/pcvt/pcvt_drvc. 403) 40:403 қайтару ((*linesw.l_open)(dev, tp)); 41: (kgdb) тізім 42:398 43:399 tp->t_state |= TS_CARR_ON; 44:400 tp->t_cflag |= CLOCAL; /* модем бола алмайды (:-) */ 45:401 46:402 #if PCVT_NETBSD || (PCVT_FREEBSD >= 200) 47:403 қайтару ((*linesw.l_open)(dev, tp)); 48:404 #else 49:405 қайтару ((*linesw.l_open)(dev, tp, flag)); 50:406 #endif /* PCVT_NETBSD || (PCVT_FREEBSD >= 200) */ 51:407 ) 52: (kgdb) басып шығару tp 53: ../../i386/i386/cons.c...орындалды. 54:$1 = (struct tty *) 0x1bae 55: (kgdb) tp->t_line 56 басып шығару:$2 = 1767990816 57: (kgdb) жоғары 58:#1 0xf0191503 cnopen (dev=0x0002 = 0x008), , p=(st\ 59:ruct proc *) 0xf07c0c00) (../../i386/i386/cons.c 126-жол) 60: қайтару ((*cdevsw.d_open)(dev, жалауша, режим, p) ); 61: (кгдб) жоғары 62:#2 0xf0132c34 spec_open () 63: (kgdb) жоғары 64:#3 0xf012d014 vn_open () 65: (кгдб) жоғары 66:#4 0xf012a186 дюйм ()кгd) ашық жоғары 68:#5 0xf019d4eb жүйе шақыруында (frame=(tf_es = 39, tf_ds = 39, tf_edi =\ 69: 2158592, tf_esi = 0, tf_ebp = -272638436, tf_02, tf_7f 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 = 582, tf_62, _ 582 ss = 39)) (. ./../i386/i386/trap.c 673-жол) 73:673 қате = (*callp->sy_call)(p, args, rval); 74: (kgdb) жоғары 75: Бастапқы кадр таңдалды; жоғары көтеріле алмайсың. 76: (kgdb) шығу 77: # exit 78:exit 79: 80: скрипт 1994 ж. 30 желтоқсан 23:18:04 ж. орындалды.

lPNNEOFBTYY L ЧШЧЫЕРТЫЧЕДЕООПНХ ТШТОБМХ:

UFTPLB 6:

ьФП DBNR, CHSFSHCHK RTY RPNPEY DDB (UNPFTY OITSE), RPPFPNH LPNNEOFBTYK L BCHBTYKOPNH PUFBOPCHH YNEEF YNEOOP CHYD ``Сіз айтқаныңыз үшін!'' Y FTBUUYTPCHLB UFELB; PDOBLP YOBYUBMSHOPK RTYYUYOPK RETEIPDB CH DDB VSHMB BCHBTYKOBS PUFBOPCHLB RTY ЧПОЙЛОПЧЕОЯ ПЫЙВЛЫ UFTBOIGSC RBNSFY.

UFTPLB 20:

lFP NEUFPOBIPTSDEOOYE ZHOLGYY trap() CH FTBUUYTPCHLE UFELB.

UFTPLB 36:

rTYOKHDIFEMSHOPE YURPMSHЪPCHBOIE OPChPK ZTBOYGSCH UFELB; FERTSH LFP OE OHTSOP. rTEDRPMBZBEFUS, YuFP ZTBOYGSCH UFELB KHLBSCCHBAF RTBCHYMSHOP TBURPMPTSEOYE ТУРАЛЫ, DBCE CH UMHUBE BCHBTYKOPZP PUFBOPCHB. zMSDS ТУРАЛЫ UFTPLH YUIDOPZP LPDB 403, NPTsOP ULBBFSH, YuFP CHEUSHNB CHETPSFOP, YuFP MYVP CHYOPCHBF DPUFHR RP KHLBBFEMA ``tp"", MYVP VSHM CHSHCHUBYB.

UFTPLB 52:

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

UFTPLB 56:

pDOBLP, PYUECHYDOP, UFP ON KHLBSCCHBEF туралы 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 DPUFBFPEUMPEUYu.)

«Ядроны жөндеу» термині ядроның ішкі деректер құрылымын зерттеуді және/немесе ядродағы функцияларды кезең-кезеңмен қадағалауды білдіреді. Бұл жөндеу Windows жүйесінің ішкі жұмысын тексерудің өте пайдалы әдісі болып табылады, себебі ол басқа құралдарды пайдалану арқылы қолжетімсіз ішкі жүйелік ақпаратты көрсетуге мүмкіндік береді және ядродағы кодтың орындалу барысының нақты бейнесін береді.

Ядроны жөндеудің әртүрлі жолдарын қарастырмас бұрын, кез келген жөндеу түрін орындау үшін қажет файлдар жинағын қарастырайық.

Ядро жөндеуге арналған белгілер

Символдық файлдарда функциялар мен айнымалылардың атаулары, сондай-ақ деректер құрылымдарының орналасуы мен пішімі бар. Олар сілтеме бағдарламасы арқылы жасалады және жөндеушілер осы атауларға сілтеме жасау үшін және оларды жөндеу сеансы кезінде көрсету үшін пайдаланады. Бұл ақпарат әдетте екілік кодта сақталмайды, себебі код орындалған кезде қажет емес. Бұл онсыз екілік код кішірейіп, жылдамырақ жұмыс істейтінін білдіреді. Бірақ бұл сонымен қатар отладтау кезінде отладчиктің отладтау сеансы кезінде сілтеме жасалған екілік кескіндермен байланысты таңба файлдарына қатынасы бар екеніне көз жеткізу керек дегенді білдіреді.

Windows ядросының деректер құрылымының ішкі бөліктерін (процестер тізімі, ағын блоктарының тізімі, жүктелген драйверлер тізімі, жадты пайдалану ақпараты және т.б.) тексеру үшін кез келген ядро ​​​​режимін түзету құралын пайдалану үшін сізге дұрыс таңба файлдары қажет және: минимум, ядроның екілік кескіні үшін символдық файл - Ntoskrnl.exe. Таңбалар кестесінің файлдары олар шығарылған екілік кескіннің нұсқасына сәйкес келуі керек. Мысалы, Windows қызмет бумасын немесе ядроны жаңартатын патчтың қандай да бір түрін орнатқан болсаңыз, таңба файлдарын сәйкесінше жаңартуыңыз қажет.

Windows жүйесінің әртүрлі нұсқалары үшін таңбаларды жүктеп алу және орнату оңай, бірақ патчтар үшін таңбаларды жаңарту әрқашан мүмкін емес. Түзетуге арналған таңбалардың қажетті нұсқасын алудың ең оңай жолы – отладчикте көрсетілген таңба жолы үшін арнайы синтаксисті пайдаланып, осы мақсат үшін арнайы әзірленген Microsoft символдық серверіне хабарласу. Мысалы, келесі таңба жолы жөндеу құралдарының таңбаларды онлайн таңба серверінен жүктеп алуына және жергілікті көшірмені c:\symbols:srv*c:\symbols*http://msdl.microsoft.com/download/ ішінде сақтауға себеп болады. символдар

Таңба серверін пайдалану бойынша толық нұсқауларды жөндеу құралдарының анықтамалық файлында немесе http://msdn.microsoft.com/en-us/windows/hardware/gg462988.aspx сайтында табуға болады.

Ядро жөндеуші қалай іске қосылады?

Магистрдің жауабы:

Бағдарламалық жасақтаманы әзірлеу процесінде өте маңызды бір компонент бар - жөндеу. Қолданбалы бағдарламаларға қатысты ол пайдаланушы режимінде жұмыс істейтін және көбінесе IDE-ге кіріктірілген құралдар арқылы жүзеге асырылады. Мысалы, драйверлерді жөндеу мүмкіндігін алу үшін ядроны жөндеу құралын іске қосу керек.

cmd пәрмен процессорын іске қосу керек. Тапсырмалар тақтасындағы Бастау мәзірін ашыңыз. Пайда болған терезеде «Іске қосу...» элементін басыңыз. «Бағдарламаны іске қосу» терезесі пайда болады. Мәтін өрісіне cmd енгізіңіз, содан кейін OK түймесін басыңыз.

Енді boot.ini файлының сақтық көшірмесін жасаңыз. Алдымен, Windows жүйесінің ағымдағы көшірмесін орнату жолын мына пәрмен арқылы табыңыз: echo %SystemRoot%

Содан кейін құрылғының әріптерін, содан кейін қос нүктені енгізу арқылы орнатылған операциялық жүйесі бар дискіге өтіңіз. CD командасын пайдаланып, түбірлік каталогқа өтіңіз. Енді attrib пәрменін пайдаланып, boot.ini файлынан «жасырын», «тек оқуға арналған» және «жүйе» атрибуттарын жойыңыз. Сақтық көшірме жасау үшін көшіру пәрменін пайдаланыңыз, содан кейін төлсипаттарды орнына орнатыңыз.

Жүктеу опцияларының ағымдағы тізімін көрсету үшін bootcfg /query пәрменін пайдаланыңыз. Тізімді қарап шығыңыз және ядро ​​режимінде жөндеу мүмкіндігімен жаңа параметрлер жасалатын элементті анықтаңыз. Жүктеу жазбасының идентификаторын есте сақтау керек.

Жүктеу жазбасын жасау үшін bootcfg/copy пәрменін пайдаланыңыз. Көшіретін жазбаның идентификаторын көрсету үшін /id параметрін пайдаланыңыз. /d опциясын пайдаланып, көрсетілетін жазбаның атын көрсетіңіз. Енді bootcfg /query пәрменін пайдаланып жүктеу опцияларының тізіміне оралып, қосылған жазбаның идентификаторын қарау керек.

Енді сіз бұрын жасалған жүктеу жазбасында ядро ​​түзеткішін іске қосу опцияларын қосуыңыз керек. Егер сіз мақсатты құрылғыда отладка жасайтын болсаңыз, сізге /debug опциясын қосу жеткілікті.

Егер мақсатты компьютерді com порты арқылы хост құрылғысына қосу арқылы қашықтан жөндеуді орындағыңыз келсе, порт нөмірін және жіберу жылдамдығын көрсету үшін /port және /baud опцияларын пайдаланыңыз.

FireWire кабелі (IEEE 1394 интерфейсі) арқылы қашықтан жөндеуді орындайтын болсаңыз, сәйкес режимді қосу үшін /dbg1394 опциясын және арна нөмірін көрсету үшін /ch опциясын пайдаланыңыз.

Өзгерістер енгізілгеніне көз жеткізу үшін /query параметрімен bootcfg пәрменін пайдаланып жүктеу файлдарын тексеріңіз. Шығу пәрменін орындағаннан кейін қабық терезесін жабыңыз.

Қажет болса, операциялық жүйені жүктеу параметрлерін өзгертіңіз. Бастау мәзірі арқылы Басқару тақтасын ашыңыз және онда Жүйе элементін ашыңыз. Ашылған «Жүйе сипаттары» терезесінде «Қосымша» қойындысын таңдаңыз. Бұл қойындыда «Жүктеу және қалпына келтіру» деп аталатын бөлімді таңдап, «Параметрлер» түймесін басыңыз. Пайда болған «Жүктеу және қалпына келтіру» терезесінде «Операциялық жүйелер тізімін көрсету» опциясын белсендіру керек. Екі тілқатысу терезесін OK түймешігімен жабыңыз.

Компьютеріңізді қайта іске қосыңыз. Түзеткішпен жүктеуді таңдаңыз. Жүйеге кіріп, мақсатты құрылғыда жұмыс істей бастаңыз немесе қашықтан жөндеуді бастаңыз. WinDbg және KD сияқты құралдарды пайдаланыңыз.