2011-08-11 50 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,但這幾乎肯定是錯誤的方法。

相關問題