Операция "Перехват" A.M.D.F. (grunge@amdf.pp.ru) Хакер, номер #070, стр. 070-082-3 Закончив с Блокнотом, я решил поиздеваться еще над какой-нибудь программой. Мне захотелось перехватить функцию CreateProcessA, которая отвечает за запуск программ в файловом менеджере FAR. Тем самым я нарушил пункт 8 лицензии этой программы, в чем искренне раскаиваюсь :). У меня уже был готов работающий исходник для Блокнота, и переделать его для FAR не составляло труда. Я заменил первый параметр функции CreateProcessA на C:\winnt\notepad.exe. В FAR'е это стало очень забавно работать: какой exe-файл ни пытаешься запустить - всегда запускается Блокнот :). Не все так просто Неудивительно, что у меня все получилось как по маслу, - ведь я тестировал программу в тепличных условиях. В реальности перехватить ту или иную функцию бывает не так-то легко. Вот какие могут возникнуть проблемы: 1) Программа может быть сжата. Утилиты для сжатия вроде UPX обычно сжимают PE-файлы вместе с разделом импорта, после чего ты не сможешь в нем что-то менять. Для опытов с такими программами необходимо их сначала распаковать, благо в интернете навалом распаковщиков :). 2) Программа может не содержать раздела импорта совсем, например если она написана на ассемблере или если состоит из байт-кода, а все функции за нее вызывает виртуальная машина (Java, C#). 3) Может использоваться динамическая загрузка. Программа может загружать библиотеку с помощью LoadLibrary, а адрес функции получать через GetProcAddress. В этом случае придется перехватывать уже LoadLibrary и GetProcAddress (которые точно будут в разделе импорта) и подставлять там нужные адреса. 4) Иногда возникает необходимость заменить функцию, не зная ни списка ее параметров, ни типа возвращаемого результата. Это может быть одна из недокументированных функций из ntdll.dll или какая-нибудь функция от программистов, создавших подопытную программу. Тебе придется полазить по интернету в поисках прототипа загадочной процедуры или действовать методом научного тыка. В любом случае, эксперименты с чужими программами помогут тебе лучше понять логику их работы, узнать много новых API-функций. При исследовании можно неожиданно наткнуться на одну-единственную стандартную процедуру, которая выполняет абсолютно то же, что и написанные тобой 20 килобайт кода. Я столкнулся с такой ситуацией: мне было необходимо сделать в моем приложении запрос к DNS, для этого я сначала написал код для поиска в реестре адреса текущего DNS-сервера. Затем я написал огромную процедуру, которая формировала этот самый DNS-запрос, открывала сокет, отсылала UDP-пакет и анализировала приходящий ответ. Через некоторое время я посмотрел на раздел импорта программы nslookup и узнал, что весь мой код заменяется лишь одной API-функцией DnsQuery_A из стандартной библиотеки dnsapi.dll. На нашем диске ты найдешь исходный код библиотеки xaklib.dll и программы для запуска xakprog.exe. Ты сможешь модифицировать их для замены других функций в других программах. Надеюсь, эксперименты с программами принесут тебе реальную пользу. |