Процес завантаження операційної системи починається з. Завантаження операційної системи. Ініціалізація системи засобами BIOS

При включенні живлення комп'ютера керування передається базовій системі вводу/виводу, BIOS.Вона виконує перевірку апаратних вузлів комп'ютера, формує початкову частину таблиці векторів переривань, ініціалізує пристрої та починає процес завантаження операційної системи.

Завантаження починається з того, що BIOS робить спробу прочитати перший сектор дискети, вставленої в дисковод А: (на завантажувальній дискеті цей сектор містить завантажувач операційної системи). Якщо в дисковод вставлено системну дискету, з неї зчитується завантажувач і йому передається керування.

Якщо дискета системна, тобто. не містить завантажувального запису, на екран видається повідомлення із проханням замінити дискету.

Якщо дискети в дисководі А: взагалі немає, то BIOS читає основний завантажувальний запис диска С: (Master Boot Record). Зазвичай це перший сектор на диску. Керування передається завантажувачу, який знаходиться у цьому секторі. Завантажувач аналізує вміст таблиці розділів (вона також знаходиться в цьому секторі), вибирає активний розділ та читає завантажувальний запис цього розділу. Завантажувальний запис активного розділу (Boot Record) аналогічний до завантажувального запису, що знаходиться в першому секторі системної дискети.

Завантажувальний запис активного розділу зчитує з диска файли IO.SYS та MSDOS.SYS (саме у цьому порядку). Потім зчитуються та завантажуються резидентні драйвери. Починається формування пов'язаного списку драйверів пристроїв. Аналізується вміст файлу CONFIG.SYS, завантажуються драйвери, описані в цьому файлі. Спочатку завантажуються драйвери, описані параметром DEVICE, потім (тільки в MS-DOS версії 4.х та 5.0) резидентні програми, вказані операторами INSTALL. Після цього зчитується командний процесор і передається управління.

Командний процесор складається з трьох частин - резидентної, ініціалізованої та транзитної. Першою завантажується резидентна частина. Вона обробляє переривання INT 22H, INT 23H, INT 24H, керує завантаженням транзитної частини. Ця частина командного процесора обробляє помилки MS-DOS і запитує користувача про дії для виявлення помилок.

Ініціалізуюча частина використовується лише в процесі завантаження операційної системи. Вона визначає початкову адресу, за якою завантажуватиметься програма користувача та ініціалізує виконання файлу AUTOEXEC.BAT.

Транзитна частина командного процесора розміщується у старших адресах пам'яті. У цій частині знаходяться обробники внутрішніх команд MS-DOS та інтерпретатор командних файлів із розширенням імені.BAT. Транзитна частина видає системне запрошення (наприклад, А:), очікує введення команди оператора з клавіатури або з пакетного файлу та організує їх виконання.

Після завантаження командного процесора та виконання початкових процедур, перерахованих у файлі AUTOEXEC.BAT, підготовка системи до роботи завершується.

1.3. Загальна схема роботи dos

Для того щоб правильно працювати з системним програмним та апаратним забезпеченням, потрібно чітко уявляти механізм взаємодії прикладної програми з комп'ютером. На рис. 1.1 показані функціональні зв'язки програми із програмно-апаратним забезпеченням IBM PC.

Рис.1. Функціональні зв'язки програми для MS-DOS із програмно-апаратним забезпеченням ПЕОМ

Як правило, ядро ​​DOS поділяють на кілька підсистем, кожна з яких відповідає за виконання тієї чи іншої задачі. Як показано малюнку, зазвичай виділяються такі підсистеми:

    файлова система;

    система керування пам'яттю;

    система керування програмами;

    система зв'язку з драйверами пристроїв;

    система обробки помилок;

    службу часу;

    систему введення/виведення консолі оператора.

Ці підсистеми спілкуються з апаратурою через BIOS, драйвери чи безпосередньо. Прикладне програмне забезпечення може викликати підсистеми DOS, працювати з BIOS або безпосередньо з апаратурою. Зверніть увагу на те, що прикладні програми можуть звертатися до драйверів тільки через відповідну підсистему DOS.

