C++ 培训师问题I';我试图创造(为了教育目的)

C++ 培训师问题I';我试图创造(为了教育目的),c++,codecave,C++,Codecave,我正在尝试为冰冷塔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);

我正在尝试为冰冷塔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函数时,游戏崩溃

在作弊引擎中,我为此编写了一个脚本,它并没有完全写入同一个地址,因为我编写了代码,而且效果很好

有人知道为什么?多谢各位


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

您不能将数组传递给这样的函数。拥有
byte[]
参数与
byte*
参数相同,而
sizeof(data)
只会给出指针的大小。另外,您不应该使用
&data
,因为它已经是指针了

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

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

不能将数组传递给这样的函数。拥有
byte[]
参数与
byte*
参数相同,而
sizeof(data)
只会给出指针的大小。另外,您不应该使用
&data
,因为它已经是指针了

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

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

当一个数组被传递到一个函数中时,它总是通过引用传递的,因此字节[]与字节*(byte*)相同,并且您只需要编写代码的第一个
sizeof(byte*)
字节。或X86平台上的4字节

此外,您正在编写的似乎是目标代码,如果不是,则忽略此答案的其余部分

好吧,假设您正在写入正确的位置,并且您正在写入的内容是正确的,那么您仍然存在问题-
WriteProcessMemory
不能保证相对于目标进程中运行的线程是原子的

您需要确保目标线程已挂起,并且未在代码的该部分执行。我不知道你(可能)需要做什么来刷新指令解码管道和/或一级缓存


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

当数组被传递到函数中时,它总是通过引用传递,因此字节[]与字节*相同,您只需编写代码的第一个
sizeof(byte*)
字节。或X86平台上的4字节

此外,您正在编写的似乎是目标代码,如果不是,则忽略此答案的其余部分

好吧,假设您正在写入正确的位置,并且您正在写入的内容是正确的,那么您仍然存在问题-
WriteProcessMemory
不能保证相对于目标进程中运行的线程是原子的

您需要确保目标线程已挂起,并且未在代码的该部分执行。我不知道你(可能)需要做什么来刷新指令解码管道和/或一级缓存


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

我可以在最初定义数组的ClockHack函数中使用sizeof(数据),而不是在WPM函数中使用。我可以在最初定义数组的ClockHack函数中使用sizeof(数据),而不是dataSize参数吗,但不是在WPM函数中。