Auto It - Basepointer + Offsets umsetzen [Frage]

05/12/2013 04:16 Andreas9#1
05/17/2013 15:54 MrSm!th#2
#moved
05/17/2013 19:22 BladeTiger12#3
Probier das ganze mal so:
Code:
#RequireAdmin

Func checkLife()
	$pa = 0x1661A64
	Dim $offset[2] = [0x168, 0x8]

	$pid = WinGetProcess($fenstername)

	$Module = _MemoryModuleGetBaseAddress($pid, $fenstername) + $pa


	$aufmachen = _MemoryOpen($pid)

	$ergebnis = _MemoryRead($Module, $aufmachen) + $offset[0]
	$ergebnis = _MemoryRead($ergebnis, $aufmachen) + $offset[1]

	$ergebnis = _MemoryRead($ergebnis, $aufmachen, "Float")

	$zumachen = _MemoryClose($aufmachen)
	Return $ergebnis
EndFunc   ;==>checkLife

Func _MemoryModuleGetBaseAddress($iPID, $sModule)
	If Not ProcessExists($iPID) Then Return SetError(1, 0, 0)

	If Not IsString($sModule) Then Return SetError(2, 0, 0)

	Local $PSAPI = DllOpen("psapi.dll")

	;Get Process Handle
	Local $hProcess
	Local $PERMISSION = BitOR(0x0002, 0x0400, 0x0008, 0x0010, 0x0020) ; CREATE_THREAD, QUERY_INFORMATION, VM_OPERATION, VM_READ, VM_WRITE

	If $iPID > 0 Then
		Local $hProcess = DllCall("kernel32.dll", "ptr", "OpenProcess", "dword", $PERMISSION, "int", 0, "dword", $iPID)
		If $hProcess[0] Then
			$hProcess = $hProcess[0]
		EndIf
	EndIf

	;EnumProcessModules
	Local $Modules = DllStructCreate("ptr[1024]")
	Local $aCall = DllCall($PSAPI, "int", "EnumProcessModules", "ptr", $hProcess, "ptr", DllStructGetPtr($Modules), "dword", DllStructGetSize($Modules), "dword*", 0)
	If $aCall[4] > 0 Then
		Local $iModnum = $aCall[4] / 4
		Local $aTemp
		For $i = 1 To $iModnum
			$aTemp = DllCall($PSAPI, "dword", "GetModuleBaseNameW", "ptr", $hProcess, "ptr", Ptr(DllStructGetData($Modules, 1, $i)), "wstr", "", "dword", 260)
			If $aTemp[3] = $sModule Then
				DllClose($PSAPI)
				Return Ptr(DllStructGetData($Modules, 1, $i))
			EndIf
		Next
	EndIf

	DllClose($PSAPI)
	Return SetError(-1, 0, 0)

EndFunc   ;==>_MemoryModuleGetBaseAddress
05/30/2013 15:01 golle12#4
Welche Autoit Version hast du denn weil die UDF für den Pointer funktioniert bei den neueren Autoit Versionen nicht mehr, lad dir einfach eine ältere Version Herunter dann sollte es auch funktionieren :D
kannst auch auf meinen Post gehen den ich unten in der Signatur habe da ist alles näher beschrieben :)
05/30/2013 15:42 KDeluxe#5
Oder man schreibt die UDF um, sodass sie wieder funktioniert. Die Funktionen aus der NomadMemory.au3 bzw. Pointer.au3 können z. B. standardmäßig auch nicht für 64 Bit Anwendungen verwendet werden, da die typen "falsch" sind. Könnte bei der aktuellen Version vielleicht der selbe Auslöser sein.
05/30/2013 18:16 _RowLegend_#6
Scheint anscheinend nicht von den Entwicklern beabsichtigt worden sein allerdings wird die Funktion Hex falsch interpretiert.
Du musst sie Mit Int() definieren, sprich aus:

PHP Code:
   $IV_ADDRESS "0x" Hex($IV_DATA[1] + $AV_OFFSET[$I]) 

wird:

PHP Code:
   $IV_ADDRESS "0x" Hex(Int($IV_DATA[1] + $AV_OFFSET[$I])) 
Den Tipp hat mir Shadow992 gegeben und seitdem funktioniert es wunderbar.
05/31/2013 15:41 KDeluxe#7
$iv_Address wird bei weiterer Verwendung nicht als String verwendet, sondern als Zahl interpretiert. Wieso also unnötig eine Zahl in einen String umwandeln um diesen anschließend wieder in eine Zahl umzuwandeln? Unnötige Performanceeinbüßen.

Code:
$iv_Data + $av_Offset[$i]
reicht vollkommen aus. Das hatte BladeTiger12 schon in seinem Code berücksichtigt, wobei hier sämtliche Fehlerüberprüfung fehlt.