c++ - 访问任何进程的内存

标签 c++ winapi memory-management kernel antivirus

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

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

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

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

  2. 我听说应用程序可能会挂接某些 API,从而阻止其他应用程序使用这些功能。 VirtualQueryEx 可能会卡在那个过程中吗?这就是我一直被拒绝访问的原因?如果是这样的话,我怎么能解开它呢?

  3. 反病毒软件不太可能做到这一点,但是简单的 DLL 注入(inject)会起作用吗?我的意思是,如果我能够将 dll 注入(inject)该进程,那么在我的 dll 中我就已经拥有该进程的虚拟地址空间,那么读取它的内存应该不是问题?

  4. 另一种方法?

我将非常感谢在这件事上的任何提示和帮助!

最佳答案

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

  2. 是的,这是可能的。全局 Hook API 的一种方法是编写重定向 API 调用的驱动程序。另一种方法是全局或有针对性的 dll 注入(inject)来 Hook API 调用。后者您可以使用调试器检查。如果内核重定向调用,您只能通过自己进入内核来检测。

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

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

关于c++ - 访问任何进程的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18905955/

相关文章:

c++ - 在 C++ 中获取一个只有一次有效的锁

c++ - std::cout 是否有返回值?

c++ - SDL 窗口在启动时关闭并返回 0

捕获窗口像素而不考虑其 z 顺序

c++ - GetWindowlong 检查按钮样式

winapi - 如何找出应用程序消耗了多少地址空间并将其报告给用户?

c++ - 输入之前声明的 char* 会使程序崩溃,而将其输入 'just-declared' char* 则不会。为什么?

c# - 可用页面文件大小/虚拟内存

c - 在 Linux 设备驱动程序中使用 do_mmap()

c++ - 使 2 个非静态字段(即动态数组)使用彼此靠近的内存