Очевидно також, що чим вищий рівень інтерфейсу прикладної програми та апаратури, тим менше програма залежатиме від особливостей апаратури.

Розглянемо підсистеми DOS окремо.

А ви ніколи не замислювалися над тим, що відбувається з операційною системою в той момент, коли вона малює свій логотип і говорить «Starting Windows»? І взагалі, чому вона довго завантажується? Адже при старті системи точно не вирішуються ніякі завдання, складні з обчислювальної точки зору!

Що тоді має на увазі під собою завантаження операційної системи? Здебільшого це проектування на згадку виконуваних модулів та ініціалізація службових структур даних. Структури даних живуть у пам'яті, тому операції з ними за ідеєю мають бути швидкими. Все наштовхує на думку про те, що час з'їдається саме процесом завантаження виконуваних модулів на згадку.

Зацікавимося розберемося, які модулі, в якій кількості і в якому порядку завантажуються при старті ОС. Щоб з'ясувати це, можна, наприклад, отримати лог завантаження системи. Піддослідна ОС у моєму випадку – Windows 7 Enterprise x64. Логуватимемо процес завантаження за допомогою відладчика ядра. Існує кілька варіантів відладчиків ядра, особисто я віддаю перевагу WinDbg. Також нам знадобляться деякі допоміжні засоби для чарівного перетворення ліг на щось приємніше для ока.

Mining and crafting

Налаштування налагодження добре гуглиться, тому докладно описувати цей процес я не буду. Оскільки нас цікавить все, що відбувається з моменту старту системи, нам потрібно відзначити пункт Cycle Initial Break, за допомогою чого відладчик зупиниться, як тільки в системі, що налагоджується, буде завантажена підсистема налагодження ядра. Дублювання виведення у файл можна здійснити за допомогою команд ".logopen" та ".logclose", це просто. Інша корисна команда – ".cls". Вона очищає екран команд, і так, лише екран команд.

Цікава для нас функція - «MiCreateImageFileMap». Це внутрішня функція менеджера пам'яті, що проеціює файл, що виконується в пам'ять. Проеціювання в пам'ять відбувається при створенні секції, наприклад, при запуску файлу, що виконується. Однак врахуйте, що якщо файл, що виконується, проектується в пам'ять, це не гарантія того, що буде виконано його код! Ця функція просто створює проекцію, найчастіше про запас, щоб, якщо хтось надумає запустити модуль на виконання, можна було заощадити час його завантаження. На цю функцію поставимо логіруючу точку зупинки.

Якщо ви маєте достатньо мани, вводьте наступну команду:
bu nt!MiCreateImageFileMap "dt nt!_EPROCESS -d ImageFileName @$proc; dt nt!_FILE_OBJECT -d FileName @rcx; g"
Магічний рядок буквально означає наступне:

  • bu (Set Unresolved Breakpoint) - встановити невирішену точку зупинки. Не те, щоб хтось або щось не дозволяв, просто для її встановлення необхідно визначитися, за якою адресою її ставити. Справа в тому, що заздалегідь не відомо, за якою адресою вона має розташовуватися. При завантаженні будь-якого модуля перевіряється наявність у ньому необхідної функції, і якщо така функція знайдена, точка зупинки встановлюється автоматично. Такий спосіб установки незамінний при включеному ASLR - рандомізації адресного простору, оскільки модулі будуть завантажуватися щоразу за різними адресами, і точка зупинки, встановлена ​​за фіксованою адресою, з великою ймовірністю виявиться не при справах.
  • nt!MiCreateImageFileMap - символ, на якому потрібно зупинятися. У WinDbg прийнято запис у формі "module_name!function_name". В даному випадку nt є певним псевдонімом для ntoskrnl.exe.
  • Далі слідує частина WinDbg-скрипта, яка буде виконуватися щоразу при зупинці цієї функції. "dt nt!_EPROCESS -d ImageFileName @$proc" російською означає "відобразити поле ImageFileName структури _EPROCESS з модуля nt за умови її відображення за адресою, визначеною в псевдореєстрі "поточний процес"". Наступна після роздільника ";" команда означає приблизно те саме, тільки адреса структури береться з регістра rcx, в якому в Microsoft x64 ABI передається перший параметр функції. "g" означає "go", тобто. продовжити виконання.

