Найти базовый адрес указанной c программы в хранилище / памяти? - PullRequest
4 голосов
/ 05 августа 2020

Я хочу найти текущий базовый адрес программы без какого-либо ручного ввода. В основном я хочу писать по указанным c адресам в памяти, используя смещения. Для этого мне нужно найти базовый адрес изменяемой программы. В настоящее время я могу сделать это, найдя базовый адрес вручную с помощью другого программного обеспечения, однако я хочу, чтобы он был автоматизирован.

Я пробовал GetModuleHandle(NULL) и преобразовал его в uintptr_t, чтобы получить базовый адрес , но, похоже, это не указывает на правильное место.

Возможно, я чего-то не понимаю, и я ценю всю помощь.

EDIT: Я ищу относительное смещение основания адрес. Я нашел способ получить базовый адрес, теперь мне просто нужно смещение фактического базового адреса. - Каждая Программа имеет собственное ПОСТОЯННОЕ относительное смещение, которое можно найти в Интернете или с помощью специального программного обеспечения.

Решение указано ниже.

1 Ответ

0 голосов
/ 05 августа 2020

Я много исследовал это, и нам нужны только два метода, два из которых могут найти базовый адрес любого процесса, который вам нужен.

DWORD GetProcessId(const wchar_t* processName); //gets the process Id

uintptr_t GetModuleBaseAddress(DWORD processId, const wchar_t* moduleName);  //gets the module base address

Это основные заголовки, которые нам нужны.

Первый заголовок найдет идентификатор процесса, сделав снимок всех запущенных процессов и сравнив каждое имя с именем, которое вы передаете.

DWORD GetProcessId(const wchar_t* processName) {

    DWORD processId = 0;
    HANDLE hSnap = (CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0));
    if (hSnap != INVALID_HANDLE_VALUE) {

        PROCESSENTRY32 processEntry;
        processEntry.dwSize = sizeof(processEntry);

        if (Process32First(hSnap, &processEntry)) {

            do {
            
                if (!_wcsicmp(processEntry.szExeFile, processName)) {

                    processId = processEntry.th32ProcessID;
                    break;
                }
            } while (Process32Next(hSnap, &processEntry));
        }
    }
    else {

        cout << "CreateToolhelp32Snapshot failed. GetLastError = " << dec << GetLastError() << endl;
        system("pause");
        return EXIT_FAILURE;
    }

    CloseHandle(hSnap);
    return processId;
}

Этот метод делает снимок всех запущенных модулей в указанном процессе и сравнивает модуль (в моем случае мне нужен базовый адрес всего процесса, поэтому он такой же, как processName), который вы указываете для каждого модуля в текущем процессе.

uintptr_t GetModuleBaseAddress(DWORD processId, const wchar_t* moduleName) {

    uintptr_t moduleBaseAddr = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, processId);
    if (hSnap != INVALID_HANDLE_VALUE) {

        MODULEENTRY32 moduleEntry;
        moduleEntry.dwSize = sizeof(moduleEntry);
        if (Module32Next(hSnap, &moduleEntry)) {

            do {
            
                if (!_wcsicmp(moduleEntry.szModule, moduleName)) {

                    moduleBaseAddr = (uintptr_t)moduleEntry.modBaseAddr;
                    break;
                }
            } while (Module32Next(hSnap, &moduleEntry));
        }
    }

    CloseHandle(hSnap);
    return moduleBaseAddr;
}

Способ Я понимаю, что каждая программа имеет свой собственный базовый адрес (который мы нашли), а также установленный указатель, который приведет вас к базовому адресу указателя Dynami c (указатель, который вы добавляете к базовому адресу, можно найти с помощью специального программное обеспечение или онлайн).

Всем спасибо!

...