我可以在正在運行的進程中注入一個鉤子,以便在創建,銷燬,最大/最小時捕獲。但是我還沒有想出一種方法來抓住一個新流程的創建,以便我能夠將我的注入注入到這一過程中。 有誰知道完成這個最好的方法?是否可以全局掛鉤創建窗口,以便可以控制窗口放置在屏幕上的位置?
1
A
回答
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,但這幾乎肯定是錯誤的方法。
相關問題
- 1. 是否可以創建比屏幕更大的窗口?
- 2. 可可:在屏幕上設置窗口的位置
- 3. C++:全局鼠標掛鉤並重置窗口的位置
- 4. 是否可以在窗口或window.location上創建原型?
- 5. Android:是否可以在對話框上創建彈出窗口
- 6. 是否可以在JavaFX2的主窗口區域中創建多個子窗口?
- 7. 是否可以在JS下載窗口?
- 8. 如何在Win32控制檯窗口上設置CBT掛鉤?
- 9. cv2.imshow圖像窗口放置位於可視屏幕之外
- 10. 是否可以在最大窗口後恢復窗口狀態?
- 11. 在R中,是否可以設置開羅窗口的標題?
- 12. 是否可以在Windows登錄屏幕上顯示我的窗口?
- 13. HTML:是否可以在拖放文件上傳後創建彈出窗口?
- 14. 我可以在屏幕上移動pygame遊戲窗口(pygame)
- 15. 是否可以從.net更改控制檯窗口的圖標?
- 16. 是否可以關閉主SWF窗口?
- 17. 是否可以區分窗口拆分?
- 18. 可以自行控制應用程序創建窗口?
- 19. 屏幕右下角的位置窗口
- 20. 屏幕上的哪個位置可以放置admob廣告?
- 21. JFrames可以放在父窗口中嗎?
- 22. 創建窗口到屏幕
- 23. 在製作新的繪圖窗口時,可以在屏幕上指定位置嗎?
- 24. 窗口在可可的位置
- 25. 是否可以使用QML創建新窗口
- 26. 可可調整窗口大小以適合屏幕
- 27. 在用戶屏幕上設置窗口的默認位置
- 28. 是否可以在特定的屏幕位置和窗口大小下啓動GWT?
- 29. 你可以控制Javascript創建的窗口顯示在哪個顯示上嗎?
- 30. 在透視控制窗口中播放mediaelement全屏幕電話
問題的標題與您的問題不一樣。如果你想掛鉤窗口創建,那麼這可能是http://stackoverflow.com/questions/7019523/monitor-creation-of-a-window-hwnd – tinman