从内核模式执行用户模式可执行文件

问题描述

| 我正在为我们的驾驶员团队构建一个硬件模拟器。现在,模拟器分为两个模块: 第一个模块以内核模式运行在驱动程序内部,这是驱动程序和HW-Simulator之间的主要接口。 第二个模块是可执行的用户模式代码,它为模拟器生成数据,并通过调用
DeviceIOControl
将其传输到模拟器(在Windows API下) 我的需要是:我希望能够从内核模式内执行用户模式可执行文件。而且我需要能够以相对便携的方式来做到这一点。目前,我仅在Windows上运行,但应该会很快改变。 此外,我需要能够通过它的“ 1”管道与用户模式代码进行通信,以便重新配置它并最终将其关闭。 我找到了这个: 从内核空间执行用户空间功能 但这仅与linux内核有关。有更便携的选择吗?还是Windows替代? 我可以仅使用ShellExecute / RunAs API函数在Windows中执行此操作吗? 注意:我们知道从内核空间调用用户模式代码会涉及安全风险。但是由于这仅是为了用作测试环境,并且永远不会到达我们的发布代码,因此我们不担心。     

解决方法

Windows内核中没有干净的方法可以做到这一点。用于创建进程的用户模式API CreateProcess使用未记录的API(NtCreateProcess / NtCreateThread)来创建进程。 推荐的做法是拥有一个“伙伴服务”,这是一个用户模式的服务,可以使用IOCTL与驱动程序进行通信。您可以使用反向调用模型来让驱动程序调用您的服务以使其创建进程。     ,确实,没有任何记录的方法可以在不触发用户模式的情况下创建进程。 但是,如果您不想创建用户模式应用程序,则有一种未公开的棘手方法: 要创建有效的win32进程,驱动程序必须与CSRSS通信(未记录)。 您可以排队用户模式的APC,在任何现有过程的上下文中为APC代码分配一些虚拟内存。此代码应只调用CreateProcess以及您想要的其他任何内容。