Невелика рекомендація щодо використання логуючих точок зупинки: намагайтеся не використовувати розширення відладчика (команди, що починаються з "!"), оскільки в такому разі логування виконуватиметься на порядок повільніше.

Поїхали! Віджимаємо гальмо точки зупинки і чекаємо. Я чекав, доки провантажиться робочий стіл, тобто. я залогінився. Отриманий «урожай» трохи редагується, обрізається все зайве для зручності подальшої обробки та згодовується товариш пітону. Не загострюватимемо увагу на парсингу лога. Зазначимо лише, що граф укладався у форму спіралі Архімеда з подальшою корекцією вручну, оскільки відбувалося накладення вузлів один на одного. В отриманому графі враховується порядок завантаження бібліотек. На жаль, довелося пожертвувати враховуючи порядок завантаження файлів, що виконуються, щодо бібліотек для зручності читання графа.

Карта зоряного неба


Умовно виділимо кілька груп завантаження.

Починається робота OC у модулі ntoskrnl.exe, що є ядром ОС. А якщо ще конкретніше – з функції KiSystemStartup(). Разом із завантажуваними системними компонентами вона формує фундамент ОС: поділ режимів роботи, базові сервіси для додатків користувача і т.п. У цю групу входять драйвери, відзначені для завантаження під час старту системи. У двох словах, у цій черепашці зароджується ОС Windows.

Наступний вузол – менеджер сесій (session manager). Його представляє перший після системного процес, що стартує у Windows – smss.exe. Процес примітний тим, що є рідним (native) процесом Windows, тобто він не використовує підсистему Win32, яка ще не завантажена. Цей процес використовує лише нативні сервіси операційної системи за допомогою ntdll.dll, що є інтерфейсом режиму користувача для сервісів ОС. Також цей процес є довіреним компонентом операційної системи і має виняткові права, наприклад, він може створювати маркери безпеки (security tokens). Але головне його призначення - створення сеансів та ініціалізація підсистем як графічної, так і різних виконуваних (Windows, POSIX). Ця черепашка віддає кожному за потребами.

Група входу до системи (logon) складається з кількох процесів. Загалом вони відповідають за ініціалізацію сеансів. Це включає відображення екрана вітання, створення робочих столів, запуск процесів автозавантаження та ініціалізацію підсистеми безпеки тощо. Цей віник відкидає всіх сторонніх.

Найпотужнішою виявилася група сервісів. Багато в чому вона завдячує своїм обсягом службі SuperFetch. Ця та сама, про яку говорять, що вона у вихідні заздалегідь провантажує офісний пакет, а на початку робочого тижня - Steam з іграшками. Superfetch провантажує величезну кількість модулів при старті системи, щоб потім все швидше працювало. Та й крім нього в системі вистачає сервісних додатків і драйверів, що автозапускаються. Думаю, всі бачили оснащення «Служби та програми». Ця зірка життя заводить у системі все, що потрібно і не дуже.

Останнім відзначу улюблений усіма explorer.exe. Примітно, що до моменту його запуску всі модулі, що використовуються, вже завантажені в пам'ять. У скріншот також потрапив якийсь vcredist_x64.exe - бідолаха лежав на робочому столі піддослідної віртуальної машини і був провантажений на згадку провідником.

Взагалі способів виявитися завантаженим на згадку у модуля багато. Наприклад, достатньо запитати інформацію з ресурсів файлу, в тому числі його іконку. Саме цьому прикладі провідник перевіряв, чи є ця програма потребує підвищених привілеїв, тобто. чи варто домальовувати до іконки відповідний малюнок із жовто-блакитним щитом. Ще раз зазначу, що завантаження модуля на згадку не означає виконання його коду!

Особисто я тримаю картинку під боком. Нею добре простежуються залежності, наприклад, драйверів. Також у парі з утилітою Sysinternals Autoruns можна побачити, на якому етапі завантаження підтягуються ті чи інші модулі.

Граф завантаження був побудований для Windows 7 Enterprise x64, встановленої на віртуальній машині VMware. Нижче наведено векторне зображення графа та безпосередньо файл у форматі gml, з яким можна погратись у будь-якому редакторі графів.

