Delphi-PRAXiS

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

Luckie 6. Feb 2010 21:07

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

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

Ähm, du schreibst ein Programm, um in dem Speicher anderer Programm rumzumachen und hast keinerlei Delphi Grundlagen? Wie bist du bisher soweit gekommen?

Muellermilchtrinker 6. Feb 2010 21:09

Re: Float Addresse aus RAM laden???
 
Ich habe Grundlage um es klar zu stellen.
Ich programmiere seit einem Jahr mit Delphi und FloatToStr hab ich schon probiert und das ging nicht. Deswegen kam die Frage.

Luckie 6. Feb 2010 21:15

Re: Float Addresse aus RAM laden???
 
Dann hast du aber die falsche Frage gestellt. ;) Die Frage hätte lauten müssen: "Warum kann ich den erhaltenen Wert nicht mit FloatToStr in eine Zeichenkette umwandeln?" Und dann noch etwas Sourcecode dazu. Jetzt bist du nämlich genauso weit wie vorher.

Muellermilchtrinker 7. Feb 2010 12:57

Re: Float Addresse aus RAM laden???
 
Ich hab mit FloatToStr sogar mehrere verschiedene Werte als in tsearch bekommen.
Gibts vllt irgendeine API/Unit/Komponente für den RAM???

Luckie 7. Feb 2010 13:51

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

Zitat von Muellermilchtrinker
Ich hab mit FloatToStr sogar mehrere verschiedene Werte als in tsearch bekommen.

Du sprichst in Rästeln. Mit FloatToStr "bekommt" man keine Werte sondern wandelt eine Fließkommazahl in eine Zeichenkette um, damit man sie ausgeben kann.

Noch mal: Du darfst ruhig etwas mehr schreiben. Man ist nicht auf drei Sätze begrenzt. Wass willst du denn jetzt für eine Komponente haben? Was soll die können?

Muellermilchtrinker 7. Feb 2010 14:02

Re: Float Addresse aus RAM laden???
 
Ich hab ein Button und ein Memo (zum Test erstmal).
Ich klick auf den Button und er fügt mir eine Zeile mit dem Wert hinzu.
Laut tsearch ändert sich nichts an dem Wert aber im Memo stehen lauter verschiedene Werte. Warum???
Und ich dachte halt an eine Unit mit Funktionen um verschiedene Werte aus dem RAM zu laden.
Bsp:
Delphi-Quellcode:
function LeseBytes(Addresse:Integer):String;
function LeseFloat(Addresse:Integer):String;
So hätte ich gerne eine Unit, aber das gibts wahrscheinlich nicht, oder irre ich mich???

Luckie 7. Feb 2010 14:10

Re: Float Addresse aus RAM laden???
 
Ich habe zwar immer noch nicht verstanden, was bei dir nicht funktioniert...

Es kann natürlich sein, dass da jemand schon mal eine Unit geschrieben hat, um den Speicher von anderen Prozessen auszulesen und zu manipulieren. Eventuell kann das die Hier im Forum suchenuallcollection. Aber es gibt auch Sachen, die muss man schon mal selber machen. Und dann sollte man sich auch mal mit den Grundlagen auseinandersetzen. Denn so eine Funktion:
Delphi-Quellcode:
function LeseBytes(Addresse:Integer):String;
kann es nicht geben. Da muss zumindest noch der Prozess mit angegeben werden, wenn es nicht um den eigenen Prozess geht. Deswegen empfehle ich dir dringendst dich mal mit der Speicherverwaltung von Windows auseinanderzusetzen, damit du auch weißt, was du da machst bzw. machen willst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 Uhr.

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