我正在尝试创建的培训师的问题(出于教育目的)

时间:2010-01-15 22:36:00

标签: c++ codecave

我正在尝试为教育目的为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语句中有Opcode的原始AOB。 当我将状态参数设置为1调用ClockHack函数时,游戏崩溃。

在Cheat Engine中,我为此编写了一个脚本,它不会写到同一个地址,因为我做了Code Cave,它运行得很好。

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

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

2 个答案:

答案 0 :(得分:2)

您无法将数组传递给类似的函数。拥有byte[]参数与byte *参数相同,而sizeof(data)只会为您指定指针的大小。此外,您不应该使用&data,因为它已经是指针。

所以你的功能应该是这样的:

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

答案 1 :(得分:2)

当一个数组传递给一个函数时,它总是通过引用传递,所以byte []与byte *相同,而你只是编写代码的第一个sizeof(byte*)字节。或X86平台上的4个字节。

此外,看起来你写的是对象代码,如果没有,那么忽略这个答案的其余部分。

好吧,假设您正在写入正确的位置,并且您正在编写的内容是正确的,那么您仍然有问题 - WriteProcessMemory不保证是相对于在目标过程。

您需要确保该目标线程已暂停,而不是在该部分代码中执行。我不知道你(可能)要清除指令解码管道和/或L1缓存需要做什么。

编辑:现在我已经想到了更多。我认为使用互斥锁来保护这段代码在执行时不会被覆盖,这比挂起线程更好。