2

我提前为我的英语道歉:D

如何在知道指向它的指针的情况下从进程中调用函数?

我试过这个:

进程.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);
}

主.cpp:

int main()
{

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

    Attach();

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

}

我得到以下异常:

在 wh_mta.exe 中的地址 0x006EF7B6 处引发异常:0xC0000005:在 0x006EF7B6 处执行期间访问冲突。

为什么会这样?如何通过 HANDLE 的指针调用函数?

附言

通过 HANDLE 读取整数效果很好。

int Read_Int(int address) {
    int value;

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

    return value;
}
4

2 回答 2

6

也许 30 年前那会奏效 :D :D :D

进程无法访问彼此的内存……每个进程都有自己的内存映像,因此进程中的地址 0xWHATEVER 与另一个进程中的 0xWHATEVER 包含的数据不同!

您需要创建一个库或使用一些进程间通信(IPC)。

于 2018-10-07T08:31:58.957 回答
0

您正在做的是将指针添加到进程的句柄。您需要该进程在其虚拟地址空间中的地址。为此,请使用EnumProcessModulesGetModuleFileNameEx查找具有所需功能的模块的文件名。(可以是 EXE 或 DLL。)EnumProcessModules返回一个数组,HMODULES其中只是指定进程的虚拟地址空间中的模块地址。所以循环遍历数组,然后将HMODULE你需要的转换为PBYTE. 然后,将函数指针添加到它,然后尝试执行。

此外,根据您的代码,您将在您的程序中执行该函数。没关系,只要确保它需要在目标程序中运行,你就需要使用CreateRemoteThread它在那里运行它。

于 2018-10-14T20:58:16.667 回答