如何读取另一个进程内存中的每个字节?

时间:2013-04-12 03:24:49

标签: c++ windows debugging winapi readprocessmemory

我们如何读取进程内存中的每个字节?在我们完成阅读之后,我们如何对该过程进行“十六进制”转储?

举个例子:

处理A.exe:

00400000: 00 00
00400002: 74 05
...

扫描:

00 74 05 ...

将A.exe转储到A.txt:

00 74 05

我的编译器是visual c ++ 2010,我打算编写一个win32应用程序,它将使用这个函数。我将要使用的操作系统是Window 8.但是,我的应用程序应该适用于Windows 8和至少Window XP。

到目前为止,这就是我所拥有的......

#include <windows.h>

void ScanForBytes( const char* TargetName, DWORD dwFromAddress, DWORD dwToAddress ) {
    HANDLE hProc; // I guess we will be needing the handle to the process.
   //And this is where I stopped and asked for help...
}

int main() {
   ScanForBytes( "Chrome.exe", 0x00400000, 0x00400001 );
   return 0;
}

1 个答案:

答案 0 :(得分:2)

您正在寻找的功能是ReadProcessMemory。您可以找到该函数的文档here on MSDN

此函数将特定进程的指定地址范围内的数据复制到指定的缓冲区中。您需要确保您的应用程序以适当的权限运行才能执行此操作。通常,这是调试权限 - 只有调试器需要读取和/或修改其他进程的私有内存。如果您在整个指定的内存块中没有所需的权限,则该功能将失败。您将找到有关访问权限here on MSDN的更多信息。如果您还不熟悉此处的安全模型,我建议您仔细阅读该文档。

当然,您的过程还需要匹配您希望读取其内存的进程的位数。换句话说,如果您想从Chrome进程中读取内存,Chrome会被编译为32位应用程序,因此您的应用程序也需要成为一个应用程序。如果要从另一个64位应用程序转储内存,则需要重新编译为64位应用程序。这在MSDN页面上绊倒了许多评论者。

不言而喻,您需要检查所有返回值并适当地处理错误。这种事情应该预期在常见条件下失败。

成功返回ReadProcessMemory后,您指定的数组将包含请求的数据。从那里开始,只需要用它做任何你想做的事情,比如把它写成文本文件。