Сегодня очередным вопросом о том, с чего начать кодинг под ринг0, меня вынудили дать развернутый ответ, в связи с чем хочу все изложить последовательно. WARNING флеймерам: все нижеизложенное является моей личной точкой зрения, не претендует на единственно возможную и ни в коем случае на абсолютную правильность. Это одно из возможных руководств к действию, не исключающее других, но предполагающее, что человек будет следовать поэтапно и последовательно, не перепрыгивая и не меняя местами пункты. Приветствуются конструктивные замечания к изложенным инструментам и справочным материалам. Все нижеизложенное касается кодинга под ос XP/2003 x32, для более поздних потребуется некоторые корректировки, но я все равно рекомендую начинать с икспи. Сперва речь пойдет про необходимые инструменты. 1. Конечно же, потребуется Windows Driver Kit , он же Driver Development Kit в прошлом, вообщем называйте как хотите, а я буду сокращенно именовать такие продукты далее как DDK. Суть в том, что там содержатся инклуды и либы для Си компилятора, чтобы можно было собрать работающий бинарник драйвера. Так же обычно там содержатся и специальные версии этих самых компиляторов и линкеров, которыми я обычно предпочитаю не пользоваться, а собирать всё в студии, о чем расскажу далее. Где достать wdk/dkk не помню, я думаю, что гуглу виднее, помню лишь что когда-то что-то связанное с этим было платным и свободно не раздавалось вроде бы, но в любом случае можно достать, тем более сейчас. 2. Очень полезно будет заиметь так же Installable File System Kit (IFS Kit), в котором есть много того, чего нету в ддк. Даже если вы не будете разрабатывать драйвера файловых систем, хидеры и либы из 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_ (не помню сколько штук ) 10. Удобные маленькие штучки от Sysinternals (опять этот Руссинович!) Всякие regmon, filemon, DbgView, WinObj окажутся очень полезными при отладке. Так же советую WinObjEx от Four-F. Тоже незаменимая штука. 11. Само собой, лоадер драйверов. Благо их пруд пруди. Хоть из kmdkit Four-F'а, хоть мой компактный, хоть какой-нибудь. Главное, чтобы умел инсталить сервис, стартовать и останавливать его. 12. Так же полезна будет утилита pdbdump - ей нужно скормить символы ядра и хранить полученные хидеры как зеницу ока. Ибо документированы далеко не все структуры, а интерес человека не знает границ и везде хочется сунуть свой нос. UPD: WARN: сгенеренные хидеры не всегда могут быть использованы как хидеры, поскольку union'ы оно распознает криво и надо смотреть по оффсетам и фиксить соответствующим образом их. Info: http://www.wasm.ru/forum/viewtopic.php?pid=328285#p328285 13. Хороший дизассемблер, тут IDA Pro + HexRays практически сметают всех конкурентов. Один раз надо будет сделать базы .idb для ядра и хал (разумеется с символами) для checked и retail версий ядра. С инструментами, вроде, покончили. Для особых извращенцев, у которых в крови зашкаливает адреналин и всегда хочется приключений на свои вторые девяносто, могу посоветовать поставить локально на компьютер отладчик Soft ICE. Если сумеете поставить и заставить его работать, то получите массу удовольствия от того, как драйвера будут падать не в синий экран, а в черное окно отладчика, в котором можно будет покрутить код и потыкать в регистры. Очень интересно, забавно, но крайне не рекомендовано - эксперименты, которые коснутся кеша файловой системы и прочих важных штук, могут угробить вам часть данных на харде. Собственно тоже самое могу сказать и просто про запуск своих неотлаженных драйверов на собственной машине. Вообщем, как говорится, на свой страх и риск и не говорите потом, что я не предупреждал, если вдруг пропадёт вся порнуха с винта Теперь излагаю что требуется сделать: 1. Я думаю, я уже достаточно раз повторил про Руссиновича и про статьи. Так что сначала нужно заиметь себе в голове теорминимум. 2. Если чего-то из списка нет, то поставить: студию (подойдет любая >= чем 2003 (7 версия) и заканчивая 2008 (9 версия,последняя)), Debugging Tools, VMware, скачать checked build и вообще заиметь все инструменты из списка в первой половине статьи. 3. Настроить студию для сборки драйверов. Например, здесь неплохо так изложено как это сделать. Тут обычно многие справляются, поскольку подключать мозги к этому процессу практически не требуется. 4. Настроить на VMware (как, она еще не установлена? тогда бегом ставить) COM-порт чтобы он указывал на пайп. http://rootkits.su/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. Пыщ-пыщ 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.su/viewtopic.php?id=72 (настройка VMware) http://sourceforge.net/projects/pdbdump (утилита pdbdump) А так же: http://www.wasm.ru/publist.php?list=21 (статьи раздела "Секреты Win32") http://rootkits.su/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 подкинул в личку, думаю, он будет не против, если я опубликую)
Как дополнение к вышесказанному - очень хорошо подымает уровень написания драйверов пример toaster из DDK любых версий. Собственно чтение мануалов DDK без разбора исходников тостера малоэффективно. Сам комплекс драйверов тостер с лихвой перекрывает материал изложенный Four-F.
Привет всем Мне очень понравился "manual" о том, как читать книгу Руссиновича и Соломона. Подробно так и... я бы сказал жизненно Серьёзно очень понравился =)
Для начала это конечно не плохо, но : 1. Если в планах писать "руткиты и так для забавы", то стоит самому написать функции для загрузки/выгрузки драйвера. 2. Если все серьезно, то стоит прочитать про inf файлы. ИМХО с ними очень удобно и не нужны всякие сторонние програмки : Код (Text): net start <имя> net stop <имя> Инсталяция тоже простое дело. Правой кнопкой мыши и нажать Install.
А че про них читать, если они легко генерятся GenInf'ом. Можно, конечно и так. Но для начинаний, по-моему, перебор.
Great хорошо написал все, респект у новичков после прочтения создается правильное впечатление - драйвера это не просто я бы сказал - очень не просто само по себе программирование большинству людей не дается, а уж это ...
я бы пожелал новичку в ядерном девелопменте кроме понятное дело мозгов еще слонового здоровья, железных нервов и лошадиной выносливости. И хорошего железа! 16 гигов, рейд 5 и 2 больших моника на варный хост!
Можно упомянуть книжку Солдатова - Программирование драйверов Windows. ИМХО вместе с Four-F лучшее по драйверам из российских авторов. Также исходники статей Four-F сложновато разбирать тем кто не знает асма.
Касаемо свободных тулз разработки, сюда можно добавить компилятор GCC, из пакета MinGW/CygWin Основные DDK файлы (хидеры/либы) в нем присутствуют, он вполне осиливает скомпилять каркас: Код (Text): #include <ntddk.h> NTSTATUS DriverDeviceControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { // // TODO // IoCompleteRequest( Irp, IO_NO_INCREMENT ); return STATUS_SUCCESS; } NTSTATUS DriverCreate( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { // // Go ahead and set the request up as successful // Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return STATUS_SUCCESS; } VOID DriverUnload( IN PDRIVER_OBJECT DriverObject ) { WCHAR deviceLinkBuffer[] = L"\\DosDevices\\MyDrvName"; UNICODE_STRING deviceLinkUnicodeString; // // Delete the symbolic link for our device // RtlInitUnicodeString( &deviceLinkUnicodeString, deviceLinkBuffer ); IoDeleteSymbolicLink( &deviceLinkUnicodeString ); IoDeleteDevice( DriverObject->DeviceObject ); } //---------------------------------------------------------------------- // // DriverEntry // // Installable driver initialization. Here we just set ourselves up. // //---------------------------------------------------------------------- NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { NTSTATUS ntStatus; WCHAR deviceNameBuffer[] = L"\\Device\\MyDrvName"; UNICODE_STRING deviceNameUnicodeString; WCHAR deviceLinkBuffer[] = L"\\DosDevices\\MyDrvName"; UNICODE_STRING deviceLinkUnicodeString; PDEVICE_OBJECT DeviceObject; // // Setup our name and symbolic link. // RtlInitUnicodeString (&deviceNameUnicodeString, deviceNameBuffer ); RtlInitUnicodeString (&deviceLinkUnicodeString, deviceLinkBuffer ); // // Set up the device used for communications // ntStatus = IoCreateDevice ( DriverObject, 0, &deviceNameUnicodeString, FILE_DEVICE_UNKNOWN, 0, FALSE, &DeviceObject ); if( NT_SUCCESS(ntStatus)) { // // Create a symbolic link to gain access to this driver/device // ntStatus = IoCreateSymbolicLink (&deviceLinkUnicodeString, &deviceNameUnicodeString ); } if( !NT_SUCCESS(ntStatus)) { // // Something went wrong, so clean up (free resources etc) // if( DeviceObject ) IoDeleteDevice( DeviceObject ); IoDeleteSymbolicLink( &deviceLinkUnicodeString ); return ntStatus; } // // Create dispatch points for all routines that must be handled // DriverObject->DriverUnload = DriverUnload; DriverObject->MajorFunction[IRP_MJ_CREATE] = DriverCreate; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverDeviceControl; return STATUS_SUCCESS; } За более продвинутыми примерами, можно обратиться к исходникам QEMU и его ускорительного дрова KQEMU
Ну дрова то можно и на фасме и на масме и на дельфи писать, и еще найти кучу Си компиляторов, которые можно к этому делу приспособить. Но мне как-то больше студия по душе. В чем смысл в gcc собирать? Мне просто интересно)
Да, Great рулит! Теперь будет топик, куда можно будет направить новичков, говоря - "там есть все что тебе нужно для начала". (блин, жалко что этого топика небыло когда я начинал). Great - Thanks!
Я бы также порекомендовал книгу "Windows Driver Foundation: разработка драйверов". Сам не далее как вчера ее приобрел.
На rootkit.com есть улитилита "InstDrv" в разделе downloads. Её тоже можно использовать для работы с драйверами(установки).
А большая разница? Нульмодемный кабель и вперед. Хотя проще воспользоваться отладкой по Ethernet'у с помощью Visual SoftICE
Интересно, а почему никто не рекомендует книгу Свена Шрайбера "Недокументированне возможности Windows 2000"? По-моему достойный материал, хоть и читается довольно тяжело. Еще поиск в гугле по "intel manual ia32", английский там легкий, но без него как буд-то пол мозга отрезали