2010-02-07 4 views
3

Я хочу перехватить загрузку dll, чтобы я мог их использовать. Моя первая идея заключалась в том, чтобы зацепить GetProcAddress. Удивительно, что, подключив его, я могу только перехватывать вызовы, сделанные в процессе, который владеет моей библиотекой. (Я открыл еще исполняемые файлы, которые требуют GetProcAddress и эти вызовы не получить перехвачены) (я предполагаю, потому что она динамически скомпилирован с моей Lib)Использование API API для перехвата загрузки DLL (только для Windows)

Пример вывода:

C: \ Windows \ syswow64 \ kernel32.dll Module32NextW

C: \ Windows \ syswow64 \ kernel32.dll CreateToolhelp32Snapshot

C: \ Windows \ system32 \ dinput.dll DirectInputCreateW

C: \ Windows \ SysWOW64 \ ntdll.dll DirectDrawCreate

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

В принципе, я хочу иметь возможность называть GetModuleInformation для любой загруженной dll.

+0

Дубликат http://stackoverflow.com/questions/873658/how-can-i-hook-windows-functions-in-c-c и многие другие подобные вопросы. – mghie

+3

Я не знаю, следует ли мне называть вас именами или игнорировать вас. Я не хочу знать, как перехватывать функции. Я хочу знать, какие функции следует использовать для перехвата загрузки Dll. – user246100

ответ

3

Во-первых, что вы делаете, для чего нужен глобальный крюк?

Если вы хотите быть уведомили, что DLL загружена в любой процесс, вы можете посмотреть в PsSetImageLoadNotifyRoutine, который является режимом режима ядра. Несмотря на то, что он является режимом ядра, его не очень сложно использовать, и писать базовый драйвер довольно забавно.

Другим способом было бы заставить нагрузку вашей библиотеки в каждом процессе. Существует множество методов, один из наиболее законных - Windows Message hooks.

+1

Привет. Я только что видел ваш ответ, извините за это. Это предназначено для перехвата загрузки игры, а затем для изменения ее работы. Как и читы. Я видел код, который обнаруживает его, используя постоянный цикл и обнаружив, что внутри него был создан процесс (по имени). Я искал более чистый способ сделать это, и ваше предложение о базовом драйвере Windows кажется приятным. Спасибо! – user246100

0

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

+0

Вопрос был: как сделать его «общесистемным». – user246100

+0

Любой крючок, который вы установили в своем процессе, не копируется из-за возможности копирования на запись. Чтобы перехватить код по всему миру, вам нужно вставить себя глобально. –