Тривалий час бігати з однієї операційної системи в іншу, якщо їх встановлено на комп'ютері дві, не вийде. Після ретельного вивчення обох, рано чи пізно доведеться вибрати лише одну з них – основну, з якою робота проводитиметься переважно. Якщо здебільшого використовується лише одна система Windows, інші її версії або редакції, розміщені на інших розділах диска, не обов'язково видаляти.Звичайно ж, за умови, що простір жорсткого диска не обмежений у розмірах.

Можливість роботи в майбутньому з іншими системами комп'ютера можна залишити, але для зручності спростити вхід в основну, прибравши тимчасово не завантажувані. У цьому випадку запуск комп'ютера буде спрощено автоматичним завантаженням лише потрібної операційної системи. Інший варіант спростити початок роботи з комп'ютером – не прибирати вікно вибору завантаження всіх систем, але призначити потрібну версію Windows як завантажувану за замовчуванням і зменшити час вибору інших варіантів у вікні завантажувача.

Як редагувати процес завантаження кількох операційних систем Windows, встановлених на одному комп'ютері, про це детальніше нижче.

Отже, маємо у разі комп'ютер із встановленими версіями Windows 7 і 8.1. Коли комп'ютер увімкнено, бачимо вікно завантажувача з переліком систем для вибору.

Щоразу під час завантаження комп'ютера потрапити у потрібну систему можна, зробивши відповідний вибір. В іншому випадку після певного часу – а за умовчанням це 30 секунд– автоматично буде завантажено Windows, стоїть у списку першої.У нашому випадку це Windows 7оскільки вона встановлена ​​на комп'ютер останньої, і саме її завантажувач, як бачимо, зустрічає нас після запуску комп'ютера.

Що ж, змінимо це. Налаштуємо автоматичне завантаження системи – Windows 8.1. Для цього, природно, необхідно увійти до неї.

Нам потрібен розділ налаштувань, і Windows 8.1 в нього можна потрапити за допомогою контекстного меню на кнопці.

У віконці системи вибираємо Додаткові параметри.

Потрапити до розділу налаштувань у Windows 7 можна також за допомогою контекстного меню, але викликаного на значку «Комп'ютер»у провіднику. Серед команд необхідно вибрати.

У Windows 7 також вибираємо Додаткові параметри.

Подальші кроки обох системах ідентичні.

У вікні властивостей системи, що з'явилося, у вкладці «Додатково»тиснемо кнопку параметрів в останньому розділі.

Тепер можна розпочати редагування завантаження кількох систем. Змінюємо завантажену за замовчуванням Windows з числа варіантів у списку, що випадає. У нашому випадку встановлену Windows 7 змінюємо на Windows 8.1.

Як згадувалося, за замовчуванням завантажувач Windows чекає півхвилинищоб користувач міг здійснити вибір операційної системи.

Якщо переважно робота проводиться лише в одній системі, немає сенсу залишати півхвилини очікування її автоматичного завантаження. Іншу операційну систему можна не позбавляти можливості запуску, але скоротити встановлений час для вибору варіантів завантаження. У відображенні списку систем, що завантажуються, в нашому випадку встановимо 5-секунднеочікування перед автоматичним завантаженням ОС Windows 8.1. Цього часу вистачить з лишком, щоб зробити вибір, якщо раптом колись знадобиться увійти до Windows 7.

Щоб повністю прибрати іншу систему із переліку завантаження, необхідно прибрати галочку з опції відображення списку систем. У цьому випадку без будь-яких тимчасових затримок завантажуватиметься лише система, вибрана для завантаження за замовчуванням.

Якщо друга операційна система колись знадобиться, увійти до неї можна буде, зробивши цю опцію знову активною.

Після внесення змін тиснемо «Ок»внизу цього вікна, а також унизу вікна властивостей системи.

Все – список завантаження операційних систем відредаговано.

