Что такое ГМОДУЛЬ? - PullRequest
       1

Что такое ГМОДУЛЬ?

12 голосов
/ 03 марта 2012

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

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

Ответы [ 3 ]

11 голосов
/ 03 марта 2012

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

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

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

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

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

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

4 голосов
/ 03 марта 2012

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

1 голос
/ 03 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...