Вызов функции из другого процесса - PullRequest
0 голосов
/ 07 октября 2018

Я заранее прошу прощения за мой английский: D

Как я могу вызвать функцию из процесса, зная указатель на нее?

Я пробовал это:

Process.cpp:

DWORD pid;
HWND hwnd;
HANDLE phandle;

void Attach() {
    hwnd = FindWindow(NULL, L"GTA:SA:MP");
    if (!hwnd) {
        cout << "Process is not found" << endl;
        system("pause");
    }
    else if (hwnd) {
        cout << "Process was successfully loaded" << endl;
        GetWindowThreadProcessId(hwnd, &pid);
        phandle = OpenProcess(PROCESS_VM_READ, 0, pid);
    }
    else
    {
        cout << "Error 0x01" << endl;
        system("pause");
    }
}

void GameText(const char* szText, int iTime, signed int iStyle)
{
    typedef void(__stdcall* GameText_t)(const char*, int, signed int);
    GameText_t pGameText = (GameText_t)((char*)phandle + 0x69F2B0);
    return pGameText(szText, iTime, iStyle);
}

main.cpp:

int main()
{

    std::cout << "Hello World!\n"; 

    Attach();

    GameText("~r~Test!", 1000, 5);

}

И я получаю следующее исключение:

Исключение было сгенерировано по адресу 0x006EF7B6в файле wh_mta.exe: 0xC0000005: нарушение прав доступа во время выполнения по адресу 0x006EF7B6.

Почему это происходит?Как я могу вызвать функцию по указателю через HANDLE?

PS

Чтение целого числа через HANDLE прекрасно работает.

int Read_Int(int address) {
    int value;

    ReadProcessMemory(phandle, (void*)address, &value, sizeof(value), 0);

    return value;
}

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Что вы делаете, это добавляете указатель на РУЧКУ процесса.Вам нужен адрес процесса в его виртуальном адресном пространстве.Для этого используйте EnumProcessModules и GetModuleFileNameEx, чтобы найти имя файла модуля с нужной вам функцией.(Может быть EXE или DLL.) EnumProcessModules возвращает массив HMODULES, который является просто адресами модуля в виртуальном адресном пространстве указанного процесса.Итак, переберите массив, затем приведите HMODULE, что вам нужно, к PBYTE.Затем добавьте к нему указатель функции и попробуйте выполнить.

Также, согласно вашему коду, вы собираетесь выполнить функцию в ВАШЕЙ программе.Это нормально, просто убедитесь, что для запуска в целевой программе вам нужно будет использовать CreateRemoteThread, чтобы запустить его там.

0 голосов
/ 07 октября 2018

Может быть, 30 лет назад это сработало бы: D: D: D

Процессы не могут получить доступ к памяти друг друга ... Каждый процесс имеет свой собственный образ памяти, поэтому адрес 0xWHATEVER в процессе не работает.содержат те же данные, что и 0xWHATEVER, в другом процессе!

Вам необходимо создать библиотеку или использовать межпроцессное взаимодействие (IPC).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...