Kłopot z odczytem pointera.

0

Witam.

Mam problem z odczytem mojego pointera.
Kod wygląda tak:

procedure TForm1.Button1Click(Sender: TObject);
var
  GameHandle : Cardinal;
  BaseAddress : int64;
  Address : Int64;
  Bytesread: SIZE_T;
  puffer : DWORD;
  Window : cardinal;
  PID : cardinal;

  hpptr1:string;
  hpptr2:string;
  hpptr3:string;
  hpptr4:string;


begin
  Window := FindWindow(nil,'Okno');
  GetWindowThreadProcessId(Window,PID);
  GameHandle := OpenProcess(PROCESS_VM_READ,false,PID);
  if GameHandle > 0 then
  begin
    BaseAddress := GetBasePointerOfModule(PID, 'Okno.exe');
    Address := BaseAddress + $00579640;

    ReadProcessMemory(GameHandle, ptr(Address), @puffer, sizeof(puffer), Bytesread);



hpptr1 := (IntToHex((puffer + $6c), 8));
hpptr2 := (IntToHex((hpptr1 + $7f0), 8));
hpptr3 := (IntToHex((hpptr2 + $b0), 8));
hpptr4 := (IntToHex((hpptr3 + $5e8), 8));

showmessage(('Address:    ' + IntToHex((puffer), 8)));
showmessage('Address + pierwszy offset:   ' + (hpptr1));

end;
end;

Powiem szczerze, że staram się to robić w celach czysto edukacyjnych. Niestety, ale już tyle czasu nad tym siedzę i się tym bawię, że chyba mi się samemu nie uda.
Czyta mi poprawnie do hpptr1, więc address w showmessage jest poprawny. Reszta (od hpptr2) się powaliła całkowicie.

Proszę o pomoc.
Dziękuję.

1

A co to?

hpptr1 := (IntToHex((puffer + $6c), 8));
hpptr2 := (IntToHex((hpptr1 + $7f0), 8));
hpptr3 := (IntToHex((hpptr2 + $b0), 8));
hpptr4 := (IntToHex((hpptr3 + $5e8), 8));

przecież hpptr1 to string (reprezentujący liczbę w systemie heksadecymalnym) więc to nie ma prawa się nawet skompilować. Nie wiem co chcesz zrobić ale jeżeli chcesz tak dawać te wartości musiałoby być coś w tym stylu:

hpptr2 := IntToHex((StrToInt64('$' + hpptr1) + $7f0), 8);
0

Zależy mi na tym, bym mógł czytać wartości z pointerów.
Wcześniejszy pointer posiadał tylko jeden offset i nie było problemu.
Wygląda on tak:
title
Sam kod do jego wyczytania wygląda w ten sposób:

var
  GameHandle : Cardinal;
  BaseAddress : int64;
  Address : Int64;
  Bytesread: SIZE_T;
  puffer : DWORD;
  Window : cardinal;
  PID : cardinal;

begin
  Window := FindWindow(nil,'Okno');
  GetWindowThreadProcessId(Window,PID);
  GameHandle := OpenProcess(PROCESS_VM_READ,false,PID);
  if GameHandle > 0 then
  begin
    BaseAddress := GetBasePointerOfModule(PID, 'Okno.exe');
    Address := BaseAddress + $00579640;
    ReadProcessMemory(GameHandle, ptr(Address), @puffer, sizeof(puffer), Bytesread);
    Label7.Caption := inttostr(Round(memreaddouble(strtoint(('$') + IntToHex((puffer + $6c), 8)))));   

Teraz pragnę zrobić pointer składający się z kilku offsetów i wygląda to niemrawo.
Screen opisujący sprawę:
title
Kod:

var
  GameHandle : Cardinal;
  BaseAddress : int64;
  Address : Int64;
  Bytesread: SIZE_T;
  Pointer1: Int64;
  puffer : DWORD;
  Window : cardinal;
  PID : cardinal;

begin
  Window := FindWindow(nil,'Okno');
  GetWindowThreadProcessId(Window,PID);
  GameHandle := OpenProcess(PROCESS_VM_READ,false,PID);
  if GameHandle > 0 then
  begin
    BaseAddress := GetBasePointerOfModule(PID, 'Okno.exe');
    Address := BaseAddress + $00579640;
    ReadProcessMemory(GameHandle, ptr(Address), @puffer, sizeof(puffer), Bytesread);
Pointer1:=(IntToHex((puffer), 8));
hpptr1 := IntToHex((StrToInt64('$' + Pointer1) + $6c), 8);
hpptr2 := IntToHex((StrToInt64('$' + hpptr1) + $7f0), 8);
hpptr3 := IntToHex((StrToInt64('$' + hpptr2) + $b0), 8);
hpptr4 := IntToHex((StrToInt64('$' + hpptr3) + $5e8), 8);


Edit1.Text := ('Pointer1:       ' + (Pointer1));
Edit2.Text := ('hpptr1:       ' + (hpptr1));
Edit3.Text := ('hpptr2:       ' + (hpptr2));
Edit4.Text := ('hpptr3:       ' + (hpptr3));
Edit5.Text := ('hpptr4:       ' + (hpptr4));
Edit6.Text := inttostr(Round(memreaddouble(strtoint(('$') + ((hpptr4))))));    

Co jest trochę dziwne to to, że w pierwszym screenie w cheat engine wychodzi zupełnie inny address po dodaniu tego samego offsetu wychodzi zupełnie inny wynik. Zapewne to przez to, że gdy jest więcej offsetów nagle w CE jest stosowany nawias kwadratowy (i w sumie cholera wie o co chodzi).

Jeżeli ktoś jest mi w stanie pomóc to bardzo o to proszę.

0

Odświeżam temat, gdyż zależy mi na rozwiązaniu.

0

Po dodaniu offestu musisz pobrać z pod tego adresu adres i dodać kolejny offset, znów pobrać i dodać i pobrać aż dojdziesz do wartości, która jest tą zmienną poszukiwaną, tak samo jak w CE robieś...

0

Teraz już chyba wiem o co chodzi obliczyłeś sobie hpptr1 ale to dopiero wskazuje na adres pamięci i z pod tego adresu dopiero powinieneś odczytać wartość.

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