В другом адресном пространстве процесса, вызывая функции в dll, как - PullRequest
0 голосов
/ 28 декабря 2010

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

Спасибо.

Ответы [ 2 ]

2 голосов
/ 28 декабря 2010

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

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

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

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

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

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

0 голосов
/ 06 января 2011

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

...