Можно ли подключить создание окон глобально, чтобы я мог контролировать, где окна размещены на экране?

Я могу ввести хук в запущенные процессы, чтобы ловить их при создании, уничтожении, макс / мин. Но я не нашел способа поймать создание нового процесса, чтобы я мог внедрить в него свой хук. Кто-нибудь знает лучший способ сделать это?

3 ответа

Решение

SetWindowsHookEx - ваше самое простое решение.

Если вы не против расстроить антивирусное программное обеспечение, вы также можете внедрить DLL в каждый процесс, который затем подключит CreateProcess (для внедрения DLL в дальнейшие процессы) и CreateWindowEx (для ваших целей).

РЕДАКТИРОВАТЬ: Я просто прочитал ваш вопрос полностью. Да, вы захотите просто подключить CreateProcessW и внедрить вашу ловушку в будущие процессы.

РЕДАКТИРОВАТЬ #2: Я вчера фактически работал над чем-то вроде этого, поэтому какой-то код, который делает то, что вы хотите.

#include <windows.h>

// call GetModuleFileNameto get the full path of the module before installing the hook
static LPWSTR lpszDllName;

HMODULE LoadModuleEx(__in HANDLE hProcess, __in_z LPCTSTR lpcszDll)
{
  DWORD   cdwSize;
  LPVOID  lpvAllocation;
  HANDLE  hThread;
  HMODULE hRet;

  cdwSize = lstrlen(lpcszDll) + 1;
  cdwSize *= sizeof(TCHAR);

  lpvAllocation = VirtualAllocEx(hProcess, NULL, cdwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  if (lpvAllocation != NULL)
  {
    if (WriteProcessMemory(hProcess, lpvAllocation, lpcszDll, cdwSize, NULL))
    {
      hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibrary, lpvAllocation, 0, NULL);
      if (hThread != NULL)
      {
        GetExitCodeThread(hThread, (LPDWORD)&hRet);
        CloseHandle(hThread);
      }
    }
    VirtualFreeEx(hProcess, lpvAllocation, cdwSize, MEM_DECOMMIT);
  }
  return hRet;
}

// hook future process creation - install this hook on top of CreateProcessW
// I'd suggest using Microsoft Detours [http://research.microsoft.com/en-us/projects/detours/]
BOOL WINAPI CreateProcessWHook(__in_opt LPCWSTR lpApplicationName, __inout_opt LPWSTR lpCommandLine, __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, __in BOOL bInheritHandles, __in DWORD dwCreationFlags, __in_opt LPVOID lpEnvironment, __in_opt LPCWSTR lpCurrentDirectory, __in LPSTARTUPINFO lpStartupInfo, __out LPPROCESS_INFORMATION lpProcessInformation)
{
  // create the process suspended
  if (dwCreationFlags & CREATE_SUSPENDED != CREATE_SUSPENDED)
    dwCreationFlags |= CREATE_SUSPENDED;

  // call original CreateProcessW
  BOOL bRet = _CreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
  if (bRet)
  {
    // inject DLL
    LoadModuleEx(lpProcessInformation->hProcess, lpszDllName);

    // resume thread
    ResumeThread(lpProcessInformation->hThread);
  }

  return bRet;
}

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

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

Вы хотите использовать системный хук, используя SetWindowsHookEx, Это позволит вам обеспечить обратный вызов, когда приложения (например) создадут окно.

Другие вопросы по тегам