目前我正在尝试在德尔福开发游戏培训师。 我有以下代码:
var
WindowName : integer;
ProcessId : integer;
ThreadId : integer;
buf : PChar;
HandleWindow : Integer;
write : cardinal;
Const WindowTitle = 'Starcraft'; //Whatever
这些是我的变量,现在是我的功能:
const v1 = $90
begin
WindowName := FindWindow(nil,WindowTitle);
If WindowName = 0 then MessageDlg('The game has not been started yet..', mtwarning,[mbOK],0);
ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
GetMem(buf,1);
buf^ := Chr(v1);
WriteProcessMemory(HandleWindow,ptr(/*$whatever*/),buf,1,write);
FreeMem(buf);
closehandle(HandleWindow);
end;
现在我有一些问题:
假设我找到了一个地址,其中有一个程序来检查进程,这将负责我的游戏资金。有人告诉我,常数v1 = 90美元会让我的钱冻结。为什么这样做不变,我如何在我的代码中实现它?我已经尝试插入我的地址,我写的是$ $ whatever /,但这不起作用。
我希望你能帮助我。
感谢您的帮助。
答案 0 :(得分:1)
90美元是汇编程序NOP指令,它在英特尔处理器上什么都不做。看起来您的程序设计为写入正在运行的游戏的程序存储器,并用NOP指令替换特定地址处的指令以更改程序行为。在这种情况下,修改为玩游戏的用户减去金钱的程序部分。一种内存中的补丁。
请注意,由于Delphi 2009和Unicode支持字符的大小不再为1,因此当您想要将其用于修改单个字节时,这是一个问题。尝试将buf的类型更改为AnsiChar并将buf ^分配给AnsiChar(v1)。