Вище ми розглянули редагування існуючих операційних систем. Але часто при запуску комп'ютера можемо побачити список операційних систем, яких вже на комп'ютері ні. Це природний розвиток подій після того, як друга операційна система була видалена шляхом звичайного форматування розділу диска або знищення системних файлів вручну, але при цьому запис про можливість її завантаження у конфігурації системи не забиралася.Завантажувач також може відображати варіант запуску неіснуючої основної Windows після того, як система була перевстановлена. Це, до речі, не основна, але одна з причин, чому системники радять здійснювати так звану чисту установку Windows без збереження файлів попередньої системи і з форматуванням розділу диска.

Неіснуючу операційну систему краще взагалі видалити з варіантів завантаження, щоб вона не затягувала процес запуску основної Windows.

В основній системі викликаємо команду. У Windows 8.1 швидкий доступ до неї реалізований у контекстному меню на кнопці.

Нам потрібен розділ конфігурації системи. Вводимо в поле команди значення:

Тиснемо «Ок».

У Windows 7 запустити вікно конфігурації системи можна простіше - прописавши ключовий запит у поле пошуку меню .

Відобразиться вікно конфігурації системи, переходимо на вкладку . Вибираємо запис про завантаження неіснуючої системи та видаляємо її.

У нашому випадку перелік завантаження містив різні версії Windows, і визначитися з видаленою «Сімкою»нам явно не склало труднощів. Але якщо в переліку завантаження є записи про дві однакові версії Windows, в орієнтації з тією, яку потрібно видалити, допоможуть описи систем. Windows, в якій ми за фактом перебуваємо, буде позначена як поточна .

Внесені зміни зберігаємо кнопкою . Після натискання «Ок»система запропонує перезавантажити.

Після перезапуску комп'ютера можемо спостерігати негайне автозавантаження системи.

Після увімкнення комп'ютера в його оперативній пам'яті немає операційної системи. Само по собі, без операційної системи, апаратне забезпечення комп'ютера не може виконувати складні дії, такі як завантаження програми в пам'ять. Таким чином ми стикаємося з парадоксом, який здається нерозв'язним: для того, щоб завантажити операційну систему на згадку, ми вже повинні мати операційну систему в пам'яті.

Рішенням даного парадоксу є використання спеціальної маленької комп'ютерної програми, яка називається початковим завантажувачем, або команд розміщені в постійній пам'яті (наприклад, на IBM PC - командах перезавантаження без будь-якої допомоги). Дане програмне забезпечення може виявляти пристрої, які підходять для завантаження, і завантажувати зі спеціального розділу самого вибраного пристрою (найчастіше завантажувального сектора) даних пристроїв завантажувач ОС.

Початкові завантажувачімають відповідати специфічним обмеженням, особливо це стосується обсягу. Наприклад, на IBM PC завантажувач першого рівняповинен поміщатися в перших 446 байт головного завантажувального запису, залишивши місце для 64 байт таблиці розділів і 2 байти для сигнатури AA55, необхідної для того, щоб BIOS виявив початковий завантажувач.

Історія

Перші комп'ютери мали набір перемикачів, які дозволяли оператору розміщувати початковий завантажувач у пам'яті до запуску процесора. Потім завантажувач зчитував операційну систему із зовнішнього пристрою, наприклад з перфострічки або з жорсткого диска .

Псевдо-ассемблерний код початкового завантажувача може бути настільки ж простим, як і наступна послідовність інструкцій:

0: записати в регістр P число 8 1: перевірити, що пристрій зчитування з перфострічок може починати зчитування 2: якщо не може, перейти до п. 1 3: прочитати байт з пристрою зчитування з перфострічок і записати його в акумулятор 4: якщо перфострічка закінчилася, перейти до п. 8 5: записати значення, що зберігається в акумуляторі, в оперативну пам'ять за адресою, що зберігається в регістрі P 6: збільшити значення регістра P на одиницю 7: перейти до п. 1

Цей приклад заснований на початковому завантажувачі одного з мінікомп'ютерів, випущеного в 1970-х роках фірмою Nicolet Instrument Corporation.

0: записати в регістр P число 106 1: перевірити, що пристрій зчитування з перфострічок може починати зчитування 2: якщо не може, перейти до п. 1 3: прочитати байт з пристрою зчитування з перфострічок і записати його в акумулятор 4: якщо перфострічка закінчилася, перейти до п. 8 5: записати значення, що зберігається в акумуляторі, в оперативну пам'ять за адресою, що зберігається в регістрі P 6: зменшити значення регістра P на одиницю 7: перейти до п. 1

