X64-DLL, внедренная в x64-процесс, перехватывающий x86-DLL, терпит неудачу, используя C ++ и EasyHook - PullRequest
4 голосов
/ 24 июня 2011

x64-DLL, внедренная в x64-процесс, перехватывающий x86-DLL, не работает с C ++ и EasyHook.Это работает, если Loader, InjectionLibrary и InjectionTarget (это доступно в обеих версиях, и мне нужно, чтобы оба были подключены), x86.Получение адреса экспортируемой процедуры (сам GetProcAddress) не является проблемой в x64.InjectionTarget также имеет зависимость HookTarget (Kernel32.dll) в x64.LhInstallHook (...) возвращает STATUS_NOT_SUPPORTED, где исходные комментарии говорят, что происходит, когда: «Целевая точка входа содержит неподдерживаемые инструкции.»

Из-за того, что источник подходит для сборок x86, я решилне добавлять его.

Я поцарапал небольшую диаграмму enter image description here

1 Ответ

6 голосов
/ 24 июня 2011

Вы не можете использовать 32-битную DLL в 64-битном процессе, и это действительно обобщает - вы не можете смешивать и сопоставлять код x86 и x64, один процесс либо полностью x64, либо полностью x86.Это фундаментально для x86-64, и с этим ничего не поделаешь.В консоли управления Windows они создают 64-битный процесс и 32-битный процесс и используют IPC для управления 32-битным процессом для загрузки и обработки всех 32-битных расширений оболочки.Вы можете попробовать нечто подобное, если вы храбры и / или отчаянны.

Редактировать: Подожди минуту, подожди минуту.Не могли бы вы немного подробнее описать этот процесс, когда в режиме x86 все работает нормально?Например, X загружает функцию из Y, я делаю Z, потому что кажется, что я не понимаю, что вы делаете.

У вас есть цель для инъекции и внедренная DLL, из которой вы 'пытается вызвать процедуры в сторонней DLL-библиотеке x86-only.Таким образом, нормальный поток вызовов идет из InjectionTarget -> InjectionLibrary -> HookTarget -> ExportedProcedure.И это не работает для вас, потому что HookTarget только для x86, и вы не можете это изменить, поэтому, когда вы перекомпилируете InjectionLibrary для x64 для x64-версии InjectionTarget, он больше не работает, потому что ваш x64 InjectionLibrary пытается загрузитьx86 HookTarget.

Единственное решение этой проблемы - создать процесс x86 и использовать межпроцессное взаимодействие, чтобы заставить его вызывать процедуры в HookTarget, которые вы хотите вызвать.Если вы не можете перекомпилировать HookTarget для x64, то это единственный способ .

...