2010-01-15 78 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緩存。

編輯:現在我想到了更多。我認爲使用互斥鎖來保護這段代碼在執行時不會被覆蓋,這比懸置該線程要好。