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