Довжина завантажувача другого рівня була такою, що останній байт завантажувача змінював команду, розташовану на адресі 6. Таким чином, після виконання пункту 5 стартував завантажувач другого рівня. Завантажувач другого рівня очікував заправки пристрій зчитування перфострічок довжиною перфострічки, що містить операційну систему. Відмінністю між завантажувачем першого рівня та завантажувачем другого рівня були перевірки на помилки зчитування з перфострічки, які часто зустрічалися в той час, і, зокрема, на телетайпах ASR-33, що використовуються в даному випадку.

Деякі операційні системи, найбільш характерними з яких є старі (до 1995 року) операційні системи комп'ютерів Apple Computer, настільки тісно пов'язані з апаратним забезпеченням комп'ютерів, що на цих комп'ютерах неможливо завантажити будь-яку операційну систему. У цих випадках зазвичай розробляється початковий завантажувач, який працює як завантажувач стандартної ОС, а потім передає керування альтернативною операційною системою. Apple використовувала цей спосіб для запуску A/UX версію Unix, а потім використовувався різними безкоштовними операційними системами.

Пристрої, що ініціалізуються BIOS

Завантажувальний пристрій - пристрій, який має бути проініціалізованим до завантаження операційної системи. До них відносяться пристрої введення (клавіатура , миша), базовий пристрій виведення (дисплей), і пристрій, з якого буде виготовлено - дисковод, жорсткий диск, флеш-диск, PXE).

Завантажувальна послідовність стандартного IBM-сумісного персонального комп'ютера

Завантажується персональний комп'ютер

Посилання

Wikimedia Foundation. 2010 .

