C++ 访问任何进程';记忆

C++ 访问任何进程';记忆,c++,winapi,memory-management,kernel,antivirus,C++,Winapi,Memory Management,Kernel,Antivirus,我使用的是64位Windows 8。我知道C++和汇编的基础知识。如果我要写一个反病毒程序,它应该能够访问任何进程的内存,对吗?我已经使用VirtualQueryEx和ReadProcessMemory编写了一个能够读取大多数进程内存的程序。然而,我遇到了一个不允许我使用VirtualQueryEx的应用程序。即使具有调试权限,它也会因拒绝访问错误而失败 我可以做些什么来使用VirtualQueryEx访问进程的内存吗?或者我应该采取其他方法来访问这些难以访问的流程 我已经做了一些研究,想知道应

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

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

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

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

  • 我听说应用程序可能会钩住一些API,从而阻止其他应用程序使用这些功能。VirtualQueryEx可能会在这个过程中被吸引住吗?这就是我一直被拒绝访问的原因?如果是这样的话,我怎么能解开这个

  • 反病毒不太可能做到这一点,但简单的DLL注入会起作用吗?我的意思是,如果我能够将dll注入到那个进程中,那么在我的dll中,我已经使用了那个进程的虚拟地址空间,所以读取它的内存应该不会有问题吧

  • 另一种方法

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

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

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

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

  • 您确定需要从此进程读取内存吗?是否有任何系统进程、空闲进程、CSRSS无法从用户模式打开?您是否尽可能降低了所请求的权限?它认为您只需要处理、查询和读取信息


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