访问任何进程的内存

时间:2013-09-19 22:28:23

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

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

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

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

  1. 我遇到的信息是,可以在没有任何限制的情况下以内核模式读取任何内存。真的吗?但是在内核模式下,没有像VirtualQueryEx或ReadProcessMemory这样的函数。我想我需要自己实施它们?但是我已经看到这些函数非常不稳定的意见,并且将来我可能会得到一个BSOD或......某些人说我甚至不应该使用内核模式来读取内存。有人可以回答这个内核模式究竟是怎么回事?

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

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

  4. 另一种方法?

  5. 我真的很感激这方面的任何提示和帮助!

1 个答案:

答案 0 :(得分: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。