Оригинал материала: https://3dnews.ru/169189

Недокументированные функции в ОС Windows 95/98/NT/2000, поиск и практическое использование

Автор: Ашот Оганесян

Начать наверное надо с того, зачем вообще искать ф-ции, которые производитель официально не задокументировал? Бытует мнение, что использование недокументированных ф-ций, как и опереатора goto это плохой стиль. Я как программист-практик не вижу ничего плохого в том, что бы заменить несколько операторов сравнения на один оператор безусловного перехода, то же и в отношении недокументированных ф-ций. Есть ситуации когда просто необходимо знать больше чем это позволяет официальная документация, например при написании программ, тесно работающих с системой - системных утилит. Возьмите к примеру известный всем пакет Norton Utilities, вы думаете старик Питер (ну конечно это не он писал этот пакет, но все же) пользовался только Win 32 SDK и MSDN Universal (или может Professional, как я)? Заявляю почти как Станиславский - не верю! Есть масса примеров того, что знание и использование недокументированных ф-ций позволяет сократить время и повысить качество разработки. Конечно во всем надо знать меру, нельзя слепо надеятся на то, что производитель ОС оставит недокументированную ф-цию в следующей версии или не изменит ее синтаксис. Все очень сильно зависит от того, что это за ф-ция, как она реализована и т.п. Хотя есть так же масса примеров тому, что ф-ция была не документированной в старой версии ОС, а потом, в новой версии, стала вполне обычной API-шной ф-цией (так было с несколькими ф-циями в NT3 при переходе на NT4). Буду считать, что дальнейшая агитация за недокументиованные ф-ции не нужна и перейду к тому, как собственно я ищу их в ОС производства компании Microsoft..

Оговорюсь с самого начала, что я не буду углубляться в долгие и нудные листинги дизассемблеров, дампы отладчиков и т.п. изыски, а затрону лишь основы, с целью донести до читателей технологию поиска и иследования внутренностей ОС. У меня есть несколько принципов, которые я стараюсь блюсти - все, что я хочу найти в ОС нужно мне для решения какой-либо задачи, т.е. я не стараюсь найти все то, что спрятали в Microsoft; я не люблю изобретать велосипед, если есть возможность найти необходимую информацию не прибегая к реверс-инжинирингу, лучше воспользоваться этой возможностью; если есть два решения поставленной задачи - одно красивое и документированное, а второе не красивое зато использует недокументированную ф-цию, то я выбираю документированное т.к. моя цель написать максимально работоспособный и легко читаемый код.

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

Начинать поиск лучше со специализированных сайтов по программированию, вот очень краткий перечень моих любимых сайтов:

www.sysinternals.com - сайт Марка Руссиновича и Брюса Когвела, скажем так - не самые последние люди в нашем деле.
www.mvps.org/win32/ - очень полезная информация по программированию в Win 32.
www.ddj.com - сайт Dr. Dobb's Journal (DDJ), одного из лучших журналов по программированию.
www.msj.com - сайт Microsoft System Journal (MSJ), отличный журнал для системных программистов, тут можно найти знаменитые статьи "Under the Hood" ("Под Капотом") от Matt Pietrek, консультанта компании Nu-Mega Technologies.
www.codeguru.com - про MFC, но к счастью не только.
www.codepile.com - мой скромный сайт, на котором я пишу про то, что нахожу, правда только по-английски, а самое ценное, что тут вы найдете гораздо более внушительную коллекцию линков.

Огромным хранилищем информации являются ньюсгруппы, поиск по ним лучше всего вести используя сервер www.deja.com, только не забудьте включить в поиск все данные, а не только новые (по умолчанию поиск ведется только по новым).

