Перейти к содержанию

Как прочитать строку из памяти C++


Рекомендуемые сообщения

Имеется такой код:

    template <class cData>
    cData Read(DWORD dwAddress)
    {
        cData cRead; //Generic Variable To Store Data
        ReadProcessMemory(hProcess, (LPVOID)dwAddress, &cRead, sizeof(cData), NULL); //Win API - Reads Data At Specified Location 
        return cRead; //Returns Value At Specified dwAddress
    }

Как с помощью него можно считать строку, например имя в игре?

если есть другой код, с радостью приму

Ссылка на комментарий
Поделиться на другие сайты

Я понимаю, что 4 параметром нужно передавать размер, но как-то же Cheat Engine сама определяет размер строки.

 

	char buffer[12] = { 0 };
	ReadProcessMemory(ads, (LPCVOID)0x275A3B5, &buffer, 12, 0);

Функция не может выполнится, вызвав

DWORD err = GetLastError();

возвращает 6

Процесс открыт с PROCESS_ALL_ACCESS

Изменено пользователем fastmailsend
UPD
Ссылка на комментарий
Поделиться на другие сайты

 

	int size = sizeof(string);
	string buffer;
	int returrn = ReadProcessMemory(ads, ((LPCVOID)(baseAddress + 0x105FA0)), &buffer, size, 0);
	DWORD af = GetLastError();
	cout << buffer;

пропускает первые 4 символа и пишет: ошибка при попытке чтения строки

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, partoftheworlD сказал:

Советую начать с https://msdn.microsoft.com/ru-ru/library/3bstk3k5.aspx

 


char buf[24];
ReadProcessMemory(hProcess, reinterpret_cast<PBYTE*>(baseAddress + 0x105FA0), &buf, sizeof(buf), 0);
count << buf << endl;

 

Спасибо! :D Код работает!!! )

Извини, что я туповат, но если строка больше > 24 символов, он же ее не всю считает. Получается надо брать массив с размером

   

2147483647 (максимальное число вместимое int), а весь остаток он забьет нулями, ведь так?

 

 

Только что, fastmailsend сказал:

reinterpret_cast<PBYTE*>

а зачем еще это?

Ну, всмысле, чем это лучше моего способа?

Ссылка на комментарий
Поделиться на другие сайты

31 минуту назад, fastmailsend сказал:

Ну, всмысле, чем это лучше моего способа?

C шный стиль перебирает все виды преобразований и выбирает оптимальный, а использование reinterpret_cast, что-то типа строгого преобразования в определенный тип, а значит быстрее и мы ведь пишем на C++, так почему бы не воспользоваться его прелестями. А если ты про, типы, то LPCVOID это указатель на константу любого типа, но зачем нам любой тип, если мы точно знаем, что нам нужен указатель на байты. Опять же работает, чуть-чуть быстрее. Да и LPCVOID, может себя неадекватно вести, у меня такое было на практике, а PBYTE никогда не подводил ещё.

 

34 минуты назад, fastmailsend сказал:

Получается надо брать массив с размером

Нет, я не видел ещё задач где бы не хватало массива размером 1024 байта, обычно 64 байта хватает для всего.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо всем!

14 часов назад, partoftheworlD сказал:
15 часов назад, fastmailsend сказал:

Получается надо брать массив с размером 

Нет, я не видел ещё задач где бы не хватало массива размером 1024 байта, обычно 64 байта хватает для всего.

Думал вдруг существует определенные метод позволяющий хоть гиг загрузить :D

Разобрался. Отдельное спасибо за

14 часов назад, partoftheworlD сказал:

C шный стиль перебирает все виды преобразований и выбирает оптимальный, а использование reinterpret_cast, что-то типа строгого преобразования в определенный тип, а значит быстрее и мы ведь пишем на C++, так почему бы не воспользоваться его прелестями. А если ты про, типы, то LPCVOID это указатель на константу любого типа, но зачем нам любой тип, если мы точно знаем, что нам нужен указатель на байты. Опять же работает, чуть-чуть быстрее. Да и LPCVOID, может себя неадекватно вести, у меня такое было на практике, а PBYTE никогда не подводил ещё.

Почему-то на ютубе/cocoscope все пользуются Сишным стилем, а никто толком и не объясняет)

Ссылка на комментарий
Поделиться на другие сайты

19 минут назад, fastmailsend сказал:

Думал вдруг существует определенные метод позволяющий хоть гиг загрузить

Существует, напрямую выделять необходимое количество байт при необходимости используя один и тот же буфер, но с разным размером.

 

19 минут назад, fastmailsend сказал:

Почему-то на ютубе/cocoscope все пользуются Сишным стилем, а никто толком и не объясняет)

Сишный стиль для некоторых удобней, но как всегда есть либо удобный способ, либо правильный.

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Последний вопросец:

    template <class cData>
    cData Read(DWORD dwAddress)
    {
        cData cRead; //Generic Variable To Store Data
        ReadProcessMemory(hProcess, (LPVOID)dwAddress, &cRead, sizeof(cData), NULL); //Win API - Reads Data At Specified Location 
        return cRead; //Returns Value At Specified dwAddress
    }

Как можно передать в cData как массив символов?

mem.Read<char[32]>(baseAddress + 0x105FA0);

ругается

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.