Сегодня 18 сентября 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
Тренды 🔥
ИИ от OpenAI обошёл все команды из людей, а заодно и Google Deepmind, на чемпионате по программированию 34 мин.
Похоже, в Cyberpunk 2 всё-таки появится мультиплеер — вакансия выдала планы CD Projekt Red 2 ч.
Google превращает Discover в «новостную соцсеть» с подписками и постами из X и Instagram 3 ч.
Reddit готовит новый контракт с Google по интеграции с ИИ-сервисами 4 ч.
Даже авторы сценария The Wolf Among Us 2 не знают, что происходит с игрой 13 ч.
Nothing анонсировала OS 4.0 — интерфейс стал проще, а камера умнее 15 ч.
Paradox добавила возмутившие фанатов платные кланы в стандартное издание Vampire: The Masquerade — Bloodlines 2 и анонсировала два сюжетных DLC 15 ч.
Жертвы утечки данных Facebook через Cambridge Analytica начали получать выплаты от Цукерберга 16 ч.
В мессенджере Max начинаются «открытые» тесты каналов — создавать их разрешат блогерам из реестра РКН 16 ч.
В России выплатили первую зарплату в цифровых рублях 17 ч.
Представлены умные очки Ray-Ban Meta Gen 2 с удвоенным временем автономной работы 2 мин.
Meta представила умные AR-очки Ray-Ban Display со встроенным дисплеем и браслетом в придачу 4 мин.
Logitech анонсировала игровую гарнитуру Astro A20 X, которая умеет работать с двумя устройствами сразу 12 мин.
За июль роботакси Tesla попали в три ДТП, но компания постаралась замести следы 29 мин.
Huawei представит четыре новых ИИ-ускорителя Ascend за три года, чтобы догнать и перегнать Nvidia 41 мин.
Вы нам — SMR, мы вам — ядерное топливо: американские и британские компании подписали целый ряд соглашению по развитию АЭС для питания ЦОД 2 ч.
Apple рассматривает возможность организации сборки складного iPhone на Тайване и в Индии 3 ч.
За пять лет количество расследований в сфере промышленного шпионажа на Тайване выросло на 31 % 3 ч.
Alibaba удалось разработать ИИ-чип T-Head PPU, сопоставимый по характеристикам с Nvidia H20 7 ч.
Новая статья: Обзор «золотого» блока питания GamerStorm PQ1000G (PQA00G-FD) с разъемом 12V-2x6 11 ч.