Как перехватить вызовы методов DLL?
- Каковы доступные для этого методы?
- Можно ли это сделать только в C/С++?
- Как перехватить вызовы методов из всех запущенных процессов в данную DLL?
- Как перехватить вызовы методов из заданных процессов в данную DLL?
Как перехватить вызовы методов DLL?
Есть два стандартных способа, которые я могу придумать для этого
Захват таблицы импорта DLL.
Для этого вам нужно проанализировать заголовок PE DLL, найти таблицу импорта и написать адрес вашей собственной функции вместо того, что уже написано там. Вы можете сохранить адрес исходной функции, чтобы позвонить ей позже. Ссылки во внешних ссылках этой статьи wikipedia должны предоставить вам всю информацию, необходимую для этого.
Прямая модификация кода. Найдите фактический код функции, которую вы хотите подключить, и измените первые коды операций, чтобы перейти к своему собственному коду. вам нужно сохранить код операции, который был там, чтобы они в конечном итоге были выполнены. Это проще, чем это звучит в основном потому, что он уже реализован не меньше, чем сами Microsoft, в форме библиотека Detours.
Это очень аккуратная вещь. с помощью всего нескольких строк кода вы можете, например, заменить все вызовы на GetSystemMetrics() из файла outlook.exe и посмотреть чудеса, которые происходят.
Преимущества одного метода - недостатки другого. Первый метод позволяет вам добавить хирургический крючок точно в DLL, в котором вы хотите, чтобы все остальные DLL файлы были удалены. Второй метод позволяет вам наиболее глобальный тип перехвата всех вызовов выполнять функцию.
При условии, что вы знаете все функции DLL заранее, одним из способов является создание собственной DLL-оболочки, которая будет перенаправлять все вызовы функций в настоящую DLL. Эта DLL не должна быть написана на C/С++. Все, что вам нужно сделать, это совместить соглашение о вызове функции исходной DLL.
См. Microsoft Detours для библиотеки с C/С++ API. Это немного нетривиально, чтобы вводить его во все другие программы, не запуская детекторы вирусов/вредоносных программ. Но ваш собственный процесс - честная игра.
В Linux это можно сделать с помощью переменной среды LD_PRELOAD. Установите эту переменную в общую библиотеку, содержащую символ, который вы хотите переопределить, затем запустите приложение.