首页 > 解决方案 > 为什么我应该在 WriteProcessMemory() 函数的第二个参数中使用 (void*)?

问题描述

我正在尝试为游戏创建游戏教练。我找到了所需的内存地址,现在我想将我的值写入该地址。

例如:弹药地址为:0x0E9AFD07

Windows API 中的WriteProcessMemory()函数可以做到这一点。

我的来源:

int main(){
    DWORD pid;
    int address = 0x0E9AFD07;
    const int data = 20;
    HWND hwnd = FindWindow(0 , "Max Payne v1.05");
    GetWindowThreadProcessId(hwnd , &pid);
    HANDLE hndl = OpenProcess(PROCESS_ALL_ACCESS , false ,pid);
    WriteProcessMemory(hndl , &address , &data , 4 , NULL); 

    return 0;
}

但是这段代码不起作用!

如果我应该使用WriteProcessMemory如下:

WriteProcessMemory(hndl , (void*)0x0E9AFD07 , &data , 4 , NULL); 

那么函数的第二个参数是LPVOID类型,我读到它LPVOID是一个指向任何东西的指针。

那么,为什么我不能int为第二个参数传递指向(地址变量)的指针?

我为什么要使用(void*)

标签: c++cwinapimemorycheat-engine

解决方案


  • 为什么我应该使用 (void*)

    因为这就是手册告诉您该功能所期望的。具体来说:

    lpBaseAddress

    指向要写入数据的指定进程中的基地址的指针。在数据传输发生之前,系统会验证指定大小的基地址和内存中的所有数据都可以进行写访问,如果不可访问,则函数失败。

  • 出于同样的原因,您不能依次传递包含地址的局部变量的地址,因为这不是函数所期望的。

  • LPVOID只是 Windows 乱码void*,它们是相同的类型。

  • 为了将整数地址转换为指针类型,您需要进行强制转换,因为 C 和 C++ 就是这样设计的。您不能将整数分配给指针,请参阅“来自整数的指针/来自没有强制转换的指针的整数”问题

  • 值得注意0x0E9AFD07的是地址未对齐,因此将 4 字节整数写入该地址是可疑的。


推荐阅读