4 Byte in Float konvertieren mit AutoIT

06/30/2012 12:16 cypresse#1
Hi,
Die Variable deren Adresse ich mit Cheat-engine suche ist eine Float variable. Wenn ich die Adresse mit AutoIT einlese interpretiert er es allerdings als 4Byte und bringt ein total falsches Ergebnis. Da man nur Variablen mit dem Typ variant deklarieren kann wollte ich fragen ob man ein 4Byte auch in einen Float umrechnen kann.
06/30/2012 12:37 KDeluxe#2
Du ließt den Wert vermutlich über _MemoryRead() oder _MemoryPointerRead() aus. Du musst den Parameter $sv_Type einfach auf "float" ändern, standardmäßig ist dieser "DWORD".

Wenn du ReadProcessMemory per DllCall benutzen solltest, sollte es in etwa so aussehen:
Code:
$lpBuffer = DllStructCreate("float")
DllCall("Kernel32.dll", "int", "ReadProcessMemory", "HANDLE", $hProcess, "DWORD", $dwAddress, "ptr", DllStructGetPtr($lpBuffer), "ULONG_PTR", DllStructGetSize($lpBuffer), "int", 0)
06/30/2012 15:33 cypresse#3
danke:D
mit welchem befehl muss ich dann die Speicheradresse einlesen?
06/30/2012 15:53 Lawliet#4
Meinst du jetzt die Adresse oder den Wert, auf welche die Adresse zeigt?
06/30/2012 16:01 cypresse#5
ich meine welchen befehl muss ich benutzen um die Speicheradresse so auszulesen, das es mir den richtigen Wert (also float) ausgibt.
Muss das _MemoryRead() oder _MemoryPointerRead() oder ReadProcessMemory sein? Ich kenn mich da leider nicht aus;)
06/30/2012 16:53 KDeluxe#6
_MemoryRead() und _MemoryPointerRead() sind UDFs (User Defined Functions), welche die Benutzung erleichtern sollen.
_MemoryRead() ließt einfach nur den Wert einer Adresse.
_MemoryPointerRead() ermöglicht dir einfaches auslesen eines Pointers, zusätzlich zur Adresse musst du noch Offsets angeben.

Beide Funktionen findest du in der "NomadMemory.au3" bzw. der "Pointer.au3", diese findest du mit Google.
Du musst jeweils den letzten Parameter auf Float setzen:
Code:
$rData = _MemoryRead($ah_Handle, $iv_Address, "float")
06/30/2012 17:19 cypresse#7
ok danke,
bei mir kommt aber immer 0 raus, egal welchen wert die adresse hat.
hier mein code:

#include <NoMadMemory.au3>

$iv_Address = 0x00FBF314
$lpBuffer = DllStructCreate("float")
$hprocess = WinGetProcess("BF2")
DllCall("Kernel32.dll", "int", "ReadProcessMemory", "HANDLE", $hProcess, "DWORD", $iv_Address, "ptr", DllStructGetPtr($lpBuffer), "ULONG_PTR", DllStructGetSize($lpBuffer), "int", 0)
$info = _MemoryOpen($hProcess)
$Data = _MemoryRead($info, $iv_Address, "float")
MsgBox(1,"wert:",$Data)


Was ist daran falsch?
06/30/2012 18:28 KDeluxe#8
Den manuellen DllCall() kannst du dir sparen.Wirklich falsch ist nichts, aber gut ist es dennoch nicht. Du solltest zumindest immer überprüfen, ob du ein gültiges Handle hast.

Hier mal ein Beispiel:
Code:
#include <NomadMemory.au3>

$dwAddress = 0x00FBF314
$szProcessName = "BF2.exe"
$dwProcessId = ProcessExists($szProcessName)
If $dwProcessId > 0 Then
	$Handle = _MemoryOpen($dwProcessId)
	If Not @error Then
		$rData = _MemoryRead($Handle, $dwAddress, "float")
		If @error Then
			MsgBox(48, "Fehler", "Lesen des Speichers fehlgeschlagen." & @CRLF & "Fehlercode: " & @error)
		Else
			MsgBox(64, "Info", "Adresse: " & $dwAddress & @CRLF & "Wert: " & $rData)
		EndIf
	Else
		MsgBox(48, "Fehler", "Auf " & $szProcessName & " konnte nicht zugegriffen werden." & @CRLF & "Fehlercode: " & @error)
	EndIf
Else
	MsgBox(48, "Fehler", "Starte " & $szProcessName)
EndIf
Du kannst das Script ja mal ausführen und schreiben, woran es scheitert.