You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 17:48:20