Исследования ядра LINUXа

       

Внутри ядра


Наступает волнующий миг: файл vmlinuz загружается в дизассемблер! Начинается самой интересное: IDAPro не может опознать формат и загружает его как бинарный, а это уже нехорошо! Ядро имеет сложную структуру, состоящую из нескольких загрузчиков, последовательно отрабатывающих один за другим (ну прямо как ступни ракеты), а основная часть ядра упакована. Как разобраться с этим хозяйством? Задача-минимум: распотрошить ядро на модули, определив базовый адрес загрузки и разрядность каждого из них. Кто-то может сказать, а в чем, собственно проблема? Ведь у нас есть исходные тексты! Что ж, исходные тексты это, конечно, хорошо, но вот вопрос — какой файл какой части ядра соответствует? Так что без хорошего путеводителя здесь никуда!

Первые 200h байт файла vmlinuz принадлежат boot-сектору, который грузится по адресу 0000:7C00 и выполняется в 16-разряном режиме. Нажимаем <Alt-S> или обращаемся к меню Edit à Segment à Edit Segment (здесь и далее горячие комбинации указаны для IDA Pro 4.7, в других версиях они могут слегка отличаться). Вводим имя сегмента: boot, начальный адрес оставляем без изменений, а конечный меняем на 200h. На все грозные предупреждения отвечаем однозначным "yes". Затем, подводим курсор к первому байту кода и нажимаем <C>, чтобы IDA Pro превратила ячейки памяти в код. После этого дизассемблирование можно продолжать как обычно. Исходный код загрузчика можно найти в файле \arch\i386\boot\bootsect.S, а можно и не искать — нам он не интересен. За долгие годы он вылизан дочиста. Даже если какие-то баги в нем есть, пробить в них дыру удастся навряд ли.



Содержание раздела