ReadProcessMemory无法与UTF16字符串一起正常使用

时间:2019-04-07 15:22:45

标签: c++

我正在学习C ++,并且在弄乱Win32 api,尤其是ReadProcessMemory。

所以我试图从记事本中读取文本,我已经使用作弊引擎找到了该地址。 文本在Windows UTF16中

这是我用来阅读文字的代码:

#include "pch.h"
#include <string>
#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
    LPCVOID Addr = (LPCVOID) 0x1711B91E610;
    HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, false, 9948);

    u16string data[29];

    if (!handle) {
        exit(0);
    }

    ReadProcessMemory(handle, Addr, &data, 29, 0);
    cout << data << endl;

    cin.get();
}

我期望得到这个Hello world!zzzzzeeeeeezzzees 但是,我得到了:00000053A7EFF260

我在做什么错?谢谢

编辑:尝试了wcout,也无法正常工作

每次运行程序时,我都会得到不同的十六进制值,那是什么?

2 个答案:

答案 0 :(得分:1)

首先请检查您的地址两次,ReadProcessMemory的第4个参数采用要读取的字节数,在这种情况下,字符串中的每个字符为2字节宽,因此必须传递2 * 29 = 58作为大小,最后不要使用C ++字符串,因为在这种情况下,您需要一个简单的数据缓冲区来将数据复制到其中,而u16string是具有其他属性和方法的复杂对象。

u16string data[29];

此行不会创建包含29个字符的字符串,但会创建29个字符串对象,因此请改用以下内容:

wchar_t data[30];
data[29] = L'\0';

分配30表示终止字符串的空字符。

要打印宽字符,请使用:

wcout << data << endl;

答案 1 :(得分:0)

u16string data[29];是一个由29个u16string对象组成的数组,它不是一个长度为29个字符的单个u16string,就像您认为的那样。

此外,nSize的{​​{1}}参数期望一个 byte 计数,而不是一个 character 计数。 UTF-16使用2个字节的字符。

尝试以下方法:

ReadProcessMemory()