2010-12-27 1 views
0

Итак, у меня есть DLL, введенная в адресное пространство целевого процесса. Как вернуть список функций, предоставляемых dll, которые использует целевой процесс, скажем, user32.dll; затем скажем, что user32.dll содержит функцию, называемую (int test1 (str 1, str 2)) (я знаю, что это не так), и я хочу назвать эту функцию, как бы мне это сделать?В другом адресном пространстве процесса, вызывающем функции в dll, как

Спасибо.

ответ

2

Вам действительно нужно делать все, что вы написали? Получение списка экспортируемых функций с помощью dll не является тривиальным, после получения адреса модуля в памяти вам нужно пройти несколько структур данных в формате PE, что не так просто сделать вручную (хотя DbgHelp functions автоматизирует большую часть процесса) ,

С другой стороны, если вы просто хотите проверить, загружена ли dll и вызвать одну из ее функций, работа становится легкой.

Если вам все равно, нужно ли загружать dll, просто позвоните LoadLibrary и получите ручку модуля; в противном случае вызовите сначала GetModuleHandle, который предоставит вам дескриптор модуля, если он загружен, NULL, если это не так, и, если вы хотите продолжить, после этого вызова LoadLibrary (LoadLibrary) увеличивает количество ссылок на DLL, так что вы конечно, dll не будет разгружаться тем временем).

Затем, чтобы проверить, присутствует ли процедура и получить ее адрес, используйте GetProcAddress; обратите внимание, что обычно C-функции, подобные тем, которые экспортируются в DLL-файлы Windows, экспортируются только по их имени, а не по их подписи (в C-перегрузке не существует); если вы хотите вызывать процедуры C++, экспортированные с украшенными именами, вы должны указать искомое имя.

GetProcAddress вернет вам указатель, который вам нужно будет отнести к указателю функции с правильной подписью вашей функции; теперь вы закончили, просто используйте его для вызова функции и не забудьте позвонить FreeLibrary, чтобы уменьшить ссылочный счетчик в dll.

Обратите внимание, что все эти вещи не могут быть сделаны безопасно изнутри DllMain вашей введенной функции; см. here.

+0

Чтобы ответить на ваши вопросы, да. Я ухожу, и я расскажу вам, как далеко я нахожу :) – flavour404

+0

@ flavour404: ну, тогда вы должны действительно изучить функции DbgHelp; делать эту работу вручную не невозможно, но она довольно подвержена ошибкам. –

0

Первый подход заключается в использовании DependencyWalker. Вы получите весь импорт каждой DLL в процессе. Конечно, этот подход не будет охватывать динамические вызовы с помощью LoadLibrary/GetProcAddress, но для его покрытия вам нужно будет подключить LdrLoadDll/GetProcAddress, чтобы получить точные функции, которые использует процесс/dll. Это не большое дело, но требуется некоторое время.