2010-01-15 36 views
1

我正在尝试为教育目的创建冰爽塔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函数时,游戏崩溃。

在作弊引擎中,我为此编写了一个脚本,由于我做了Code Cave并且效果很好,所以不会写入相同的地址。

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

顺便说一句:这是为教育目的只有

回答

2

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

所以你的函数应该是这样的:

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

而不是dataSize参数我可以只是做sizeof(数据)? – 2010-01-15 23:57:12

+0

您可以在ClockHack函数中使用sizeof(数据),其中最初定义了数组,但不在WPM函数中。 – interjay 2010-01-16 09:42:59

2

当数组传递到它总是通过引用传递,这样的byte []相同字节*一个功能,你只写第一个sizeof(byte*)字节的代码。或X86平台上的4个字节。

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

那么,假设你正在写入正确的位置,并且你写的是正确的,你仍然有问题 - WriteProcessMemory不能保证在目标进程中运行的线程是原子的。

您需要确保该目标线程已暂停,并且不在该代码部分执行。我不知道你可能需要做什么来刷新指令解码流水线和/或L1缓存。

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