读取进程内存无法正常工作,使用 UTF16 字符串
ReadProcessMemory not working properly with UTF16 string
我正在学习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;
}
相关文章:
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 使用移动和复制语义时函数匹配如何工作?
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- 我想使用此代码单击某个特定窗口,但它无法正常工作
- C++代码停止工作错误使用cout内部函数
- 系统( "pause" ) 即使使用正确的标头也无法正常工作
- Visual Studio 2019:使用 vcvars64 从命令行构建C++.bat不再工作
- 使用 stl 库创建图形是如何工作的?
- 不使用与左右停止工作命名空间 std 的简单比较
- 为什么在C++中使用关系运算符创建的模板函数不能对字符串正常工作?
- ZeroMQ 在使用 std::thread 创建工作线程时崩溃
- 为什么使用 exec() 重新启动程序不能正常工作?
- 使用程序生成来创建磁盘,但纹理无法正常工作
- 使用 std::atomic 标志和 std::condition_variable 在工作线程上等待
- 试图弄清楚我需要做哪些更改才能使代码正常工作.使用Visual Studio
- 在新作用域中使用unique_lock是否等效于在使用共享资源的工作结束时解锁调用
- boost信号和插槽在不同的线程中不工作(使用boost::asio::io_service)
- 无法使派生的 WebDuino 类工作 - 使用 'Web_HelloWorld.ino' 编译错误
- 代码不工作.使用栈
- 此数组转换如何工作(使用字符串从小写到大写)