![]() |
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. |
Re: Float Addresse aus RAM laden???
Was verstehst du unter "aus dem RAM laden"?
Delphi-Quellcode:
Und schon hast du sie aus dem RAM geladen und angezeigt.
var
d: Double; begin d := 5.1; ShowMessage(FloatToStr(d)); |
Re: Float Addresse aus RAM laden???
Ich mein Daten eines Spiels.
|
Re: Float Addresse aus RAM laden???
Zitat:
|
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) |
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.
|
Re: Float Addresse aus RAM laden???
Das machst du mit
Delphi-Quellcode:
Luckie, ich denke es sollte schon klar sein was Milch wollte.
var
MeinFloatWert: Single; ReadProcessMemory(hProcess, hBase, @MeinFloatWert, SizeOf(MeinFloatWert), dwRead) |
Re: Float Addresse aus RAM laden???
Zitat:
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:
lg. Astatfunction 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. |
Re: Float Addresse aus RAM laden???
Wie kann ich diesen Wert jetzt noch in einen String umwandeln???
|
Re: Float Addresse aus RAM laden???
Zitat:
![]() Grüße Klaus |
Re: Float Addresse aus RAM laden???
Zitat:
|
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. |
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.
|
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??? |
Re: Float Addresse aus RAM laden???
Zitat:
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? |
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:
So hätte ich gerne eine Unit, aber das gibts wahrscheinlich nicht, oder irre ich mich???
function LeseBytes(Addresse:Integer):String;
function LeseFloat(Addresse:Integer):String; |
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 ![]()
Delphi-Quellcode:
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.
function LeseBytes(Addresse:Integer):String;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz