Чтение массива символов или строки неизвестного размера в wstring с использованием ReadProcessMemory()

РЕДАКТИРОВАТЬ: Исправлена ​​моя проблема. Я все время использовал неправильный адрес...

Как прочитать строку или массив символов неизвестного размера из процесса с помощью функции ReadProcessMemory в C++?

Что я пробовал:

    std::string temp;
    ReadProcessMemory(*hProcess, (LPCVOID)(address+offset), &temp, sizeof(temp), &bytesRead);               
    mywString = string2wstring(temp);

Функция string2wstring(): Источник функции

std::wstring string2wstring(const std::string& str)
{
    int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
    std::wstring wstrTo(size_needed, 0);
    MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
    return wstrTo;
}

Мне удалось успешно прочитать строку, но я продолжаю получать нарушение доступа для чтения, когда запускаю это:

#include <iostream>
#include <windows.h>
#include <string>


void main()
{
    HANDLE hProcess;
    DWORD pID = 000;
    SIZE_T bytesRead;
    uintptr_t address = 0x000;

    //HWND gameWindow = FindWindow(NULL, L"TEXTCHECK");
    //GetWindowThreadProcessId(gameWindow, &pID);

    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);


    std::string temp;
    if (ReadProcessMemory(hProcess, (LPCVOID)(address), &temp, sizeof(temp), &bytesRead))
    {
    }

    std::cout << temp;

    system("pause");

}

Тестирование против:

#include <iostream>
#include <string>
#include <Windows.h>
#include <stdlib.h>

using namespace std;

int main() {

    int varInt = 123456;
    string varString = "DefaultString";
    const char arrChar[128] = "Long char array AABBCCDDEEFFGGHHIIJJKKLL"; 
    int* ptr2int = &varInt;
    int** ptr2ptr = &ptr2int;
    int*** ptr2ptr2 = &ptr2ptr;



    while (1) {
        cout << "Process ID: " << GetCurrentProcessId() << "\n";
        cout << "\n";
        cout << "varInt     (0x" << &varInt << ") = " << varInt << "\n";
        cout << "varString  (0x" << &varString << ") = " << varString << "\n";
        cout << "arrChar    (0x" << &arrChar << ") = " << arrChar << "\n";
        cout <<"\n";
        cout << "ptr2int    (0x" << &ptr2int << ") = 0x" << ptr2int << "\n";
        cout << "ptr2ptr    (0x" << &ptr2ptr << ") = 0x" << ptr2ptr << "\n";
        cout << "ptr2ptr2   (0x" << &ptr2ptr2 << ") = 0x" << ptr2ptr2 << "\n";

        cout << "\n";
        cout << "Press ENTER to print again.";
        cout << "\n";
        cout << flush;
        cin.get();
        cout << "----------------------------------------\n\n\n";
        //system("CLS");

    }
    return 0;
}

управляемое исключение win32 во время GETSTRINGFROMMEM.EXE [16984]


person JwGaming    schedule 02.06.2018    source источник


Ответы (1)


Вы должны знать точный размер, чтобы прочитать. Если вы не знаете размер, ваша единственная надежда, если:

  • перед строковыми данными указывается размер, который вы можете прочитать

  • строковые данные заканчиваются нулем, и в этом случае вы должны читать по 1 символу за раз, пока не найдете нулевой терминатор.

person Remy Lebeau    schedule 02.06.2018
comment
Как бы я это сделал? Я ничего не нахожу об этом. То, что я пытаюсь, не работает, и я просто получаю исключения. - person JwGaming; 02.06.2018
comment
@JwGaming, если вы не знаете точного формата того, что пытаетесь прочитать, вы не сможете эффективно это читать. Вы не можете просто читать произвольные данные из произвольных процессов. Чего вы действительно пытаетесь достичь? - person Remy Lebeau; 02.06.2018