Конечно существуют еще и обычные книги, их не так много по нашей тематике. Я могу рекомендовать следующие книги:
"Windows NT. File System Internals. A Developer's Guide.", 1997 O'Reilly & Associates, Inc - книга известного Rajeev Nagar, посвящена проблемам написания файловых драйверов для NT, ценность в том, что содержит массу описаний недокументированных ф-ций Native API, связанных с файловой системой;
"Inside Windows NT. Second Edition.", 1998 Microsoft Press - полезная книжка от David A. Solomon, в ней вы не найдете никаких недокументированных ф-ций (и примеров программирования вообще), зато узнаете очень много интересного про то как все внутри у NT устроено, это полезно для самостоятельного исследования ядра;
"Undocumented Windows Nt.", 1999 IDG Books Worldwide - авторы Prasad Dabak, Sandeep Phadke и Milind Borate, скажу просто - must have.
"Advanced Windows (3rd Ed)", 1997 Microsoft Press - "библия" для любого Windows-программиста, автор Jeffrey Richter, мои комментарии этой книге не нужны;
"Недокументированные возможности Windows NT.", 1998 Нолидж - единственная книга на русском языке, которую я приобрел за последние два года, автор А.В. Коберниченко, полезная информация по Native API, правда есть некоторые ошибки в восстановленных структурах.
Кстати, в середине февраля, по моим данным, выходит одна долгожданная книга, название я точно не знаю, но что-то типа "Windows NT Native API", как утверждает автор, будет содержать описания всех ф-ций из ntdll.dll (native api).

Нельзя забывать про MSDN, в нем иногда попадаются интересные статьи и примеры, есть даже несколько описаний недокументированных ф-ций, взятых из MSJ.

Когда все информационные источники исчерпаны, а ситуация с использованием ф-ции не проясняется, то остается один выход - реверс-инжиниринг. Тут нам понадобятся некоторые инструменты: отладчик, дизассемблер и компилятор. В качестве отладчика я использую знаменитый SoftIce фирмы Nu-Mega, он входит в состав Drivers Studio, но можно приобрести и отдельно, т.к. сама студия стоит очень дорого (цена в США около $1200, у нас около $2000). Лучший дизассемблер это конечно IDAPro, но я никак не собирусь его приобрести (для нас он стоит порядка $140), поэтому приходится пользоваться разными бесплатными поделками. Компилятор нужен для того, что бы "не отходя от кассы" проверять то, что мы нароем и восстановим. Желательно выбрать какую-нибудь программу из состава ОС, которая содержит необходимую ф-цию и начать исследовать ее. Самым настоящим "алмазом" является стандартный Task Manager из NT, он содержит огромное кол-во разнообразных недокументированных ф-ций (например NtQuerySystemInformation). Лучше всего взять Task Manager из состава Windows NT/2000 Debug Checked Build, тогда при его отлаживании в SoftIce вам буду видны многие переменные и классовые ф-ции, а смотреть на это гораздо приятнее (а главное полезнее!) чем на безымянные call [address]. Для начала, надо восстановить кол-во параметров передаваемых ф-ции, сделать это легче всего посчитав кол-во инструкций push перед вызовом этой ф-ции. Формализовав кол-во параметров, необходимо перейти к исследованию содержимого стека до и после вызова ф-ции, таким образом можно будет определить типы и возможно значение параметров. Конечно это очень трудоемкий и долгий процесс, но когда нарабатывается определенный опыт дело идет гораздо быстрее и легче. Ситуацию сильно облегчает то, что Microsoft придерживается единого стиля, восстановив одну ф-цию, можно расчитывать на некоторое подспорье в востановление другой (при всей своей недокументированности это все же API и определенные соглашения перекочевывают из ф-ции в ф-цию!). Очень полезно бывает потрассировать в отладчике стандартные API-шные ф-ции и посмотреть как они устроены, тут ситуация облегчается тем, что входные параметры известны и понять что и куда передается внутри исследуемой ф-ции уже гораздо легче. Как я уже писал выше, все ф-ции являются частью API и очень часто используют одни и те же структуры , параметры различных ф-ций часто имеют одинаковый смысл (как с ф-циями NtQuery). Поэтому имея под рукой информацию по уже известным ф-циям, иногда достаточно одного взгляда на новую ф-цию, что бы понять значения большинства ее параметров. Недостающие параметры часто восстанавливаются путем "подсовывания" различных значений, в своей тестовой программе и изучения поведения в обычном отладчике 3-го кольца (например, стандартный отладчик поставляемый с Microsoft Visual Studio для Visual C).

Очень важный момент в исследовании ОС это аккуратная систематизация всех найденных ф-ций и структур, надо тщательным образом собирать и хранить любую информацию - потом она может стать ключем к восстановлению какой-либо функции.

Материалы:

Как получить список открытых файлов на Win9x
Как определить зависло приложение или нет
Самый быстрый способ получить заголовок окна в Windows NT/2000
Получения HWND оболочки Windows



Оригинал материала: https://3dnews.ru/169189