Zmiana stringu w pamięci

0

Witam.

Mam taki skrypt:

IDProcess,PID:cardinal;
H: hwnd;
NBR: Size_T;
BaseAddress : int64;
Address : Int64;
BytesRead: SIZE_T;


procedure WriteString(Address: Integer; buf: String; Length: DWORD);
begin
  GetWindowThreadProcessID(H, @PID);
  WriteProcessMemory(IDProcess, Ptr(Address), PChar(buf), Length, nbr);
  CloseHandle(IDProcess);
end;

Gdy chcę go wykorzystać:

var
s:string;
begin
s := 'text';
hook;
WriteString($0A41A392,s,length(s));
end;

To zamiast podmienić string z adresu na "text" zmienia mi go na samo "t". Wie ktoś co robię źle?

Dzięki.

0

length(s) zwraca rozmiar stringa w znakach, tymczasem do WriteProcessMemory trzeba przekazać rozmiar w bajtach, który można pozyskać za pomocą SizeOf(s).

0
Haskell napisał(a):

length(s) zwraca rozmiar stringa w znakach […]

Nie bardzo – sama nazwa Length oznacza, że chodzi o długość, nie o rozmiar. To trochę zagmatwane, bo nawet w dokumentacji, wyjaśnienie przeznaczenia tej funkcji nie jest jednoznaczne i może wprowadzać w błąd, jeśli nie czyta się uważnie.

Length zwraca liczbę znaków – to dotyczy ciągów znaków o stałym rozmiarze code pointów, czyli dla typów AnsiString (gdzie rezultat określa jednocześnie liczbę znaków oraz rozmiar w bajtach) oraz WideString (rezultat to liczba znaków/code pointów).

Natomiast jeśli chodzi o typ UTF8String, funkcja ta zwraca rozmiar w bajtach, a liczba znaków nie jest z góry znana.

[…] tymczasem do WriteProcessMemory trzeba przekazać rozmiar w bajtach, który można pozyskać za pomocą SizeOf(s).

SizeOf(S) zwróci rozmiar wskaźnika (czyli 4 lub 8, w zależności m.in. od kompilatora), nie objętość ciągu w bajtach. Nie wiem jakie to Delphi, jednak jeśli typ String nie jest tożsamy z AnsiString, to nie można użyć Length i bajtowy rozmiar ciągu należy policzyć – pomnożyć liczbę znaków przez rozmiar znaku:

var
  Text: String = 'text';
begin
  // ANSI
  WriteString($0A41A392, Text, Length(Text));
  
  // Wide
  WriteString($0A41A392, Text, Length(Text) * SizeOf(Char));

Mały tip: ciągi znaków zawsze przekazujemy przez stałą (ze słówkiem const), jeśli nie potrzebujemy ich kopii wewnątrz podprogramu – jest to najszybszy sposób, więc warto o tym pamiętać.

0

Bez zmian. Twój kod działa tak samo jak to co ja wstawiłem.

Co dziwne w delphi7 działa jak należy. Problem występuje w delphi 10.

1 użytkowników online, w tym zalogowanych: 0, gości: 1