Боевое искусство портирования Крис Касперски ака мыщъх Хакер, номер #084, стр. 084-108-3 Ядро, на котором как на фундаменте держатся все вышеупомянутые компоненты, представляет собой совокупность низкоуровневых функций, сосредоточенных... Правильно! В ntoskrnl.exe! Ниже находится только слой абстрагирования от оборудования, или сокращенно HAL (Hardware Abstraction Level). Когда-то у Microsoft была идея разделить ядро на системно-зависимую и системно-независимую части, чтобы упростить перенос Windows на другие платформы, но уже во времена NT 4.x все перемешалось, и большая часть системно-зависимых функций попала в ntoskrnl.exe, а сегодня от HAL практически отказались. В нем осталось небольшое количество действительно низкоуровневых функций, непосредственно взаимодействующих с оборудованием. В частности, с портами и с DMA. Но в ядре Linux/BSD есть свои функции для работы с DMA, так что тащить за собой HAL нам совершенно необязательно, тем более, что драйвера взаимодействуют с DMA не напрямую, а через Plug-n-Pray менеджер, который находится в ntoskrnl.exe. Таким образом, если заставить ntoskrnl.exe работать в среде чужеродного ему Linux'а (или BSD), мы получим возможность запускать любые NT-драйвера без какой-либо доработки их двоичного кода. Это не только упрощает задачу переноса, но и снимает проблему так называемых «авторских прав». Интеграция с Европой идет полным ходом, Третий Рим (известный под логотипом USA) рвется в заснеженные леса России, всюду устанавливая свои порядки и законы. Любой обладатель лицензионной копии Windows вправе вызывать готовый драйвер откуда угодно без каких бы то ни было разрешений и без выплаты дополнительного вознаграждения, но модифицировать двоичный код ему позволят едва ли. Но мы ведь и не собираемся ничего модифицировать! Мы берем готовый ntoskrnl.exe и... собственно, это все. Работы предстоит не так уж и много. Достаточно спроецировать его по адресам, указанным в заголовке PE-файла (а ntoskrnl.exe - это обычный PE-Файл) и разобраться с таблицей экспорта, используемой драйверами. Короче говоря, мы должны реализовать свой собственный PE-загрузчик и разместить его в загружаемый модуль ядра или в само ядро. Чтобы не мучаться, можно хлебнуть вина и содрать готовый загрузчик оттуда. Нет, это не спиртной напиток, это эмулятор Windows'а - Wine (Windows Emulator). Взаимодействие ntoskrnl.exe с Linux/BSD ядром будет происходить через переходной код, эмулирующий HAL. Этот код мы будем должны написать сами, однако ничего сложного в этом нет, и объем работы предстоит минимальный, поскольку HAL содержит немного функций, да и те простые, как самовар. Сложнее подружить Диспетчер Системных Вызовов в внешним миром, то есть миром Linux/BSD. Основная проблема в том, что интерфейс Диспетчера ни разу не документирован и к тому же подвержен постоянным изменениям. В Windows 2000 он один, в Windows XP он другой. А потом Microsoft вновь придумает новую пакость, и вся наша работа окажется бесполезной. Поэтому приходится хитрить и тащить за собой не только ntoskrnl.exe, но еще и ntdll.dll. Некоторые могут спросить: зачем? Какое отношение ntdll.dll имеет к драйверам и ядру? Драйвера его не вызывают, да и сам ntdll.dll представляет собой всего лишь набор переходников к ntoskrnl.exe. |