общесистемный хук для 64-битных операционных систем - PullRequest
2 голосов
/ 28 февраля 2011

Я хочу выполнить перехват всей системы (используя SetWindowHook) в 64-битной операционной системе.

Я знаю, что 64-битные процессы (= proc64) могут загружать только 64-битные dll (= dll64) и 32-битные процессы (= proc32) может загружать только 32-битные dll (= dll32).

В настоящее время я планирую вызвать SetWindowHook дважды, один раз с dll32 и один раз с dll64, ожидая, что proc64s загрузит dll64, а proc32s загрузит dll32 (в то время как dll32 для proc64s и dll64 для proc32s потерпит неудачу).

Это правильный способ сделать это, или есть "более правильный" способ сделать это?

Спасибо!: -)

Ответы [ 3 ]

1 голос
/ 28 февраля 2011

Подход, который вы описали, является правильным и задокументированным.

С http://msdn.microsoft.com/en-us/library/ms644990(v=vs.85).aspx:

SetWindowsHookEx можно использовать для внедрения DLL в другой процесс.32-битная DLL не может быть внедрена в 64-битный процесс, а 64-битная DLL не может быть внедрена в 32-битный процесс.Если приложение требует использования хуков в других процессах, требуется, чтобы 32-разрядное приложение вызывало SetWindowsHookEx для внедрения 32-разрядной DLL в 32-разрядные процессы, а 64-разрядное приложение вызывало SetWindowsHookEx для внедрения 64-разрядногоDLL в 64-битных процессах.32-разрядные и 64-разрядные библиотеки DLL должны иметь разные имена.

Обратите внимание на последнее утверждение, что имена 32-разрядных и 64-разрядных библиотек DLL ДОЛЖНЫ отличаться.

0 голосов
/ 28 февраля 2011

Возможно, вы захотите взглянуть на EasyHook , чтобы избавить себя от целой кучи неприятностей.

0 голосов
/ 28 февраля 2011

Вы должны проверить машину в своем коде, чтобы увидеть, является ли длина слова 32 или 64 бит. 64-битный компьютер будет обрабатывать 32-битные наборы команд путем расширения длины слов, но 32-битный компьютер, которому передан 64-битный набор инструкций ... может привести к действительно плохим вещам.

В заголовке limit.h стандартной библиотеки C - INT_MAX даст вам максимальный размер, протестируйте его, чтобы увидеть

bool is32 = true;

if ( INT_MAX == 2^63 − 1 ) {
  is32 = false;
}

Когда у вас есть свой флаг, вы будете знать, какой файл включать, и вы можете использовать свой флаг, чтобы включить его в.

...