Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Float Addresse aus RAM laden??? (https://www.delphipraxis.net/147361-float-addresse-aus-ram-laden.html)

Muellermilchtrinker 6. Feb 2010 18:58


Float Addresse aus RAM laden???
 
Servus DP,

Wie lade ich eine Float Addresse aus dem RAM???
Ich habs bis jetzt nur für Byte Addressen hin bekommen.
Gibts vllt ne RAM Komponente / Unit???
Ich hoffe ihr könnt mir helfen.

Luckie 6. Feb 2010 19:00

Re: Float Addresse aus RAM laden???
 
Was verstehst du unter "aus dem RAM laden"?
Delphi-Quellcode:
var
  d: Double;
begin
  d := 5.1;
  ShowMessage(FloatToStr(d));
Und schon hast du sie aus dem RAM geladen und angezeigt.

Muellermilchtrinker 6. Feb 2010 19:05

Re: Float Addresse aus RAM laden???
 
Ich mein Daten eines Spiels.

Luckie 6. Feb 2010 19:07

Re: Float Addresse aus RAM laden???
 
Zitat:

Zitat von Muellermilchtrinker
Ich mein Daten eines Spiels.

Also bevor wir dir hier alles aus der Nase ziehen, setz dich mal hin, überleg, was du willst, wo du Probleme hast und dann beschreibst du dein Problem mal etwas ausführlicher und schmeißt uns nicht nur so drei vier Sätze hin.

Muellermilchtrinker 6. Feb 2010 19:16

Re: Float Addresse aus RAM laden???
 
Also:

Ich hab ein Spiel. Und von dem möchte ich Daten ausm RAM lesen.
Ich hab die Addressen wo ich brauch.
Mein Problem ist jetzt wenn die Addresse Byte ist kann ich die problemlos auslesen. Nur bei einer Floataddresse kann ich die nicht auslesen.
Die Frage nun:
Wie lese ich eine Floataddresse aus dem Arbeitsspeicher??? (wie es zum Beispiel tsearch macht)

Luckie 6. Feb 2010 19:21

Re: Float Addresse aus RAM laden???
 
Dir fehlen die allernötigsten Grundlagen. Im Speicher stehen immer nur Byte. Es kommt eben nur darauf an, wie sie interpretiert werden. Eine Bytefolge kann eine Zahl repräsentieren, als auch eine Zeichenkette oder sonst irgendeine Datenstruktur.

brechi 6. Feb 2010 20:54

Re: Float Addresse aus RAM laden???
 
Das machst du mit

Delphi-Quellcode:
var
  MeinFloatWert: Single;
ReadProcessMemory(hProcess, hBase, @MeinFloatWert, SizeOf(MeinFloatWert), dwRead)
Luckie, ich denke es sollte schon klar sein was Milch wollte.

Astat 6. Feb 2010 20:55

Re: Float Addresse aus RAM laden???
 
Zitat:

Zitat von Muellermilchtrinker
Servus DP,Wie lade ich eine Float Addresse aus dem RAM???

Hallo Muellermilchtrinker, anbei Sample.
Es werden von der calc.exe 8 Byte, dies entspricht der Größe eines Double = 5.0 x 10^-324 .. 1.7 x 10^308
ausgelesen. Willst du nun die ausgelesenen 8 Bytes einer Double Variablen zuweisen, kannst Du dies einfach mit
move(ptrData^, d, SizeOf(Double)) durchführen.

Delphi-Quellcode:


function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL;
  const NewState: TTokenPrivileges; BufferLength: DWORD;
  PreviousState: PTokenPrivileges; ReturnLength: PDWORD): BOOL; stdcall;
  external 'advapi32.dll' name 'AdjustTokenPrivileges'

function EnableProcessPrivilege(const Enable: Boolean;
  const Privilege: string): Boolean;
const
  PrivAttrs: array [Boolean] of DWORD = (0, SE_PRIVILEGE_ENABLED);
var
  Token: THandle;
  TokenPriv: TTokenPrivileges;
begin
  Result := False;
  if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, Token) then
  begin
    TokenPriv.PrivilegeCount := 1;
    LookupPrivilegeValue(nil, PChar(Privilege), TokenPriv.Privileges[0].Luid);
    TokenPriv.Privileges[0].Attributes := PrivAttrs[Enable];
    AdjustTokenPrivileges(Token, False, TokenPriv, SizeOf(TokenPriv), nil, nil);
    Result := GetLastError = ERROR_SUCCESS;
    CloseHandle(Token);
  end;
end;

function MemRead(PID: DWORD; ptrOffset: Pointer; cbData: DWORD): Pointer; stdcall;
var
  cbRead: DWORD;
  hProc: THandle;
begin
  result := nil;
  if not EnableProcessPrivilege(true, 'SeDebugPrivilege') then
    RaiseLastWin32Error;
  hProc := OpenProcess(PROCESS_VM_READ ,False , PID);
  if hProc <> 0 then begin
    GetMem(Result, cbData);
    if not ReadProcessMemory(hProc, ptrOffset, Result, cbData, cbRead) then
      RaiseLastWin32Error;
    CloseHandle(hProc);
  end else
    RaiseLastWin32Error;
end;

function BinToHexStr(AData: Pointer; ADataLen: Integer): String;
const
  HEX_DIGITS: array [0..15] of Char = '0123456789ABCDEF';
var
  LSrc: PChar;
  i: Integer;
Begin
  LSrc := AData;
  SetString(Result, NIL, ADataLen * 2);
  for i := 0 to ADataLen -1 do begin
    Result[i * 2 + 1] := HEX_DIGITS[ord(LSrc^) shr 4];
    Result[i * 2 + 2] := HEX_DIGITS[ord(LSrc^) and $F];
    inc(LSrc);
  end;
End;


var
  ptrData: Pointer;
  hWindow: HWND;
  dwPID: DWORD;
  d: Double;
begin
  hWindow := FindWindow(nil, 'Rechner');
  if hWindow <> 0 then begin
    if GetWindowThreadProcessId(hWindow ,@dwPID) <> 0 then begin
      ptrData := MemRead(dwPID, ptr($01000010), 8);
      move(ptrData^, d, SizeOf(Double));
      writeln(FloatToStr(d));
      writeln(BinToHexStr(ptrData, 8));
      FreeMem(ptrData);
    end else
      RaiseLastWin32Error;
  end else
    RaiseLastWin32Error;
  readln;
end.
lg. Astat

Muellermilchtrinker 6. Feb 2010 20:56

Re: Float Addresse aus RAM laden???
 
Wie kann ich diesen Wert jetzt noch in einen String umwandeln???

Klaus01 6. Feb 2010 20:59

Re: Float Addresse aus RAM laden???
 
Zitat:

Zitat von Muellermilchtrinker
Wie kann ich diesen Wert jetzt noch in einen String umwandeln???

Delphi-Referenz durchsuchenFloatToStr?

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:34 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz