我正在尝试为Icy Tower 1.4创建一个用于教育目的的培训师。

我编写了一个缩短WriteProcessMemory函数的函数,如下所示:

void WPM(HWND hWnd,int address,byte data[])
{
    DWORD proc_id;
    GetWindowThreadProcessId(hWnd, &proc_id);
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id);

    if(!hProcess)
        return;

    DWORD dataSize = sizeof(data);
    WriteProcessMemory(hProcess,(LPVOID)address,&data,dataSize,NULL);
    CloseHandle(hProcess);
}

那就是应该停止冰冷塔钟的功能:
void ClockHack(int status)
{
    if(status==1)//enable
    {
        //crashes the game
        byte data[]={0xc7,0x05,0x04,0x11,0x45,0x00,0x00,0x00,0x00,0x00};
        WPM(FindIcyTower(),0x00415E19,data);
    }
    else if(status==0)//disable
    {
            byte data[]={0xA3,0x04,0x11,0x45,0x00};
    }
}

在else语句中,有操作码的原始AOB。
当我在状态参数设置为1的情况下调用ClockHack函数时,游戏崩溃。

在Cheat Engine中,我为此编写了一个脚本,该脚本未完全写入同一地址,因为我做了Code Cave,并且效果很好。

有人知道为什么吗?谢谢。

顺便说一句:仅出于教育目的

最佳答案

您不能将数组传递给类似的函数。具有byte[]参数与byte *参数相同,并且sizeof(data)只会为您提供指针的大小。另外,您不应该使用&data,因为它已经是一个指针。

因此,您的函数应如下所示:

void WPM(HWND hWnd,int address, byte *data, int dataSize)
{
    //....
    WriteProcessMemory(hProcess,(LPVOID)address,data,dataSize,NULL);
    //...
}

08-17 00:21