|
||
|
||
Недокументированные функции в ОС Windows 9x/NT/2000, поиск и практическое использование |
||
Начать наверное надо с того, зачем
вообще искать ф-ции, которые
производитель официально не
задокументировал? Бытует мнение, что
использование недокументированных ф-ций,
как и опереатора goto это плохой стиль. Я
как программист-практик не вижу ничего
плохого в том, что бы заменить несколько
операторов сравнения на один оператор
безусловного перехода, то же и в
отношении недокументированных ф-ций.
Есть ситуации когда просто необходимо
знать больше чем это позволяет
официальная документация, например при
написании программ, тесно работающих с
системой - системных утилит. Возьмите к
примеру известный всем пакет Norton Utilities,
вы думаете старик Питер (ну конечно это
не он писал этот пакет, но все же)
пользовался только Win 32 SDK и MSDN Universal (или
может Professional, как я)? Заявляю почти как
Станиславский - не верю! Есть масса
примеров того, что знание и
использование недокументированных ф-ций
позволяет сократить время и повысить
качество разработки. Конечно во всем
надо знать меру, нельзя слепо надеятся
на то, что производитель ОС оставит
недокументированную ф-цию в следующей
версии или не изменит ее синтаксис. Все
очень сильно зависит от того, что это за
ф-ция, как она реализована и т.п. Хотя
есть так же масса примеров тому, что ф-ция
была не документированной в старой
версии ОС, а потом, в новой версии, стала
вполне обычной API-шной ф-цией (так было с
несколькими ф-циями в NT3 при переходе на
NT4). Буду считать, что дальнейшая
агитация за недокументиованные ф-ции не
нужна и перейду к тому, как собственно я
ищу их в ОС производства компании Microsoft..
Оговорюсь с самого начала, что я не буду углубляться в долгие и нудные листинги дизассемблеров, дампы отладчиков и т.п. изыски, а затрону лишь основы, с целью донести до читателей технологию поиска и иследования внутренностей ОС. У меня есть несколько принципов, которые я стараюсь блюсти - все, что я хочу найти в ОС нужно мне для решения какой-либо задачи, т.е. я не стараюсь найти все то, что спрятали в Microsoft; я не люблю изобретать велосипед, если есть возможность найти необходимую информацию не прибегая к реверс-инжинирингу, лучше воспользоваться этой возможностью; если есть два решения поставленной задачи - одно красивое и документированное, а второе не красивое зато использует недокументированную ф-цию, то я выбираю документированное т.к. моя цель написать максимально работоспособный и легко читаемый код. Итак, надо определиться чего мы хотим. Затем необходимо провести тщательный сбор данных по нашей проблеме, всегда существует вероятность того, что кто-то когда-то уже сталкивался с такой же проблемой и возможно нашел решение. Начинать поиск лучше со специализированных сайтов по программированию, вот очень краткий перечень моих любимых сайтов: http://www.sysinternals.com/
- сайт Марка Руссиновича и Брюса Когвела,
скажем так - не самые последние люди в
нашем деле; Огромным хранилищем информации являются ньюсгруппы, поиск по ним лучше всего вести используя сервер www.deja.com, только не забудьте включить в поиск все данные, а не только новые (по умолчанию поиск ведется только по новым). Конечно существуют еще и обычные книги,
их не так много по нашей тематике. Я могу
рекомендовать следующие книги: Нельзя забывать про 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). Очень важный момент в исследовании ОС это аккуратная систематизация всех найденных ф-ций и структур, надо тщательным образом собирать и хранить любую информацию - потом она может стать ключем к восстановлению какой-либо функции. Автор: Ашот
Оганесян |
||
|
||
Copyright © 1999-2000гг. "Internet Zone" & Nik Romanov. nikspase@mail.ru, nikspase@hotmail.ru, http://www.izone.com.ua/ | ||
Копирование и использование данных материалов разрешается только в случае указания на журнал "Internet Zone" как на источник получения информации, при этом во всех ссылках обязательно явное указание адреса вэб-сайта http://www.izone.com.ua/. |