读取进程内存无法正常工作,使用 UTF16 字符串

ReadProcessMemory not working properly with UTF16 string

本文关键字:工作 使用 字符串 UTF16 内存 取进程 常工作 读取      更新时间:2023-10-16

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

所以我正在尝试从记事本中读取文本,我已经使用作弊引擎找到了地址。文本采用视窗 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,也不起作用

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

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

u16string data[29];
此行不会创建包含 29

个字符的字符串,但它会创建 29 个字符串对象,因此请改用如下所示的内容:

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

分配 30 用于终止字符串的空字符。

要打印宽字符字符,请使用:

wcout << data << endl;

u16string data[29]; 是一个包含 29 个u16string对象的数组,它不像你想象的那样是一个长度为 29 个字符的单个u16string

此外,ReadProcessMemory()nSize 参数需要字节计数,而不是字符计数。UTF-16 使用 2 字节字符。

试试这个:

#include "pch.h"
#include <string>
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
    LPCVOID Addr = reinterpret_cast<LPVOID>(0x1711B91E610);
    HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, false, 9948);
    if (!handle) {
        return 0;
    }
    u16string data(29, u'');
    // or:
    // u16string data; data.resize(29);
    ReadProcessMemory(handle, Addr, &data[0], 29*sizeof(char16_t), 0);
    wcout << reinterpret_cast<const wchar_t*>(data.c_str()) << endl;
    cin.get();
    return 0;
}