将Ctrl + C注入到目标进程中

我有一个通过调用SetConsoleCtrlHandler有一个CtrlBreak处理程序的SetConsoleCtrlHandler 。 此处理程序侦听CTRL_BREAK_EVENT并执行一些操作(不退出)。 此过程不附加到控制台。 我们称之为目标进程。

接下来,我写了一个单独的程序,它需要一个PID,我想在kernel*!CtrlRoutine的地址上启动一个远程线程,以便执行目标进程的CtrlBreak处理程序,例如:

 hRemoteThread=CreateRemoteThread(hRemoteProc, NULL, 0, (LPTHREAD_START_ROUTINE)dwEntryPoint, (void *)CTRL_BREAK_EVENT, CREATE_SUSPENDED, NULL); ResumeThread(hRemoteThread); 

问题是,如何在远程进程( dwEntryPoint )中findkernel*!CtrlRoutine的地址?

我看到一个例子,程序注册了自己的CtrlBreakHandler,然后使用__asm获取地址,但是这个代码在Windows 2008 Server上不能正常工作。

只需要注意,我不能重新编译目标进程,所以我必须在不修改目标进程的情况下执行此操作。

Microsoft为此提供了一个GenerateConsoleCtrlEvent函数 。

您可以使用DLL注入技术来实现这一点。 你首先创建一个DLL的DLLMain,注册Ctrl-break处理程序。 然后打开目标进程,并使用VirtualAllocEx和WriteProcessMemory在其地址空间中写入DLL的路径。 然后,以LoadLibrary为入口点,以DLL路径的地址为参数,在目标进程中启动远程线程。

这会导致您的DLL被加载到目标进程中,并调用DLLMain来注册CtrlHandler。

只有当您的应用程序有特权才能写入目标进程时,您才可以执行上述所有操作。

你可以参考这个链接的示例代码。

您可以使用sendmessage API将WM_KEYDOWN和WM_KEYUP事件发送到窗口句柄