Delphi 7的WriteProcessMemory

这是我的工作守则

DriftMul:=99; WriteProcessMemory(HandleWindow, ptr($4E709C), @DriftMul, 2, Write); 

我想转换它,而不使用一个variables,但它不会工作下面只是我想要做的一个例子。

 WriteProcessMemory(HandleWindow, ptr($4E709C), ptr(99), 2, Write); 

有谁知道一种方法来使这个工作与使用variables? 我可以使用几种语言进行编程,而且我使用的每种语言都是一种方法来执行此操作。 我想这样做的原因是因为我将会制作一个很大的程序,能够处理不同的值,而且会为我节省300多行。 下面是我正在使用的c ++的一个例子。

 WriteProcessMemory(hProcess, (void*)0x4E709C, (void*)(PBYTE)"\x20", 1, NULL); 

更新:解决了我使用4程序,我打电话取决于我想要写多less字节。

 procedure Wpm(Address: Cardinal; ChangeValues: Byte); Begin WriteProcessMemory(HandleWindow, Pointer(Address), @ChangeValues, 1, Write); End; procedure Wpm2(Address: Cardinal; ChangeValues: Word); Begin WriteProcessMemory(HandleWindow, Pointer(Address), @ChangeValues, 2, Write); End; procedure Wpm3(Address: Cardinal; ChangeValues: Word); Begin WriteProcessMemory(HandleWindow, Pointer(Address), @ChangeValues, 3, Write); End; procedure Wpm4(Address: Cardinal; ChangeValues: Cardinal); Begin WriteProcessMemory(HandleWindow, Pointer(Address), @ChangeValues, 4, Write); End; 

示例写道

  Wpm($477343,$EB); Wpm2($40A889,$37EB); Wpm3($416E34,$0086E9); 

Pchar是我发现无编程的唯一方法,我不想使用assci。

 WriteProcessMemory(HandleWindow, Pointer($449A17), PChar('90'), 1, Write); 

Solutions Collecting From Web of "Delphi 7的WriteProcessMemory"

你必须存储你正在写的地方的单词的内容。 WriteProcessMemory需要一个指向你的进程空间中的一些内存的指针。 如果你不想使用一个变量,使用一个常量。

 const DriftMul: word=99; .... WriteProcessMemory(HandleWindow, ptr($4E709C), @DriftMul, 2, Write); 

传递ptr(99)失败,因为ptr(99)不是指向包含值99的单词的指针。 它是一个指向地址99的指针。我认为你正在写@Word(99)但是你不能把一个真正的常量的地址。

通过在辅助方法中封装对WriteProcessMemory的调用,可以使这更方便。 虽然你的问题表明你想写Word值,但是在冗长的聊天中,你确实想要编写字节序列。 编写整数数据类型将导致机器字节顺序混淆。 所以相反,我会使用一个开放的Byte数组来实现呼叫站点的灵活性。

 procedure WriteBytes(hProcess: THandle; Address: Pointer; const Buffer: array of Byte); var NumberOfBytesWritten: DWORD; begin if not WriteProcessMemory(hProcess, Address, @Buffer[0], Length(Buffer), NumberOfBytesWritten) then RaiseLastOSError; end; 

然后你可以调用代码

 WriteBytes(Handle, Pointer($523328), [$42]);//single byte WriteBytes(Handle, Pointer($523328), [$CC, $90, $03]);//3 bytes 

在C ++中,这个代码:

 WriteProcessMemory(hProcess, (void*)0x4E709C, (void*)(PBYTE)"\x20", 1, NULL); 

在应用程序的内存中声明一个const char[]缓冲区,其中包含两个字符'\x20''\x00' 。 这是通过在字面上使用"双引号字符"来显而易见的,它们是创建一个字符串字面值,而不是字符字面值(它使用'单引号字符”),该字面值的第一个字符的起始地址正在被传递到第三个参数,第四个参数设置为1告诉WriteProcessMemory()从该2字节缓冲区只复制1个字节。

另一方面,Delphi在单字符和字符串文字周围使用'单引号”字符,因此依靠代码上下文来决定需要创建哪种类型的文字。 因此,Delphi没有直接的方式来声明一个单字符文字,就像在C ++代码中那样等价于一个内联的char[] 。 现在我能想到的最接近的equivilent,没有声明一个常数,会是这样的:

 WriteProcessMemory(hProcess, Pointer($4E709C), PAnsiChar(AnsiString(' ')), 1, nil); 

否则,只需使用显式常量。 C ++代码正在做的直接等同于以下内容:

 const buffer: array[0..1] of AnsiChar = (#$20, #0); WriteProcessMemory(hProcess, Pointer($4E709C), Pointer(PByte(@buffer[0])), 1, nil); 

或者,您可以将其简化为以下内容:

 const space: Byte = $20; WriteProcessMemory(hProcess, Pointer($4E709C), @space, 1, nil); 

ptr()方法将地址转换为指针。 所以第二个方法的值不是99,而是写在地址99的值。

我肮脏的方法,但几行代码:

 procedure WriteBytes(hProcess: THandle; address: Pointer; buffer: Variant; count: Integer); begin WriteProcessMemory(hProcess, address, @buffer, count, nil); end; 

然后你可以调用这个方法:

 WriteBytes(HandleWindow, Pointer($449A17), 90, 1);