SetWindowsHookEx - внедрение Dll пропускает первые несколько вызовов

Я пытаюсь использовать SetWindowsHookEx для захвата вызовов API в java.dll.

Поэтому я создал еще одну dll и внедрил ее во все остальные процессы, используя setwindowsHookEx.

g_hHook = SetWindowsHookEx(WH_CALLWNDPROC, JLoadSetFunc, g_hHookDll, 0)

Проблема следующая:

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

Итак, проблема в том, что мой механизм перехвата пропускает первые несколько вызовов перехваченного API.

Пожалуйста, предложите или прокомментируйте эту проблему, чтобы направить меня. Я ужасно застрял с этим.


person Community    schedule 15.06.2009    source источник
comment
DLL загружается, как только основной поток процесса получает сообщение через оконную процедуру. Если это произойдет после вызова функции, которую вы хотите отслеживать, вы пропустите некоторые вызовы. Попробуйте newgre.net/ninjectlib   -  person newgre    schedule 15.06.2009
comment
Есть ли решение вышеуказанной проблемы? Вы использовали ninjectlib раньше? Это стабильно?   -  person    schedule 15.06.2009
comment
Ваш DllMain вызывается после нескольких функций, о которых вы говорите? в противном случае вы должны иметь возможность перехватывать/переписывать IAT в основной Dll. Ваш процесс для внедрения dll начинается после целевого процесса?   -  person AppDeveloper    schedule 17.06.2009


Ответы (3)


Я предлагаю следующее:

  1. Зарегистрируйте свой хук, используя SetWindowsHookEx()
  2. SendMessage() удаленному процессу со специальным сообщением, которое понимает только ваш хук
  3. Повторяйте это, пока ваш крючок не ответит
  4. Вызовите код, с которым вы хотите, чтобы ваш хук взаимодействовал

Короче говоря, подождите, пока хук завершит установку, прежде чем пытаться его использовать.

person Gili    schedule 19.06.2009

@MSalters

Небольшая поправка: не в каждый процесс - он загружается только в процессы, которые импортируют/используют user32.dll, и не все процессы его используют (однако я согласен, что большинство процессов его используют).

Дополнительные сведения см. в разделе Работа со значением реестра AppInit_DLLs.

person Community    schedule 22.07.2009

Есть ужасно грязный хак для загрузки DLL в каждый процесс с использованием ключа реестра: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs

person MSalters    schedule 15.06.2009
comment
IIRC это было отключено в Vista - person Anders; 16.06.2009