Jenter Алекс
Шрифт:
ВОПРОС-ОТВЕТ
Как подменить функцию API?
Автор: Павел Блудов
Демонстрационное приложение (WTL Dialog) HookAPI (100kb) Требует наличия звуковой карты. Методы 3, 4 и 5 не будут работать под windows9x/ME.
Демонстрационное приложение (WTL Dialog) HookAPI2 (20kb) Требует наличия WinSockets 1.0.
Теперь если в коде программы встретится MessageBeep препроцессор заменит ее на нашу MyMessageBeep. Очень просто.
Но что если хочется добавить немного своей логики в уже откомпилированный код, изменить работу чужой библиотеки, пересобрать которую нет никакой возможности? Иными словами, заставить уже откомпилированный код вызвать нашу функцию вместо стандартной. Это вполне реально. Давайте поближе рассмотрим, как под Windows процедуры одного модуля используют процедуры другого.
Весь API, доступный из какого-либо модуля, описан в так называемой таблице экспорта этого модуля. С другой стороны, список API, необходимый для нормальной работы опять-таки, любого модуля, находится в его таблице импорта.
Код вызова процедуры из другого модуля выглядит примерно так:
И, если изменить значение по этому адресу, можно подменить оригинальнкю функцию своей. Для этого нам понадобится:
• Отыскать таблицу импорта функций для нужного нам модуля
• Отыскать там указатель на перехватываемую функцию
• Снять с этого участка памяти утрибут ReadOnly
• Записать указатель на нашу функцию
• Вернуть защиту обратно