Дивитись що таке "Завантаження операційної системи" в інших словниках:

    Завантажувач операційної системи - системне програмне забезпечення, що забезпечує завантаження операційної системи безпосередньо після включення комп'ютера. Завантажувач операційної системи: забезпечує необхідні засоби для діалогу з … Вікіпедія

    Цей термін має й інші значення, див. Ядро. Ядро є центральною частиною операційної системи (ОС), що забезпечує додаткам координований доступ до ресурсів комп'ютера, таких як процесорний час, пам'ять і зовнішнє апаратне… Вікіпедія

    Для терміна «Планувальник завдань» див. інші значення. Планування виконання завдань одна з ключових концепцій у багатозадачності та багатопроцесорності як в операційних системах загального призначення, так і в операційних системах реального ... Вікіпедія

    Це форма розповсюдження системного програмного забезпечення. Наявність дистрибутивів спричинена тим, що форма програмного забезпечення, яка використовується для його поширення, майже ніколи не збігається з формою програмного забезпечення, яка працює ... Вікіпедія

    Довірене завантаження функція персонального комп'ютера для запобігання несанкціонованому запуску користувача, завантаженню операційної системи (ОС) та отримання можливості доступу до конфіденційної інформації. Забезпечення… … Вікіпедія

    Цю статтю слід вікіфікувати. Будь ласка, оформіть її згідно з правилами оформлення статей.

    Windows XP стартує в інтернет телефон автоматі В інформатиці початковим завантаженням називається складний та багатокроковий процес запуску комп'ютера. Завантажувальна послідовність це послідовність дій, які має виконати комп'ютер для … Вікіпедія

    Здатність термінальних клієнтів безпечно завантажувати операційну систему. Основним рішенням безпечного завантаження є перевірка цілісності та автентичності файлів операційної системи, які можуть зберігатися на локальному жорсткому диску, … … Вікіпедія

    Основна та дублююча мікросхеми ПЗУ материнської плати Gigabyte, що містять BIOS компанії AWARD. BIOS (англ. basic input/output system «Баз … Вікіпедія

    Prefetcher є компонентом операційної системи Microsoft Windows, що прискорює процес її початкового завантаження, а також скорочує час запуску програм. Prefetcher вперше з'явився в операційній системі Windows XP. Починаючи з Windows Vista, він ... Вікіпедія

А ви ніколи не замислювалися над тим, що відбувається з операційною системою в той момент, коли вона малює свій логотип і говорить «Starting Windows»? І взагалі, чому вона довго завантажується? Адже при старті системи точно не вирішуються ніякі завдання, складні з обчислювальної точки зору!

Що тоді має на увазі під собою завантаження операційної системи? Здебільшого це проектування на згадку виконуваних модулів та ініціалізація службових структур даних. Структури даних живуть у пам'яті, тому операції з ними за ідеєю мають бути швидкими. Все наштовхує на думку про те, що час з'їдається саме процесом завантаження виконуваних модулів на згадку.

Зацікавимося розберемося, які модулі, в якій кількості і в якому порядку завантажуються при старті ОС. Щоб з'ясувати це, можна, наприклад, отримати лог завантаження системи. Піддослідна ОС у моєму випадку – Windows 7 Enterprise x64. Логуватимемо процес завантаження за допомогою відладчика ядра. Існує кілька варіантів відладчиків ядра, особисто я віддаю перевагу WinDbg. Також нам знадобляться деякі допоміжні засоби для чарівного перетворення ліг на щось приємніше для ока.

Mining and crafting

Налаштування налагодження добре гуглиться, тому докладно описувати цей процес я не буду. Оскільки нас цікавить все, що відбувається з моменту старту системи, нам потрібно відзначити пункт Cycle Initial Break, за допомогою чого відладчик зупиниться, як тільки в системі, що налагоджується, буде завантажена підсистема налагодження ядра. Дублювання виведення у файл можна здійснити за допомогою команд ".logopen" та ".logclose", це просто. Інша корисна команда – ".cls". Вона очищає екран команд, і так, лише екран команд.

Цікава для нас функція - «MiCreateImageFileMap». Це внутрішня функція менеджера пам'яті, що проеціює файл, що виконується в пам'ять. Проеціювання в пам'ять відбувається при створенні секції, наприклад, при запуску файлу, що виконується. Однак врахуйте, що якщо файл, що виконується, проектується в пам'ять, це не гарантія того, що буде виконано його код! Ця функція просто створює проекцію, найчастіше про запас, щоб, якщо хтось надумає запустити модуль на виконання, можна було заощадити час його завантаження. На цю функцію поставимо логіруючу точку зупинки.

Якщо ви маєте достатньо мани, вводьте наступну команду:
bu nt!MiCreateImageFileMap "dt nt!_EPROCESS -d ImageFileName @$proc; dt nt!_FILE_OBJECT -d FileName @rcx; g"
Магічний рядок буквально означає наступне:

  • bu (Set Unresolved Breakpoint) - встановити невирішену точку зупинки. Не те, щоб хтось або щось не дозволяв, просто для її встановлення необхідно визначитися, за якою адресою її ставити. Справа в тому, що заздалегідь не відомо, за якою адресою вона має розташовуватися. При завантаженні будь-якого модуля перевіряється наявність у ньому необхідної функції, і якщо така функція знайдена, точка зупинки встановлюється автоматично. Такий спосіб установки незамінний при включеному ASLR - рандомізації адресного простору, оскільки модулі будуть завантажуватися щоразу за різними адресами, і точка зупинки, встановлена ​​за фіксованою адресою, з великою ймовірністю виявиться не при справах.
  • nt!MiCreateImageFileMap - символ, на якому потрібно зупинятися. У WinDbg прийнято запис у формі "module_name!function_name". В даному випадку nt є певним псевдонімом для ntoskrnl.exe.
  • Далі слідує частина WinDbg-скрипта, яка буде виконуватися щоразу при зупинці цієї функції. "dt nt!_EPROCESS -d ImageFileName @$proc" російською означає "відобразити поле ImageFileName структури _EPROCESS з модуля nt за умови її відображення за адресою, визначеною в псевдореєстрі "поточний процес"". Наступна після роздільника ";" команда означає приблизно те саме, тільки адреса структури береться з регістра rcx, в якому в Microsoft x64 ABI передається перший параметр функції. "g" означає "go", тобто. продовжити виконання.

Невелика рекомендація щодо використання логуючих точок зупинки: намагайтеся не використовувати розширення відладчика (команди, що починаються з "!"), оскільки в такому разі логування виконуватиметься на порядок повільніше.

Поїхали! Віджимаємо гальмо точки зупинки і чекаємо. Я чекав, доки провантажиться робочий стіл, тобто. я залогінився. Отриманий «урожай» трохи редагується, обрізається все зайве для зручності подальшої обробки та згодовується товариш пітону. Не загострюватимемо увагу на парсингу лога. Зазначимо лише, що граф укладався у форму спіралі Архімеда з подальшою корекцією вручну, оскільки відбувалося накладення вузлів один на одного. В отриманому графі враховується порядок завантаження бібліотек. На жаль, довелося пожертвувати враховуючи порядок завантаження файлів, що виконуються, щодо бібліотек для зручності читання графа.

Карта зоряного неба


Умовно виділимо кілька груп завантаження.

Починається робота OC у модулі ntoskrnl.exe, що є ядром ОС. А якщо ще конкретніше – з функції KiSystemStartup(). Разом із завантажуваними системними компонентами вона формує фундамент ОС: поділ режимів роботи, базові сервіси для додатків користувача і т.п. У цю групу входять драйвери, відзначені для завантаження під час старту системи. У двох словах, у цій черепашці зароджується ОС Windows.

Наступний вузол – менеджер сесій (session manager). Його представляє перший після системного процес, що стартує у Windows – smss.exe. Процес примітний тим, що є рідним (native) процесом Windows, тобто він не використовує підсистему Win32, яка ще не завантажена. Цей процес використовує лише нативні сервіси операційної системи за допомогою ntdll.dll, що є інтерфейсом режиму користувача для сервісів ОС. Також цей процес є довіреним компонентом операційної системи і має виняткові права, наприклад, він може створювати маркери безпеки (security tokens). Але головне його призначення - створення сеансів та ініціалізація підсистем як графічної, так і різних виконуваних (Windows, POSIX). Ця черепашка віддає кожному за потребами.

Група входу до системи (logon) складається з кількох процесів. Загалом вони відповідають за ініціалізацію сеансів. Це включає відображення екрана вітання, створення робочих столів, запуск процесів автозавантаження та ініціалізацію підсистеми безпеки тощо. Цей віник відкидає всіх сторонніх.

Найпотужнішою виявилася група сервісів. Багато в чому вона завдячує своїм обсягом службі SuperFetch. Ця та сама, про яку говорять, що вона у вихідні заздалегідь провантажує офісний пакет, а на початку робочого тижня - Steam з іграшками. Superfetch провантажує величезну кількість модулів при старті системи, щоб потім все швидше працювало. Та й крім нього в системі вистачає сервісних додатків і драйверів, що автозапускаються. Думаю, всі бачили оснащення «Служби та програми». Ця зірка життя заводить у системі все, що потрібно і не дуже.

Останнім відзначу улюблений усіма explorer.exe. Примітно, що до моменту його запуску всі модулі, що використовуються, вже завантажені в пам'ять. У скріншот також потрапив якийсь vcredist_x64.exe - бідолаха лежав на робочому столі піддослідної віртуальної машини і був провантажений на згадку провідником.

Взагалі способів виявитися завантаженим на згадку у модуля багато. Наприклад, достатньо запитати інформацію з ресурсів файлу, в тому числі його іконку. Саме цьому прикладі провідник перевіряв, чи є ця програма потребує підвищених привілеїв, тобто. чи варто домальовувати до іконки відповідний малюнок із жовто-блакитним щитом. Ще раз зазначу, що завантаження модуля на згадку не означає виконання його коду!

Особисто я тримаю картинку під боком. Нею добре простежуються залежності, наприклад, драйверів. Також у парі з утилітою Sysinternals Autoruns можна побачити, на якому етапі завантаження підтягуються ті чи інші модулі.

Граф завантаження був побудований для Windows 7 Enterprise x64, встановленої на віртуальній машині VMware. Нижче наведено векторне зображення графа та безпосередньо файл у форматі gml, з яким можна погратись у будь-якому редакторі графів.

Поділіться з друзями або збережіть для себе:

Завантаження...