ReadProcessMemory读取自定义程序字符串返回空值问题
ReadProcessMemory读取字符串返回空的问题修复
核心问题分析
你直接将std::string对象的地址传给ReadProcessMemory是错误的。std::string是C++的字符串容器,它内部并非直接存储字符数据,而是通过指针指向堆上的缓冲区。直接读取到std::string对象本身,只会破坏其内部结构,无法正确获取目标进程的字符串内容。
另外你计算string_bytes的18没有明确依据,需要根据目标进程中字符串的编码类型(ANSI/Unicode)来正确计算字节数。
修正后的代码示例
假设目标进程中的字符串是**Unicode(宽字符)**类型,修正代码如下:
// 输入字符串长度 int string_length = 0; cout << "String Length: "; cin >> string_length; // 计算所需字节数:宽字符每个占2字节,加上终止符\0的2字节 int string_bytes = (string_length + 1) * sizeof(wchar_t); // 分配足够的缓冲区 wchar_t* buffer = new wchar_t[string_length + 1]; memset(buffer, 0, string_bytes); // 读取到缓冲区 BOOL rpmReturn = ReadProcessMemory(hProcess, (LPCVOID)memoryAddress, buffer, string_bytes, NULL); if (rpmReturn == FALSE) { cout << "ReadProcessMemory failed. GetLastError = " << dec << GetLastError() << endl; delete[] buffer; system("pause"); return EXIT_FAILURE; } // 转换为std::string(如果需要) std::wstring read_wstring(buffer); std::string read_string(read_wstring.begin(), read_wstring.end()); cout << "string = " << read_string << endl; // 释放缓冲区 delete[] buffer;
如果目标是ANSI字符串,则使用char缓冲区:
int string_length = 0; cout << "String Length: "; cin >> string_length; int string_bytes = string_length + 1; // 加上终止符\0的1字节 char* buffer = new char[string_length + 1]; memset(buffer, 0, string_bytes); BOOL rpmReturn = ReadProcessMemory(hProcess, (LPCVOID)memoryAddress, buffer, string_bytes, NULL); if (rpmReturn == FALSE) { cout << "ReadProcessMemory failed. GetLastError = " << dec << GetLastError() << endl; delete[] buffer; system("pause"); return EXIT_FAILURE; } std::string read_string(buffer); cout << "string = " << read_string << endl; delete[] buffer;
额外注意事项
- 确认
memoryAddress确实指向目标进程中字符串的起始地址,地址错误也会导致读取为空或乱码。 - 读取前确保目标进程处于可读取状态,且你的进程有足够权限(比如以管理员身份运行)。
- 如果不确定目标字符串的编码,可以先读取部分字节,通过判断是否有间隔的
\0来区分Unicode和ANSI。
内容的提问来源于stack exchange,提问作者Teer 2008
相关产品推荐
相关产品推荐

