我对我的英语: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;
}
答案 0 :(得分:5)
也许30年前就可以了:D:D:D
进程无法访问彼此的内存...每个进程都有自己的内存映像,因此,进程中的地址0xWHATEVER不会包含与另一个进程中的0xWHATEVER相同的数据!
您需要建立一个库或使用一些进程间通信(IPC)。
答案 1 :(得分:0)
您正在做的是将指针添加到进程的HANDLE。您需要在虚拟地址空间中输入进程的地址。为此,请使用EnumProcessModules
和GetModuleFileNameEx
查找具有所需功能的模块的文件名。 (可以是EXE或DLL。)EnumProcessModules
返回HMODULES
的数组,它们只是指定进程的虚拟地址空间中模块的地址。因此,遍历数组,然后将所需的HMODULE
强制转换为PBYTE
。然后,向其添加函数指针,然后尝试执行。
此外,根据您的代码,您将在程序中执行该功能。很好,只要确保它需要在目标程序中运行,就需要使用CreateRemoteThread
在此处运行它。