-1

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

例如:

进程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;
}
4

1 回答 1

2

您正在寻找的功能是ReadProcessMemory. 您可以在 MSDN 上找到该功能的文档。

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

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

不用说,您需要检查所有返回值并适当地处理错误。这种事情在一般情况下应该会失败

成功返回后,您指定的数组将ReadProcessMemory包含请求的数据。从那里开始,您可以随心所欲地使用它,例如将其写入文本文件。

于 2013-04-12T04:48:16.850 回答