windows - Delphi 7 WriteProcessMemory

Indlæg af Hanne Mølgaard Plasc

Problem



Dette er min arbejdskode


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


Jeg vil konvertere det uden at bruge en variabel, men det vil ikke fungere
Nedenfor er blot et eksempel på, hvad jeg vil gøre.


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


Kender nogen en måde at gøre dette arbejde med ved hjælp af en variabel ???
Jeg er i stand til at programmere på få sprog, og hvert sprog jeg bruger er et
måde at gøre dette på. Grunden til, at jeg vil gøre dette er, fordi jeg skal lave et stort program, der gør meget skrevet af forskellige værdier, og det vil spare mig omkring 300 + linjer. Nedenfor er et eksempel i c ++, jeg brugte.


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


Opdatering:
Løst det
Jeg bruger 4 procedurer, som jeg kalder afhængigt af hvor mange byte jeg vil skrive.


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;


Eksempel skriver


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


Pchar er den eneste metode, jeg fandt at kompilere uden procedurer, jeg vil ikke bruge assci selv.


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

Bedste reference


Du skal gemme indholdet af det ord, du skriver et sted. WriteProcessMemory forventer en peger på en vis hukommelse i dit procesrum. Hvis du ikke vil bruge en variabel, skal du bruge en konstant.


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


Passerer ptr(99) fejler, fordi ptr(99) ikke er en pointer til et ord, der indeholder værdien 99. Det er en pointer for at adressere 99. Jeg tror du forsøgte at skrive @Word(99), men du kan ikke tage adressen til en sand konstant.


Du kan gøre dette mere praktisk ved at indsamle opkaldet til WriteProcessMemory i en hjælpermetode. Selvom dit spørgsmål tyder på, at du vil skrive Word værdier, blev det tydeligt i lang chat, at du faktisk vil skrive bytesekvenser. At skrive heltalsdatatyper vil føre til forvirring af maskinens endianhed. Så i stedet ville jeg gøre det ved hjælp af et åbent udvalg af Byte for at give fleksibiliteten på opkaldsstedet.


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;


Du kan så ringe til koden


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

Andre referencer 1


I C ++, denne kode:


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


Erklærer en const char[] buffer i appens hukommelse, der indeholder de to tegn 'x20' og 'x00' i det. Dette fremgår af brugen af ​​" double quote karakterer omkring bogstavet. De skaber en streng bogstavelig, ikke en bogstavlig bogstav (som bruger ' single-quote-karakter i stedet. Startadressen til den bogstavs første tegn sendes til den tredje parameter og fjerde parameter er sat til 1 for at fortælle WriteProcessMemory() for at kopiere kun 1 byte fra den 2-byte buffer.


Delphi bruger derimod ' single quote-karakteren omkring både enkelt-tegn og streng-bogstaver, og afhænger således af kodekontekst for at bestemme, hvilken type bogstav der skal oprettes. Som sådan har Delphi ikke et direkte middel til at erklære en enkelt bogstaver, som er ligeværdig for en indlejret char[] som i C ++-koden. Den nærmeste ligeværdige, jeg kan tænke på lige nu, uden at erklære en konstant, ville være noget som dette:


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


Ellers skal du kun bruge en eksplicit konstant i stedet. Den direkte ligeværdige af hvad C ++-koden laver er følgende:


const
  buffer: array[0..1] of AnsiChar = (#$20, #0);

WriteProcessMemory(hProcess, Pointer($4E709C), Pointer(PByte(@buffer[0])), 1, nil); 


Alternativt kan du forenkle det til følgende:


const
  space: Byte = $20;

WriteProcessMemory(hProcess, Pointer($4E709C), @space, 1, nil); 

Andre referencer 2


Ptr () Metoden konverterer en adresse til en peger. Så værdien i den anden metode er ikke 99, men den værdi, der er skrevet ved adressen 99.


Min beskidte metode, men med få linjer kode:


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


Så kan du kalde metoden med:


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