Архивы: по дате | по разделам | по авторам

По ту сторону Win API

Архив
автор : Андрей Васильков   16.10.2002

Большинство программ пишутся коллективами разработчиков, из-за чего возрастает количество ошибок. Часть из них впоследствии признаются полезными и получают название "недокументированных функций". Некоторые особенности программ создатели предпочитают изначально хранить в секрете от широкой публики. Также существуют не описанные в официальных источниках функции. О них мы и поговорим.

Не баг это,
а недокументированная функция!
Стандартная отговорка
работников техподдержки


Большинство программ пишутся коллективами разработчиков, из-за чего возрастает количество ошибок. Часть из них впоследствии признаются полезными и получают название «недокументированных функций». Некоторые особенности программ создатели предпочитают изначально хранить в секрете от широкой публики. Также существуют не описанные в официальных источниках функции. О них мы и поговорим.

Возьмем самое известное семейство операционных систем - Windows - и разберем его Win API. Точнее, ту часть, которая скрыта от нелюбознательных глаз. Для меня безопасность стоит во главе угла, так как если она реализована неграмотно, остальное теряет смысл. Как вы знаете, Win95/98 хранит пароли в так называемом password list, который представляет собой файл с расширением .pwl. Конечно, открыв его в текстовом редакторе, сами пароли не увидишь. Использовано шифрование, хотя и примитивное. Однако Windows при запуске загружает в оперативную память все пароли из этого файла уже в незашифрованном виде. Microsoft даже позаботилась (уж не знаю о ком) и добавила в Windows 95 функцию WnetEnumCachedPasswords, с помощью которой можно легко получить их из памяти. Слава богу, хватило ума убрать ее из релиза OSR2.

Может сложиться впечатление, что недокументированные функции (далее - НДФ) только вредят пользователю. Ведь у тех, от кого скрывают информацию, отношение к ней всегда отрицательное. Однако НДФ могут и помочь в создании компактного кода, упростив процесс его написания. Иногда без них вообще трудно обойтись, - просто потому, что аналогов среди общеизвестных функций нет. Главное свойство человеческой памяти - забывать. В том числе и собственные ключи. Бытует шутка, что пользователь отличается от хакера тем, что последний подбирает пароль за секунды, а первый вводит известный за минуты. Всем знакомы программы для восстановления «забытых» паролей. Чем, скажите, вы заменили бы в них ту же WnetEnumCachedPasswords? Дампом памяти? Не смешно. Исчерпывающим перебором? Некрасивое решение. А преодоление криптозащиты .pwl-файла хоть чуть-чуть, но сложнее. Те программы, которые тонко взаимодействуют с системой и аппаратной частью (дисковые утилиты, твикеры, системы контроля доступа etc.), почти всегда написаны с использованием тех или иных НДФ.

В связи со специфическим отношением к покупке ПО у российских пользователей отладчик SoftIce стал для многих привычным инструментом. Обычно «альтернативный метод регистрации» программ сводится к замене одного байта: условие для лицензионного ключа «если равно» меняется на «если не равно». После этого подправленная программа регистрируется на любую абракадабру, кроме настоящего ключа. Но условным переходам в любой программе несть числа. Чтобы найти среди них нужный, в простейшем случае вводят любую последовательность символов в окошко регистрации и ловят вызов функции MessageBoxA. Поднимитесь в коде чуть выше и попадете на фрагмент, отвечающий за обработку введенного ключа. Само собой, такое положение дел не устраивало разработчиков shareware ПО, и они пытались делать проверку иначе. Поэтому, если SI не сработала на стандартную MessageBoxA, можно попробовать поймать вызов недокументированной - hmemcpy. Она используется для копирования памяти. Думаю, вы уже сменили гнев на милость по отношению к НДФ.

Возникает вопрос: как вообще узнают о существовании недокументированных функций? Что ж, если исходники кода недоступны, на помощь приходят методы Reverse Engineering. Берем стандартный джентльменский набор: отладчик SoftIce, дизассемблер IDA Pro и удобный компилятор, и начинаем исследовать какую-нибудь стандартную программу из состава ОС. Ашот Оганесян советует начать с Task Manager из Windows NT/ 2000 Debug Checked Build. Подсчитывается количество инструкций push перед вызовом функции и восстанавливается количество передаваемых ей параметров. Далее определяются типы и (возможно) значения параметров на основе данных о содержимом стека до и после вызова функции. Недостающие параметры можно восстановить методом «черного ящика»: пишется тестовая программа, задействующая исследуемую функцию, и анализируется ее реакция при подаче «на вход» разных параметров. Заключительные этапы: проверка и описание (надо же доделать работу за программистов Microsoft). При желании можно поделиться плодом своих трудов с заинтересованной общественностью, чтобы она (общественность) не «изобретала велосипед».

Крис Касперски написал интересную статью «Вирусы в скриптах IDA», где, в частности, говорится, что IDA PRO имеет НДФ _peek и _poke, читающие и записывающие физическую память. Следовательно, с их помощью можно передать управление на свой код. Это сильно облегчает задачу написания скрипт-вирусов для IDA, работоспособных даже за пределами виртуальной машины. Набор их действий может быть любым, а в силу распространенного заблуждения об ограниченности пределов среды скрипт-вирусов им уделяется крайне мало внимания среди разработчиков AV ПО.

Под Windows NT/2000 тоже существует множество НДФ. К примеру, ProbeForWrite проверяет доступность участка памяти из UserMode на возможность записи в него. Множество вирусов выдают себя, конфликтуя в системе с другими приложениями. Эта функция может позволить зловредной программе работать аккуратнее - не пытаясь писать данные в занятую область памяти. ZwFsControlFile используется для посылки FSCTL (File System Control) команд драйверу файловой системы. PsCreateSystemProcess фактически создает поток в контексте ядра. Способы их использования зависят лишь от вашей фантазии.

И все же, несмотря на ряд дополнительных возможностей, которые предоставляют НДФ, не стоит их использовать без крайней необходимости. Во-первых, учитывая метод обнаружения и исследования, есть основания сомневаться в точности их описания (хотя бы на первых порах). Во-вторых, нет гарантии, что в следующих версиях средств разработки или операционных систем они останутся с тем же синтаксисом (и будут присутствовать вообще). Например, в Visual Basic есть такие НДФ, как VarPrt, VarPrtArray, VarPrtStringArray, ObjPrt и StrPrt. Они позволяют получать значения адреса памяти, где хранятся соответствующие переменные, и сильно упрощают работу с буферами. Однако Microsoft заявила, что их исключат из Visual Basic.NET, на который программистам рано или поздно придется перейти, прихватив с собой свои листинги. Разумеется, если листинги содержат хотя бы одну из этих функций, под VB.NET программа не скомпилируется.

© ООО "Компьютерра-Онлайн", 1997-2018
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.