Авторские статьи Драйверы режима ядра: с чего начать

Discussion in 'Статьи' started by _Great_, 14 Nov 2008.

  1. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,043
    Likes Received:
    1,118
    Reputations:
    1,139
    Кросспост с васма моей темы, думаю, пригодится людям и тут почитать, которые этим интересуются. И просто в коллекцию статей.

    Сегодня очередным вопросом о том, с чего начать кодинг под ринг0, меня вынудили дать развернутый ответ, в связи с чем хочу все изложить последовательно.

    WARNING флеймерам: все нижеизложенное является моей личной точкой зрения, не претендует на единственно возможную и ни в коем случае на абсолютную правильность. Это одно из возможных руководств к действию, не исключающее других, но предполагающее, что человек будет следовать поэтапно и последовательно, не перепрыгивая и не меняя местами пункты. Приветствуются конструктивные замечания к изложенным инструментам и справочным материалам.

    Все нижеизложенное касается кодинга под ос XP/2003 x32, для более поздних потребуется некоторые корректировки, но я все равно рекомендую начинать с икспи.
    Сперва речь пойдет про необходимые инструменты.

    1. Конечно же, потребуется Windows Driver Kit XP 2600, он же Driver Development Kit в прошлом, вообщем называйте как хотите, а я буду сокращенно именовать такие продукты далее как DDK. Суть в том, что там содержатся инклуды и либы для Си компилятора, чтобы можно было собрать работающий бинарник драйвера. Так же обычно там содержатся и специальные версии этих самых компиляторов и линкеров, которыми я обычно предпочитаю не пользоваться, а собирать всё в студии, о чем расскажу далее. Где достать wdk/dkk не помню, я думаю, что гуглу виднее, помню лишь что когда-то что-то связанное с этим было платным и свободно не раздавалось вроде бы, но в любом случае можно достать, тем более сейчас.

    2. Очень полезно будет заиметь так же Installable File System Kit (IFS Kit) XP 2600, в котором есть много того, чего нету в ддк. Даже если вы не будете разрабатывать драйвера файловых систем, хидеры и либы из ifs kit лишними не будут. В кустарных условиях если совсем пришел капец можно доволствоваться файлом ntifs.h, который составили добрые люди и распространяют по лицензии GNU GPL, который можно найит на 1-2 строчке гугла по запросу "ntifs.h" (для тех, кому лень - сначала подзатыльник ;). потом - ntifs.h). Где достать сам IFS Kit честно не знаю и как он ко мне попал так же не помню. Рекомендую погуглить.

    3. Debugging Tools for Windows x32, в принципе гугл на это название сразу выдает линк, но, опять же для ленивых, клац.
    Там же предлагают скачать символы - я бы не рекомендовал. Во-первых, далеко не все файлы из символьного пака потребуются. Во-вторых, я до сих пор не разобрался как прикрутить их символьные паки к ихнему же WinDbg (отладчик из Debugging Tools for Windows). Почему-то те символы, которые скачивает WinDbg в рантайме, имеют другую структуру каталогов, нежели их паки. Вообщем, мое предложение - скачивать символы в рантайме, благо у большинства инет сейчас быстрый и трафика шибко много там не потребуется - от силы метров 100-150 суммарно для большинства бинарей, которые вообще потребуются. Для этого надо будет ввести команду в WinDbg !sympath srv*D:\Symbols*http://msdl.microsoft.com/download/symbols, где D:\Symbols - локальный путь, куда сохранять символы. Ну, об этом далее.

    4. Локально установленный MSDN версии не ниже April 2007. Естественно, чтобы там была дока и на ддк. Иначе будет совсем-совсем грустно.

    5. М. Руссинович, Д. Соломон "Внутреннее устройство Microsoft Windows 2000/XP/2003 Server". И не надо говорить, что она толстая и нет времени читать! =)
    Никогда не понимал людей, которые так говорят про справочник. А ведь это по сути справочник. Ну, точнее, я, конечно, не хочу сказать, что все книги делятся на учебники и справочники, нет. Я клоню к тому, что это не учебник. Её стоит читать подряд, но не стоит пытаться понять абсолютно все, о чем написано, в отличие от учебника. В этом плане она частичто учебник. Потом, когда потребуется что-то конкретное, лезем в нужную главу и начинаем досконально изучать. И тогда эта книга - справочник. Я ее полностью страницу за страницей читал два раза. Прежде, чем что-либо читать еще или кодить. Так получилось, что я тогда уезжал в другой город на две недели, а незадолго до этого я ходил в книжный и случайно наткнулся на эту книжку и купил. Решил взять её почитать в дороге или по-вечерам. Взял:) Комп с собой не брал, поэтому вечерами я только и делал, что читал эту книгу подряд страницу за страницей. За две недели вечерами я прочитал ее два раза "от корки до корки", как говорится. Неприятный момент в том, что к концу чтения начинает забываться то, о чем писалось в начале. Это первая причина, почему я ее перечитал тогда дважды. Вторая причина - такой материал трудно изложить последовательно, многие части ядра взаимосвязаны и описать одно, не описывая другого, очень трудно. Поэтому первый раз ее нужно сесть читать, не стараться запомнить и понять всё, стараться понять и запомнить самое главное, а что именно главное, будет ясно по ходу чтения - об этом будет больше всего говориться, и оно автоматически запомнится лучше всего. При первом прочтении большинство терминов будут непонятны даже с учетом наличия глоссария в конце по описанной выше причине. Поэтому после первого прочтения книга читается второй раз, опять не надо стараться запомнить всё, но понять нужно больше, чем в первый раз - ведь теперь в общих чертах известен материал последующих глав. Только после таких манипуляций с этой книгой я рекомендую садиться что-либо писать.
    Не особо люблю статьи аля "пишем первый драйвер за 5 минут своими руками ляляля", одну из которых наблюдал в последнее время на хабре, не в обиду автору будет сказано. Там очень стараются излагать материал по ходу дела, в итоге получается статья про первый драйвер, где немного рассказано про подсистему ввода-вывода, немного про память, немного про IRQL, еще чуть-чуть про диспетчеризацию сервисов, в результате чего у читателя образуется такая каша, что ее потомздесь разгребать и разгребать, причем научить человека потом сложнее, чем если бы он таких статей вообще не читал. К сожалению, есть опыт с одним таким знакомым. Ну, вообщем-то, даже и не одним.

    6. После прочтения Руссиновича очень рекомендую статьи Four-F на васме, сам их использовал когда-то:) Наверное, это самый качественный вариант изложения материала. К сожалению, там затронуты не все необходимые на первых порах темы, поэтому остальное придется брать из других источников. Важный момент: настоятельно рекомендую именно сначала прочитать Руссиновича, а потом статьи Four-F'а. Видел людей, которые выпендриваются, что учатся только по статьям, не имея теоритической базы. Ни к чему хорошему это не приводит при всем уважении к качеству статей и их авторам. Без теоритической базы - никуда.

    7. VMware Workstation не менее, по-моему 5 версии (кажется, там появилась поддержка снапшотов, которые будут критически необходимы). Про то, какие бяки вытворять с ней и как настраивать - далее, а пока продолжим список инструментов и теоритического материала.

    8. Windows Research Kernel; win2k, nt4 sources. Поскольку это варез, ссылок не дождётесь:) Первое гуглится легко (и даже по-моему доступно на сайте мс), а второе и третье откровенный варез, который не очень просто найти в гугле, но возможно, если хорошо поискать. Мануалы, книжки и статьи это хорошо, а первоисточник - исходники - всегда лучше. Если что-то будет не понятно в Руссиновиче, то всегда можно посмотреть, а как же оно устроено на самом деле. Так же окажутся полезными сорцы React OS, если не знаете, что это такое - срочно бегом в гугл и читать офсайт. Штука очень интересная и полезная (я про отдельно взятые исходники с учебной точки зрения. Сама ОС пока кривая)

    9. Windows Checked Build. Что такое checked build и чем отличаются checked и retail build можно узнать из Руссиновича. К сожалению, мелкомягкие не позволяют скачать отдельно ядро и хал в checked сборке, поэтому надо либо выкачивать весь инсталлер, либо (если трафик не позволяет) кого-то просить у кого он есть, чтобы вынули ядро и хал оттудова. Сам инсталлер это самораспаковывающийся CAB-архив, поэтому даже ничего ставить не надо, просто открыть WinRAR'ом. Потребуются файлы i386\nt*kr*.ex_ (4 штуки), i386\hal*.dl_ (не помню сколько штук :D)

    10. Удобные маленькие штучки от Sysinternals (опять этот Руссинович!:D) Всякие regmon, filemon, DbgView, WinObj окажутся очень полезными при отладке.
    Так же советую WinObjEx от Four-F. Тоже незаменимая штука.

    11. Само собой, лоадер драйверов. Благо их пруд пруди. Хоть из kmdkit Four-F'а, хоть мой компактный, хоть какой-нибудь. Главное, чтобы умел инсталить сервис, стартовать и останавливать его.

    12. Так же полезна будет утилита pdbdump - ей нужно скормить символы ядра и хранить полученные хидеры как зеницу ока. Ибо документированы далеко не все структуры, а интерес человека не знает границ и везде хочется сунуть свой нос.

    13. Хороший дизассемблер, тут IDA Pro + HexRays практически сметают всех конкурентов. Один раз надо будет сделать базы .idb для
    ядра и хал (разумеется с символами) для checked и retail версий ядра.
    С инструментами, вроде, покончили. Для особых извращенцев, у которых в крови зашкаливает адреналин и всегда хочется приключений на свои вторые девяносто, могу посоветовать поставить локально на компьютер отладчик Soft ICE. Если сумеете поставить и заставить его работать, то получите массу удовольствия от того, как драйвера будут падать не в синий экран, а в черное окно отладчика, в котором можно будет покрутить код и потыкать в регистры. Очень интересно, забавно, но крайне не рекомендовано - эксперименты, которые коснутся кеша файловой системы и прочих важных штук, могут угробить вам часть данных на харде. Собственно тоже самое могу сказать и просто про запуск своих неотлаженных драйверов на собственной машине. Вообщем, как говорится, на свой страх и риск и не говорите потом, что я не предупреждал, если вдруг пропадёт вся порнуха с винта :D

    Теперь излагаю что требуется сделать:

    1. Я думаю, я уже достаточно раз повторил про Руссиновича и про статьи. Так что сначала нужно заиметь себе в голове теорминимум.

    2. Если чего-то из списка нет, то поставить: студию (подойдет любая >= чем 2003 (7 версия) и заканчивая 2008 (9 версия,последняя)), Debugging Tools, VMware, скачать checked build и вообще заиметь все инструменты из списка в первой половине статьи.

    3. Настроить студию для сборки драйверов. Например, здесь неплохо так изложено как это сделать. Тут обычно многие справляются, поскольку подключать мозги к этому процессу практически не требуется.

    4. Настроить на VMware (как, она еще не установлена? тогда бегом ставить) COM-порт чтобы он указывал на пайп. http://rootkits.ru/viewtopic.php?id=72 тут вполне достойно описано как это сотворить. Для проверки нужно загрузить винду в вмваре, предварительно прописав в C:\boot.ini пункт с дополнительными ключами /DEBUG /DEBUGPORT=COM1 /BAUDRATE=115200 Далее, загрузить этот пункт при старте и попробовать подключиться из WinDbg - его нужно запустить, нажать Ctrl-K, выбрать закладку COM, галочку Pipe, в качестве порта ввести \\.\pipe\com_1 (или вместо \\.\ путь к компьютеру, где запущена VMware. Да-да, вы не ослышались - можно VMware поставить на одном компе, а отлаживать с другого), скорость 115200 и нажать ОК. После чего нажать Ctrl-Break. Если все сделано верно, то WinDbg скажет, что ему пришлось остановиться, потому что мы его попросили и если после этого мы увидим приглашение для ввода команд внизу окна - все прошло чудесно и все работает. Можно попробовать набрать что-нибудь, например, kb и посмотреть стек вызовов, или r и посмотреть регистры.

    5. Подключаться к VMware уже можно, но нет символов. Срочно исправляем это недоразумение и в WinDbg прописываем в File -> Symbol File Path srv*D:\Symbols*http://msdl.microsoft.com/download/symbols, где D:\Symbols - путь, где будут сохраняться все скаченные символы. Туда можно скачивать символы и разных версий виндоус, они не перепутаются, поскольку распределяются по каталогам с уникаьлными номерами-хешами содержимого. Можно поставить галочку Reload, а можно ввести команду .reload по необходимости

    6. Наделать в VMware снапшотов - сначала retail версию, загруженную в обычном и дебаг режимах, потом заменить ядро и хал на checked версии и снова загрузить в дебаг и обычном режимах. Получается 4 снапшота. Очень пригодится потом.

    7. Наделать в IDA .idb баз для ядра и хал checked и retail версий, разумеется, скормив символы ей. Получатся увесистые базы мегабайт по пятьдесят, которые в дальнейшем очень потребуются, если вдруг что-то будет непонятно. Сначала лезем в Руссиновича, потом в сорцы ядра, потом в дизасм ядра в этих базах, пока не наступит прозрение.

    8. Утилитой pdbdump наделать хидеров разных версий ядра с разных систем (nt, 2000, xp, 2003 с различными SP. пригодится), как я уже выше говорил. Поскольку в ддк документировано много, но далеко не всё. А любопытство границ не знает.

    Вроде бы всё, если что-то еще вспомню, то допишу.
    PS. Пыщ-пыщ :D

    PPS. Ссылки из статьи (чтобы не бегать лишний раз по тексту):

    http://www.acc.umu.se/~bosse/ntifs.h (ntifs.h)
    http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx (Debugging tools)
    http://alter.org.ua/ru/docs/nt_kernel/vc8_proj/ (настройка Visual Studio 8)
    http://rootkits.ru/viewtopic.php?id=72 (настройка VMware)
    http://sourceforge.net/projects/pdbdump (утилита pdbdump)

    А так же:

    http://www.wasm.ru/publist.php?list=21 (статьи раздела "Секреты Win32")
    http://rootkits.ru/viewforum.php?id=1 (раздел, посвященный кернел кодингу)
    http://rootkit.com/ (без комментариев..)
    http://osronline.com/ (очень хороший сайтик с форумом, где много полезного, правда, на англицком.)
    http://reactos.org/ (оф сайт React OS)
    http://forum.vingrad.ru/ (еще один достойный форум по программированию)
    http://rsdn.ru/ (тут думаю тоже комментарии не нужны)
    http://technet.microsoft.com/en-us/sysinternals/default.aspx (сайт Sysinternals, который с недавнего времени хостится у MS, когда они их переманили к себе)
    http://www.dumpanalysis.org/ (в тему анализа дампов, вчера-сегодня некий Ra_Sh подкинул в личку, думаю, он будет не против, если я опубликую)

    UPD: https://www.wasm.ru/forum/viewtopic.php?id=29640 оригинал, пополнять список ссылок буду там.
     
    #1 _Great_, 14 Nov 2008
    Last edited: 14 Nov 2008
    9 people like this.
  2. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    320
    Likes Received:
    42
    Reputations:
    -3
    Это в принципе выисняется по пути разработки драйверов, хорошо что сейчас оно сосредоточено в одной статье.

    В Syser есть загрузщик дров.
     
Loading...