Что такое HMODULE?

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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