Delphi 7 WriteProcessMemory

Tpr*_*e88 2 windows delphi delphi-7

这是我的工作准则

  DriftMul:=99;
  WriteProcessMemory(HandleWindow, ptr($4E709C), @DriftMul, 2, Write);
Run Code Online (Sandbox Code Playgroud)

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

WriteProcessMemory(HandleWindow, ptr($4E709C),  ptr(99), 2, Write);
Run Code Online (Sandbox Code Playgroud)

有没有人知道使用变量使这个工作的方法??? 我能用几种语言编程,我使用的每种语言都是一种方法.我想要这样做的原因是因为我将制作一个大型程序,它可以编写不同的值,它将为我节省大约300多行.下面是我正在使用的c ++中的一个例子.

WriteProcessMemory(hProcess, (void*)0x4E709C, (void*)(PBYTE)"\x20", 1, NULL);
Run Code Online (Sandbox Code Playgroud)

更新:解决它我使用4个程序,我打电话取决于我想写多少字节.

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;
Run Code Online (Sandbox Code Playgroud)

示例写道

 Wpm($477343,$EB);
 Wpm2($40A889,$37EB);
 Wpm3($416E34,$0086E9);
Run Code Online (Sandbox Code Playgroud)

Pchar是我发现没有程序编译的唯一方法,我不想使用assci.

WriteProcessMemory(HandleWindow, Pointer($449A17), PChar('90'), 1, Write);
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 6

你必须存储你在某处写的单词的内容.WriteProcessMemory期望指向进程空间中某些内存的指针.如果您不想使用变量,请使用常量.

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

传递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;
Run Code Online (Sandbox Code Playgroud)

然后,您可以调用代码

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