【问题标题】:Getting access to any process's memory访问任何进程的内存
【发布时间】:2013-09-19 22:28:23
【问题描述】:

我使用的是 Windows 8 64 位。我知道 C++ 和汇编的基础知识。如果我要写一个杀毒程序,它应该可以访问任何进程的内存,对吧?我已经设法使用 VirtualQueryEx 和 ReadProcessMemory 编写了一个能够读取大多数进程内存的程序。但是,我遇到了一个不允许我使用 VirtualQueryEx 的应用程序。即使具有调试权限,它也会因访问被拒绝错误而失败。

我可以做些什么来使自己能够使用 VirtualQueryEx 访问进程的内存?或者我应该采取其他方法来访问这些难以访问的进程吗?

我已经做了一些研究,想知道我应该采用哪种方法:

  1. 我发现可以在内核模式下读取任何内存而没有任何限制。真的吗?但在内核模式下,没有诸如 VirtualQueryEx 或 ReadProcessMemory 之类的函数。我想我需要自己实现它们?但是我看到有人认为这样的功能非常不稳定,将来我可能会得到一个 BSOD 或……有人说我什至不应该使用内核模式来读取内存。有人可以回答我这个内核模式的实际情况吗?

  2. 我听说应用程序可能会挂钩某些 API,以防止其他应用程序使用这些功能。 VirtualQueryEx 可能会在那个过程中被钩住吗?这就是我一直被拒绝访问的原因?如果是这种情况,我怎么能解开这个?

  3. 防病毒软件可能不会这样做,但简单的 DLL 注入会起作用吗?我的意思是,如果我能够将 dll 注入该进程,那么在我的 dll 中,我已经使用了该进程的虚拟地址空间,那么读取它的内存应该不是问题吗?

  4. 另一种方法?

如果在这件事上提供任何提示和帮助,我将不胜感激!

【问题讨论】:

  • 严重的防病毒软件需要的不仅仅是访问进程的内存。这是一项重大事业。如果你一个人做这件事,你成功的机会微乎其微。
  • 正如 Mike W 所说,它非常复杂。是的,如果您试图在内核模式下读取另一个进程的内存,而该进程的内存正在被换入/换出,您可能会得到 BSOD,或者更糟糕的是,导致内存损坏。
  • “拒绝访问”进程是否在SYSTEM或其他高权限帐户下运行?如果您的应用程序在非提升或较低权限的帐户中运行?这可以解释为什么你不能访问它的内存。
  • 我不知道它的权限,但这不是我试图访问的系统进程。是的,我以管理员权限运行我的程序。 @MatsPetersson 在阅读它的记忆帮助之前冻结整个过程吗?我听说有未记录的 API 可用于冻结整个过程
  • 不,因为它不是(必然)决定哪些内存可用和哪些不可用的过程。

标签: c++ winapi memory-management kernel antivirus


【解决方案1】:
  1. 是的,这是可能的,但它会非常乏味且容易出错。它不会像 VirtualQueryEx/RPM 那样简单。我实际上只是确保我的用户模式应用程序有足够的权限来执行 API 调用,而不是读取内核中的内存。此外,您无法在 64 位 Windows 上轻松加载自制驱动程序。您要么需要签署驱动程序(需要花钱),要么在 Windows 中发现一些安全漏洞(或以不安全模式启动机器)。

  2. 是的,这是可能的。全局挂钩 API 的一种方法是编写一个重定向 API 调用的驱动程序。另一种方法是全局或目标 dll 注入来挂钩 API 调用。后者您可以使用调试器进行检查。如果内核重定向调用,你只能通过自己在内核中检测到。

  3. 我怀疑这是否可行,因为您需要更多 进程权限来注入 dll,而不是查询/读取一些内存。如果您想读取特定的已知应用程序,您可以尝试让目标加载您的 dll,方法是为它加载的某些 dll 编写一个包装器并替换原来的。

  4. 您确定需要从此进程读取内存吗?是系统进程、空闲进程、CSRSS中的任何一个都无法从用户模式打开吗?您是否尽可能地降低了您要求的权利?它认为你只需要 PROCESS_QUERY_INFORMATION 和 PROCESS_VM_READ。

【讨论】:

    猜你喜欢
    • 2010-12-31
    • 1970-01-01
    • 2017-11-18
    • 2013-03-24
    • 2019-08-07
    • 2017-10-20
    • 1970-01-01
    • 2021-04-18
    • 2016-08-11
    相关资源
    最近更新 更多