我为游戏创建了一个API。
我的问题:我想从内存中读取一个浮点值。
结果(作弊引擎)100
API的结果:0.00000
extern "C" __declspec(dllexport) float samp_health()
{
hwnd = FindWindow(NULL, L"MyGame");
GetWindowThreadProcessId(hwnd, &pid);
HANDLE phandle = OpenProcess(PROCESS_VM_READ, false, pid);
float value = 0;
ReadProcessMemory(phandle, (float*)(PlayerPointer + HealthOffset), &value, 4, NULL);
CloseHandle(phandle);
return value;
}
有什么问题?
答案 0 :(得分:3)
有了这一行,
HANDLE phandle = OpenProcess(PROCESS_VM_READ, false, pid);
你需要检查失败。
在接下来的一行中,
ReadProcessMemory(phandle, (float*)(PlayerPointer + HealthOffset), &value, 4, NULL);
假设ReadProcessMemory
的工作方式与参数大致相同,PlayerPointer
必须是phandle
标识的进程中的有效指针,如果HealthOffset
是以字节为单位的偏移量,则PlayerPointer
需要是指向byte的指针。
很可能不是。
读取进程内存通常不是进程间通信的好方法。
以下是一些替代方案:
不要进行流程沟通,做线程或其他任何事情。
使用Windows COM技术。
使用Windows邮件地址。
使用Windows窗口消息(例如WM_DATA
)。
使用套接字。
使用文件。
使用烟斗。
几乎所有东西,都不是直接访问进程内存。
总结一下,主要问题是使用过低的抽象级别。