Название объясняет все это действительно, у меня есть процесс, подключающийся к другому процессу. Мне нужно иметь возможность получить GetModuleHandle в этой программе для определенной библиотеки DLL, которая не является стандартом Windows, и у меня нет исходного кода для основной программы.
Мне нужно использовать его для вызова экспортированной функции с GetProcAddress и, в конце концов, использовать его в CreateRemoteThread для удаленного запуска задачи в этой программе.
В любом случае я могу получить ModuleHandle из другой программы, вместо локальной программы, с которой он создает удаленный поток?
Благодарю.
Я вижу три возможных решения этого. Насколько я знаю, нет Windows API, который позволяет вам получить адрес функции для модуля в другом процессе.
Решение 1:
Самым простым решением, IMO, является внедрение DLL в целевой процесс и получение всей необходимой информации из самого целевого процесса. Есть много разных способов получить вашу DLL в целевой процесс, мой любимый Отражающая DLL инъекция.
Решение 2:
Решение 2 использует EnumProcessModules ( использование ) выбрать HMODULE
ссылки из другого процесса. Вы не можете использовать их в звонках GetProcAddress
непосредственно. Способ обойти это — загрузить DLL в ваш процесс, используя LoadLibraryEx( "MODULE_NAME", NULL, DONT_RESOLVE_DLL_REFERENCES )
, Это при успешной загрузке модуля предоставит вам HMODULE
экземпляр, который вы можете передать GetProcAddress
,
Адрес вернулся с GetProcAddress
допустимо только для вашего адресного пространства, но, к счастью, это также относительно базы модуля. Вычитая HMODULE
ссылка с адреса, а затем добавить его в HMODULE
Ссылка в целевом процессе, вы получите адрес функции в целевом процессе.
Пример: targetProc = myProc - myModule + targetModule;
где myProc является char *
и myModule и targetModule являются HMODULE
,
Решение 3:
Решение 3 — самое сложное для реализации ИМО. Это решение требует, чтобы вы прочитали память процесса цели, чтобы найти требуемые модули, а затем проанализировали модули, чтобы найти адреса функций.
Ресурсы для этого решения можно найти Вот а также Вот.
Я лично не тестировал ни решение 2, ни 3, но теоретически они должны работать. Я использовал решение 1 лично, и рекомендовал бы это как способ достигнуть этого. Два других решения требуют много стандартного кода для эмуляции существующих методов Windows API.