2008-10-21 9 views
11

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

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

Перехват из приложения, загружающего DLL или извне? Внешне к конкретному процессу или ко всем процессам? Вы могли бы намного лучше сформулировать свой вопрос! ;) – TheSoftwareJedi 2008-10-21 01:58:16

+0

На каком языке и платформе Windows вы хотите настроить таргетинг? – 2008-10-21 01:58:58

ответ

0

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

6

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

+0

Хорошо ... Но как заставить запущенные процессы вызывать мою dll вместо оригинальной? – 2008-10-21 02:40:42

9

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

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

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

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

2

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

Смежные вопросы