【问题标题】:ReadProcessMemory not working properly with UTF16 stringReadProcessMemory 无法与 UTF16 字符串一起正常工作
【发布时间】:2019-08-28 20:14:14
【问题描述】:

我正在学习 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,也无法正常工作

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

【问题讨论】:

  • @GSerg 不是重复的。 wcout 没有改变任何东西......
  • 你认为u16string data[29]; 是做什么的? ReadProcessMemory(handle, Addr, &amp;data, 29, 0); 如何填充数据?
  • @Eljay 好吧 [29] 是声明我想的字符串的长度?因为我的字符串是 29 个字符
  • “嗯[29]是声明字符串的长度我猜?”你猜错了。

标签: c++


【解决方案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;

【讨论】:

    【解决方案2】:

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

    此外,ReadProcessMemory()nSize 参数需要 byte 计数,而不是 character 计数。 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'\0');
        // 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      • 2020-10-12
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多