Сегодня 02 апреля 2025
18+
MWC 2018 2018 Computex IFA 2018
реклама
Программное обеспечение

Недокументированные функции в ОС 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

 
 
Если Вы заметили ошибку — выделите ее мышью и нажмите CTRL+ENTER.

window-new
Soft
Hard
Тренды 🔥
Картинки в стиле Ghibli перегрузили серверы OpenAI — выпуск новых функций замедлен 6 ч.
У Ubisoft пока нет чёткого плана работы новой компании с Tencent — инвесторы и сотрудники нервничают 8 ч.
«Загрузки быстрее, чем в Doom (2016)»: эксперт Digital Foundry остался в восторге от Doom: The Dark Ages 9 ч.
Консоли задержат релиз постапокалиптического стелс-экшена Steel Seed от создателей Close to the Sun — объявлена новая дата выхода 11 ч.
ИИ-модель Llama запустили на ПК из прошлого тысячелетия на базе Windows 98 11 ч.
Telegram продал виртуальных первоапрельских кирпичей почти на 100 млн рублей 12 ч.
Nintendo подтвердила рекордную продолжительность презентации Switch 2 и устроит две демонстрации игр для консоли 12 ч.
ChatGPT остаётся самым популярным чат-ботом с ИИ, но у конкурентов аудитория тоже растёт 13 ч.
Google сделает сквозное шифрование в Gmail доступным для всех 13 ч.
Антиутопия на колёсах: новый геймплейный трейлер раскрыл дату выхода приключения Beholder: Conductor про кондуктора легендарного поезда 13 ч.