3 回答
TA贡献1829条经验 获得超13个赞
在深入了解调试器之后,我发现实际执行与ctrl中断等信号相关的行为的入口点是核32!ctrlRoutine。该函数与ThreadProc具有相同的原型,因此可以直接与CreateRemoteThread一起使用,而无需注入代码。然而,这不是一个出口的符号!它位于不同版本的Windows上不同的地址(甚至有不同的名称)。该怎么办?
这是我最后想出的解决办法。我为我的应用程序安装了一个控制台ctrl处理程序,然后为我的应用程序生成一个ctrl中断信号。当调用我的处理程序时,我会回顾堆栈的顶部,找出传递给内核32!BaseThreadStart的参数。我获取第一个Param,它是所需的线程开始地址,它是内核32!CtrlRoutine的地址。然后我从我的处理程序返回,表明我已经处理了信号,我的应用程序不应该被终止。回到主线程中,我将等待内核32!CtrlRoutine的地址被检索。一旦我得到了它,我就在目标进程中创建一个远程线程,并使用已发现的开始地址。这将导致对目标进程中的ctrl处理程序进行评估,就好像ctrl中断已被按下一样!
好的是,只有目标进程受到影响,任何进程(即使是加窗口的进程)都可以成为目标。一个缺点是我的小应用程序不能在批处理文件中使用,因为它会在发送ctrl中断事件时杀死它,以便发现kernel 32!ctrlRoutine的地址。
start
TA贡献1775条经验 获得超8个赞
添加回答
举报