C ++ перехватывает dll? - PullRequest
       17

C ++ перехватывает dll?

8 голосов
/ 26 января 2010

Есть ли быстрый способ зацепить dll в c ++? Я знаю, что есть Microsoft Detours , но разве нет быстрого способа просто подключить несколько функций DLL?

Например, я хочу подключить функцию void mytestfunction() в dll mytestdll.dll к hook_mytestfunction().

Заранее спасибо!

Ответы [ 5 ]

4 голосов
/ 26 января 2010

Вероятно, самый простой способ - поместить вашу собственную DLL-оболочку с тем же именем в каталог EXE и поместить копию подключенной DLL в тот же каталог с новым именем. Затем в IAT вашей DLL-библиотеки-обёртки перенаправьте любой не перехваченный вызов в обернутую DLL-библиотеку (пересылка экспорта) и самостоятельно внедрите другие.

Чтобы перенаправить функции, поместите в файл .DEF следующую строку: Foo=wrapped_mytestdll.Foo, где Foo - это (искаженное) имя функции, а wrapped_mytestdll - это новое имя скопированной DLL.

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

(с тех пор я нашел ссылку на инструмент для создания базового файла ".DEF", но сам не проверял его. Используйте на свой страх и риск.)

3 голосов
/ 26 января 2010

Я полагаю, если вы подключаете DLL, вы подключаете экспорт этой DLL?

В этом случае вы можете выполнить простой перехват IAT (и, возможно, EAT, если необходимо).

Преимущество перехватчиков IAT / EAT по сравнению с обходом состоит в том, что применение и удаление перехватчиков безопасны на 100% (поскольку вы не заменяете код, вы заменяете указатель, поэтому нет шансов на состояние гонки. ), и это легко сделать и на нативных процессах x64 (чего не может сделать библиотека Microsoft Detours, если вы не выделите 10 штук для версии Prof).

Да, существуют сторонние библиотеки обхода, которые поддерживают x64 и позаботятся о большинстве условий гонки и о чем-то еще, но некоторые из них действительно дороги, а с другими просто больно работать.

IAT / EAT-хуки бывают быстрыми и легкими, и пример кода для их выполнения доступен в книге "Windows через C / C ++" (наряду с множеством мест на межсетевых страницах).

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

3 голосов
/ 26 января 2010

Обходы - это быстрый и простой способ!

2 голосов
/ 02 ноября 2010

Просто вызовите GetProcAddress (hDll, "mytestfunction") и напишите туда jmp hook_mytestfunction, затем поместите инструкции при запуске mytestfunction в hook_mytestfunction.

Это действительно быстро и легко, конечно, если вы понимаете это. Если нет - используйте MS Detours или другую библиотеку. Обычно вы можете сделать это, не понимая, как это работает.

2 голосов
/ 02 ноября 2010

Я использовал это несколько раз назад с успехом:

http://software.intel.com/en-us/articles/intercepting-system-api-calls/

Тем не менее, я нашел его в Google и смог найти что-то новое в проекте кода с отличными оценками:

http://www.codeproject.com/KB/winsdk/LibMinHook.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...