Я изучаю С++ и возился с API Win32, особенно с ReadProcessMemory.
Итак, я пытаюсь прочитать текст из блокнота, я нашел адрес с помощью Cheat Engine. Текст в 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, &data, 29, 0);
заполняет данные?
@Eljay Ну, [29] должен объявить длину строки, я полагаю? Поскольку моя строка 29 символов
"Ну, [29] должно объявить длину строки, я полагаю?" Вы полагаете неправильно.
Сначала дважды проверьте свой адрес, 4-й аргумент ReadProcessMemory принимает количество байтов для чтения, и в этом случае каждый символ в вашей строке имеет ширину 2 байта, поэтому вам нужно передать 2 * 29 = 58 в качестве размера и, наконец, не используйте строку C++, потому что в этом случае вам нужен простой буфер данных для копирования данных, а u16string — это сложный объект с другими атрибутами и методами.
u16string data[29];
Эта строка не создает строку из 29 символов, но создает 29 строковых объектов, поэтому вместо этого используйте что-то вроде этого:
wchar_t data[30];
data[29] = L'\0';
Выделение 30 предназначено для нулевого символа, завершающего строку.
Для печати широких символов используйте:
wcout << data << endl;
u16string data[29];
— это массив из 29 u16string
объектов, это не один u16string
длиной 29 символов, как вы думаете.
Кроме того, параметр nSize
функции ReadProcessMemory()
ожидает количество байт, а не количество персонаж. 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;
}
Возможный дубликат Как я могу вывести значения wchar_t на консоль?