我正在学习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,也无法正常工作
每次运行程序时,我都会得到不同的十六进制值,那是什么?
答案 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()