从内核模式执行用户模式可执行文件
我正在为我们的驾驶员团队构建一个硬件模拟器。现在,模拟器分为2个模块: 第一个模块在驱动程序内部以内核模式运行,这是驱动程序和硬件模拟器之间的主要接口。 第二个模块是一个可执行的用户模式代码,它为模拟器生成数据并通过调用DeviceIOControl
(在Windows API下)将其传输到模拟器
我的需求是这样的:我希望能够执行来自内核模式的用户模式可执行文件。我需要能够以一种相对便携的方式做到这一点。目前我只在 Windows 上运行,但这应该很快就会改变。 此外,我需要能够通过它的 stdin 管道与用户模式代码进行通信,以便重新配置它并最终关闭它。
我发现了这个: 从内核空间执行用户空间函数
但它只与 linux 内核相关。有更便携的替代方案吗?或者 Windows 的替代品?
我可以在 Windows 中通过简单地使用 ShellExecute/RunAs API 函数来执行此操作吗?
注意:我们意识到从内核空间调用用户模式代码涉及的安全风险。但由于这仅用作测试环境,并且永远不会达到我们的发布代码,因此我们并不担心。
I'm building a HW-simulator for our driver team. Now, the simulator is devided in to 2 modules:
First module runs inside the driver, in kernel mode and that's where the main interface between the driver and the HW-Simulator.
Second module is an executable user-mode code which generates data for the simulator and transports it to the simulator via calls to DeviceIOControl
(under windows API)
My need is this: I want to be able to execute the user-mode executable from within the kernel-mode. And I need to be able to do this in a relatively portable way. Currently I'm only running on Windows, but that should change soon.
Further more, I need to be able to communicate with the user-mode code via it'sstdin
pipe, in order to reconfigure it and eventually close it.
I found this:
Executing a user-space function from the kernel space
but it's only relevant for the linux-kernel. Is there a more portable alternative? Or a windows alternative?
Can I do this in Windows by simply using the ShellExecute/RunAs API functions?
Note: We are aware of the security risks involved in invoking user-mode code from the kernel-space. But as this is only meant to be used as a test-environment and will not ever reach our release code, then we are not concerned.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在 Windows 内核中没有一种干净的方法可以做到这一点。用户模式 API CreateProcess< /a> 使用未记录的 API 创建进程(NtCreateProcess/NtCreateThread) 创建进程。
建议做的事情是拥有一个“合作伙伴服务”,这是一种使用 IOCTL 与驱动程序进行通信的用户模式服务。您可以使用反向呼叫模型让您的司机致电您的服务机构以获取此服务创建一个流程。
There isn't a clean way to do this in the Windows kernel. The user-mode API CreateProcess to create processes use undocumented APIs (NtCreateProcess/NtCreateThread) to create a process.
The recommended thing to do would be to have a "partner service", a user-mode service that communicates with your driver using IOCTL. You can use the inverted call model to have your driver call your service to have it create a process.
实际上,没有记录的方法可以在不从用户模式触发进程创建的情况下执行此操作。
但是,如果您不想创建用户模式应用程序,则有一种未记录的棘手方法:
要创建有效的 win32 进程,驱动程序必须与 CSRSS 通信(未记录的内容)。
您可以将用户模式 APC 排队,在任何现有进程的上下文中为 APC 代码分配一些虚拟内存。此代码应该简单地调用 CreateProcess 以及您想要的任何其他内容。
Really, there is no documented way to do it without triggering process creation from user-mode.
But there is one undocumented tricky way if You don't want to create user-mode application:
To create a valid win32 process the driver must communicate with CSRSS (what is undocumented).
You can enqueue a user-mode APC, allocate some virtual memory for the APC code in the context of any existing process. This code should simply call CreateProcess and anything else You want.