从另一个进程调用函数

时间:2018-10-07 08:26:56

标签: c++ windows

我对我的英语: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);

}

然后出现以下异常:

  

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

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

PS

通过HANDLE读取整数非常有用。

int Read_Int(int address) {
    int value;

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

    return value;
}

2 个答案:

答案 0 :(得分:5)

也许30年前就可以了:D:D:D

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

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

答案 1 :(得分:0)

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

此外,根据您的代码,您将在程序中执行该功能。很好,只要确保它需要在目标程序中运行,就需要使用CreateRemoteThread在此处运行它。