C++ 从另一个进程调用函数

C++ 从另一个进程调用函数,c++,windows,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"

我为我的英语提前道歉: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);
}

也许在30年前,这就行了:D:D:D

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


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

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


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

您想在进程上下文中还是在从中读取的进程上下文中执行它?因为第一步需要分析函数,复制机器代码字节并“重新定位”所有地址,使其位于自己进程的虚拟内存空间中。对于第二件事,您需要在另一个进程中打开一个新线程,或者中断一个已经运行的线程并误用它。如果你可以避免的话,这不是你应该使用的东西。如果只是出于好奇,祝你好运。什么?如果你指的是第二条评论,我也看不到。
int main()
{

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

    Attach();

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

}
int Read_Int(int address) {
    int value;

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

    return value;
}