【问题标题】:Executing a user-mode executable from kernel-mode从内核模式执行用户模式可执行文件
【发布时间】:2011-09-01 21:31:34
【问题描述】:

我正在为我们的司机团队构建一个硬件模拟器。现在,模拟器分为2个模块: 第一个模块在驱动程序内部以内核模式运行,这是驱动程序和硬件模拟器之间的主要接口。 第二个模块是一个可执行的用户模式代码,它为模拟器生成数据并通过调用DeviceIOControl(在windows API下)将其传输到模拟器

我的需要是:我希望能够从内核模式中执行用户模式可执行文件。而且我需要能够以相对便携的方式做到这一点。目前我只在 Windows 上运行,但这应该很快就会改变。 此外,我需要能够通过它的stdin 管道与用户模式代码进行通信,以便重新配置它并最终关闭它。

我发现了这个: Executing a user-space function from the kernel space

但它只与 linux-kernel 相关。有没有更便携的选择?还是 Windows 替代品?

我可以在 Windows 中通过简单地使用 ShellExecute/RunAs API 函数来执行此操作吗?

注意:我们知道从内核空间调用用户模式代码所涉及的安全风险。但由于这只是用作测试环境,永远不会到达我们的发布代码,所以我们并不担心。

【问题讨论】:

  • 我怀疑你会找到一种“可移植”的方式来做内核级的事情。
  • @casablanca:很公平。那么我如何在 Windows 中实现这一点呢?
  • 哦,我自己也不知道答案,那只是一个评论。 :)

标签: c++ windows kernel kernel-mode usermode


【解决方案1】:

在 Windows 内核中没有一种干净的方法可以做到这一点。用于创建进程的用户模式 ​​API CreateProcess 使用未记录的 API (NtCreateProcess/NtCreateThread) 来创建进程。

推荐的做法是使用“合作伙伴服务”,这是一种使用 IOCTL 与您的驱动程序通信的用户模式服务。您可以使用inverted call model 让您的驱动程序调用您的服务以使其创建一个进程。

【讨论】:

    【解决方案2】:

    确实,如果不从用户模式触发进程创建,没有任何记录方法可以做到这一点。

    但如果您不想创建用户模式应用程序,则有一种未记录的棘手方法:

    要创建有效的 win32 进程,驱动程序必须与 CSRSS 通信(未记录的内容)。

    您可以将用户模式 ​​APC 加入队列,在任何现有进程的上下文中为 APC 代码分配一些虚拟内存。这段代码应该简单地调用 CreateProcess 和你想要的任何东西。

    【讨论】:

      猜你喜欢
      • 2018-06-05
      • 2018-11-01
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 2020-01-06
      • 1970-01-01
      • 2015-01-19
      • 2013-10-04
      相关资源
      最近更新 更多