Как перехватить вызовы методов dll?

Как перехватить вызовы методов dll?

  • Какие методы доступны для этого?
  • Можно ли это сделать только на C/C++?
  • Как перехватить вызовы методов от всех запущенных процессов к данной dll?
  • Как перехватить вызовы методов из заданных процессов в заданную dll?

person Daniel Silveira    schedule 21.10.2008    source источник
comment
Перехватывать изнутри приложения, загрузившего DLL, или извне? Внешне к конкретному процессу или ко всем процессам? Вы могли бы гораздо лучше сформулировать свой вопрос! ;)   -  person TheSoftwareJedi    schedule 21.10.2008
comment
На какой язык и платформу Windows вы хотите ориентироваться?   -  person Chris Pietschmann    schedule 21.10.2008


Ответы (4)


Есть два стандартных способа, которые я могу придумать для этого.

  • Хук таблицы импорта DLL.
    Для этого нужно разобрать PE Header DLL, найти таблицу импорта и написать адрес своей функции вместо того, что там уже написано. Вы можете сохранить адрес исходной функции, чтобы иметь возможность вызвать ее позже. Ссылки во внешних ссылках этой статьи в Википедии должны предоставить вам всю информацию, необходимую для сделать это.

  • Прямая модификация кода. Найдите фактический код функции, которую вы хотите перехватить, и измените ее первые коды операций, чтобы перейти к вашему собственному коду. вам нужно сохранить код операции, который был там, чтобы они в конечном итоге были выполнены. Это проще, чем кажется, в основном потому, что оно уже было реализовано не менее чем самой Microsoft в виде обходных путей. библиотека.
    Это очень хорошая вещь. с помощью всего пары строк кода вы можете, например, заменить все вызовы GetSystemMetrics(), скажем, из Outlook.exe и наблюдать за происходящими чудесами.

Преимущества одного метода являются недостатками другого. Первый метод позволяет вам добавить хирургическую ловушку именно к той DLL, которую вы хотите, где все другие библиотеки DLL проходят незацепленными. Второй метод позволяет вам использовать самый глобальный хук для перехвата всех вызовов функции.

person shoosh    schedule 21.10.2008
comment
Разве это не огромный риск для безопасности? Разве это не дает никому возможности делать что-либо в приложении? - person Micah; 21.10.2008
comment
Я попытался изменить код функции, но это привело к ошибке нарушения прав доступа. Есть ли какие-либо детали, которые должны быть исправлены раньше? - person Emmanuel Caradec; 26.09.2009
comment
Отвратительный. Голос награжден! - person meawoppl; 10.04.2015

При условии, что вы заранее знаете все функции DLL, можно написать собственную DLL-оболочку, которая будет перенаправлять все вызовы функций в настоящую DLL. Эта DLL не обязательно должна быть написана на C/C++. Все, что вам нужно сделать, это соответствовать соглашению о вызове функций исходной DLL.

person Ates Goral    schedule 21.10.2008
comment
Хорошо... Но как заставить запущенные процессы вызывать мою dll вместо оригинальной? - person Daniel Silveira; 21.10.2008
comment
Если вы поместите свою DLL-оболочку в ту же папку, что и исполняемый файл, исполняемый файл должен выбрать вашу DLL вместо той, что находится в Windows/System32 и т. д. - person Ates Goral; 21.10.2008
comment
Верно ли это и для системных библиотек DLL, то есть для user32.dll и других? - person Demiurg; 04.02.2011
comment
Насколько я видел, это верно для всех DLL. - person Ates Goral; 04.02.2011

См. Microsoft Detours для библиотеки с C/C++ API. Немного нетривиально внедрить его во все другие программы, не запуская антивирусные сканеры/детекторы вредоносных программ. Но ваш собственный процесс — честная игра.

person MSalters    schedule 21.10.2008

В Linux это можно сделать с помощью переменной окружения LD_PRELOAD. Установите эту переменную так, чтобы она указывала на общую библиотеку, содержащую символ, который вы хотите переопределить, а затем запустите приложение.

person dicroce    schedule 21.10.2008