将Ctrl + C注入目标进程

时间:2010-10-21 13:52:12

标签: c++ windows

我有一个通过调用SetConsoleCtrlHandler来拥有CtrlBreak处理程序的进程。此处理程序侦听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);

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

我看到一个示例,其中程序注册了自己的CtrlBreakHandler,然后使用__asm向上走到堆栈以获取地址,但此代码在Windows 2008 Server上无法正常工作。

请注意,我无法重新编译目标进程,因此我必须在不修改目标进程的情况下执行此操作。

3 个答案:

答案 0 :(得分:3)

Microsoft为此提供了GenerateConsoleCtrlEvent function

答案 1 :(得分:1)

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

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

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

您可以参考this link获取示例代码。

答案 2 :(得分:0)

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