2010-01-16 95 views
0

我有這個AA腳本(作弊引擎的腳本語言):幫助在AA腳本轉換爲C++

[ENABLE] 
alloc(newmem,2048) //2kb should be enough 
label(returnhere) 
label(exit) 

00415e19: 
jmp newmem 

returnhere: 
newmem: 
mov [00451104],0//moves 0 to the clock variable 
//nop//nops the clock increaser 

exit: 
jmp returnhere 

[DISABLE] 
dealloc(newmem) 
00415e19: 
mov [00451104],eax 
//Alt: db A3 04 11 45 00 

它的工作 - 停止比賽計時鐘。現在,我試圖將此代碼轉換爲C++。這是我到目前爲止所做的:

#include <windows.h> 

HWND FindIcyTower() 
{ 
    return FindWindowA(NULL, "Icy Tower v1.4"); 
} 

void WPM(HWND hWnd,int address, byte *data, int dataSize) 
{ 
    DWORD proc_id; 
    GetWindowThreadProcessId(hWnd, &proc_id); 

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id); 

    if(!hProcess) 
     return; 

    WriteProcessMemory(hProcess, (LPVOID)address, data, dataSize, NULL); 

    CloseHandle(hProcess); 
} 

void EnableClockHack() 
{ 
    WPM(FindIcyTower(), 0x00415E19, {0xc7, 0x05, 0x04, 0x11 ,0x45, 0x00, 0x00, 0x00, 0x00, 0x00}, 9); 
} 

void DisableClockHack() 
{ 
    WPM(FindIcyTower(), 0x00415E19, {0xA3, 0x04, 0x11, 0x45, 0x00}, 4); 
} 

但它會崩潰的遊戲,而不是停止時鐘。任何想法?返回FindWindowA(NULL,「Icy Tower v1.4」);

+0

'!IcyTower'和'NULL'是一樣的。只要'回到IcyTower;';或者更短'返回FindWindowA(NULL,「Icy Tower v1.4」);' – GManNickG 2010-01-16 17:12:01

+0

謝謝,修正。但是任何想法爲什麼會讓遊戲崩潰? – 2010-01-16 17:14:52

+1

作弊者在冰冷的塔,淘氣的男人:D – Skurmedel 2010-01-16 17:16:28

回答

3

用於移動立即數的操作碼(如您正在嘗試執行的)比從寄存器(4個字節)移動的遊戲原始代碼更長(9個字節)。額外的5個字節最有可能在原始mov之後覆蓋一個或兩個指令,導致程序崩潰。

就像在Cheat Engine中一樣,您需要在目標進程中分配新的內存以放置修改代碼,這樣您就不會覆蓋遊戲的任何代碼。由於該存儲器將被處理器用於執行,因此需要設置執行位。

一旦你注入了你的mod代碼,你就可以將遊戲的原始mov [00451104],eax更改爲一個jmp到mod代碼的開始地址。 mod代碼中的最後一條指令需要是一個jmp才能返回到您的替換jmp之後的指令,這將恢復遊戲執行。

的其它方法來對內存設置PAGE_EXECUTE分配內存,VirtualProtectExVirtualAllocEx,當然VirtualFreeEx釋放內存當你用它做。

0

不知道關於AA腳本的語法,但我得到了幾個要點:

mov [00451104],0 

應該翻譯爲「0中間值移動到位置00451104」。和你的C++代碼讀取:

WPM(FindIcyTower(), 0x00415E19, {0xc7, 0x05, 0x04, 0x11 ,0x45, 0x00, 0x00, 0x00, 0x00, 0x00}, 9); 

爲什麼您使用的0{0,0,0,0})中間{0xc7, 0x05, 0x04, 0x11 ,0x45, 0x00, 0x00, 0x00, 0x00, 0x00}呢?

您可能還需要首先讀取偏移量0x00415E19的值(這可能是AA代碼通過在指令前加上分配的緩衝區名稱來隱式地執行的操作),因此您可以稍後將原始值恢復爲Disable...函數。