2011-08-11 19 views
1

我可以在正在运行的进程中注入一个钩子,以便在创建,销毁,最大/最小时捕获。但是我还没有想出一种方法来抓住一个新流程的创建,以便我能够将我的注入注入到这一过程中。 有谁知道完成这个最好的方法?是否可以全局挂钩创建窗口,以便可以控制窗口放置在屏幕上的位置?

+0

问题的标题与您的问题不一样。如果你想挂钩窗口创建,那么这可能是http://stackoverflow.com/questions/7019523/monitor-creation-of-a-window-hwnd – tinman

回答

4

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; 
} 
0

你会想要使用SetWindowsHookEx系统钩子。这将允许您在应用程序(例如)创建窗口时提供回调。

0

正如其他人所提到的,使用SetWindowsHookEx函数创建一个shell hook可能是最佳解决方案。

如果你真的想要抓住新进程的创建并注入自己的代码,你必须加载一个内核驱动并使用PsSetLoadImageNotifyRoutine,但这几乎肯定是错误的方法。

相关问题