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