2012-03-03 2 views
10

У меня есть небольшая проблема. Я загрузил DLL в процесс (это не мое), и я должен использовать функцию внутри него. У меня есть смещение этой функции, поэтому мне нужно только получить DLL-адрес и добавить его в смещение, чтобы перейти к функции. GetModuleHandle() возвращает HMODULE переменная, но на самом деле я не знаю, что такое HMODULE. Является ли это адресом загруженной DLL или какой-либо другой марки?Что такое HMODULE?

И если это не адрес места, где загружается DLL, как я могу получить этот адрес? Надеюсь, я проясню ситуацию.

ответ

8

Метод, который вы предлагаете, будет работать нормально.

Кажется, что вы ввели dll в целевой процесс и хотите получить адрес функции в этой DLL в целевом процессе из процесса, который ввел dll.

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

Поскольку DLL, которую вы ввели, не может быть загружена по тому же адресу в целевом процессе, что и в процессе инъекции, вы не можете просто использовать адрес, который вы получили бы от вызова GetProcAddress, от функции в процессе инъекции ,

HMODULE - это только базовый адрес библиотеки DLL (см. this answer). Таким образом, вы можете взять HMODULE из dll в процессе инъекции и вычесть его из адреса, возвращаемого GetProcAddress, в вашу функцию. Затем вы можете добавить HMODULE вложенной DLL в целевом процессе к этому смещению, чтобы получить адрес целевой функции в инклинированной DLL в целевом процессе. Предполагая, что эта функция имеет правильную подпись, передайте ее как функцию потока для вашего вызова, чтобы создать удаленный поток, и теперь вы запускаете целевую функцию в целевом процессе.

Я объясняю это более подробно в this answer.

+0

Спасибо. У меня другая проблема. Когда я делаю это -> http://wklej.org/id/700802/, я получаю неправильную сумму. Должен ли я сделать это так -> http://wklej.org/id/700803/ ?? – Blood

+0

@Blood: Ни одна из этих вещей не имеет никакого смысла. Вы добавили смещение (чтобы перейти от базы к функции), но забыл вычесть его (чтобы получить базу в первую очередь). См. Мой ответ. Поскольку вы должны делать то и другое, и они отменяются, вы можете просто не беспокоиться. –

+0

Дэвид, единственный раз, когда он отменяется, - это если DLL загружается с одним базовым адресом в обоих процессах. В противном случае мой ответ будет работать, а ваш не будет :). –

4

Звоните GetProcAddress. Смещение отменяется, так как вам нужно будет как добавить его (чтобы перейти к функции), так и вычесть его (чтобы получить базовый адрес), чтобы вы могли не беспокоиться.

1

Он похож на void*, возвращаемый функцией POSIX dlopen() (может быть, eben будет typedef, но я точно не знаю). Вы передаете его в GetProcAddress в качестве аргумента. Вэнь вы закончили, вы также передаете его FreeLibrary, чтобы выгрузить DLL.

+0

typedef void * HANDLE; typedef HANDLE HMODULE; поэтому HMODULE недействителен *. – quantum

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