Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > AutoIt
You last visited: Today at 18:54

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Speicherbereich auslesen mit AutoIt

Discussion on Speicherbereich auslesen mit AutoIt within the AutoIt forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: May 2009
Posts: 5
Received Thanks: 0
Speicherbereich auslesen mit AutoIt

Hi,

ich möchte gerne den Text von Dialogen in SA:MP auslesen. Dazu habe ich mit Cheat Engine die (dynamische) Adresse und passende Pointer dazu gefunden.

In Cheat Engine wird der Pointer so angegeben:
samp.dll+0020E090-> 029e640f0 +17C = 029E666C
029E666C -> 078a6fd8 + 1A = 078A9FF2

Nun habe ich versucht, diesen Pointer mit AutoIt nachzuvollziehen:
Code:
$pidm = WinGetProcess("GTA:SA:MP")
Global $pointerscanOffset[3]
	$pointerscanOffset[0] = 0
	$pointerscanOffset[1] = Dec("17C")
	$pointerscanOffset[2] = Dec("1A")
	$StaticOffset = Dec("0020E090")
	$openmem = _MemoryOpen($pid)
	$baseADDR = _MemoryModuleGetBaseAddress($pid, "samp.dll")
	$finalADDR = "0x" & Hex($baseADDR + $StaticOffset)
	$MemPointer = _MemoryPointerRead($finalADDR, $openmem, $pointerscanOffset)
	_MemoryClose($openmem)
	MsgBox(1, "Endadresse",$result[0])
Nun sollte ich doch erwarten, am Ende die Adresse 078A9FF2 zu erhalten, in der sich momentan der Dialogtext versteckt, oder?

Das Ergebnis ist jedoch 29e650a. Wenn ich jedoch das letzte Offset wegnehme, den Pointer also als 2-Level Pointer betrachte, komme ich auf 29e666c, was ja völlig richtig ist.

Wo liegt also mein Fehler?
bauerj is offline  
Old 12/28/2012, 18:00   #2

 
elite*gold: 64
Join Date: May 2011
Posts: 1,229
Received Thanks: 854
Code:
$pidm = WinGetProcess("GTA:SA:MP")
Global $pointerscanOffset[2]
	$pointerscanOffset[0] = 0x17C
	$pointerscanOffset[1] = 0x1A
	$StaticOffset = 0x0020E090
	$openmem = _MemoryOpen($pid)
	$baseADDR = _MemoryModuleGetBaseAddress($pid, "samp.dll")
	$finalADDR = $StaticOffset + $baseADDR
	$MemPointer = _MemoryRead($finalADDR, $openmem) +     $pointerscanOffset[0]
	$MemPointer = _MemoryRead($MemPointer, $openmem) + $pointerscanOffset[1]
	$result = _MemoryRead($MemPointer , $openmem)
	_MemoryClose($openmem)
	MsgBox(1, "Endadresse",$result)
BladeTiger12 is offline  
Old 12/28/2012, 18:30   #3
 
elite*gold: 0
Join Date: May 2009
Posts: 5
Received Thanks: 0
Hmm, ich habe es ein wenig bearbeitet:
Code:
	Global $pointerscanOffset[3]
	$pointerscanOffset[0] = 0
	$pointerscanOffset[1] = 0x17C
	$pointerscanOffset[2] = 0x1A
	$StaticOffset = Dec("0020E090")
	$openmem = _MemoryOpen($pid)
	$baseADDR = _MemoryModuleGetBaseAddress($pid, "samp.dll")
	$finalADDR = "0x" & Hex($baseADDR + $StaticOffset)
	$MemPointer = _MemoryRead($finalADDR, $openmem) +     $pointerscanOffset[1]
	MsgBox(1, "Adresse des ersten Pointers:",hex($MemPointer))
	$MemPointer = _MemoryRead(hex($MemPointer), $openmem) + $pointerscanOffset[2]
	MsgBox(1, "Adresse des zweiten Pointers:",hex($MemPointer))
	$result = _MemoryRead(hex($MemPointer) , $openmem, "char[16]")
	_MemoryClose($openmem)
Ich bekomme als Ausgabe zum ersten Pointer 0x29e666c - wieder korrekt, beim zweiten Pointer dann aber 0x1a. Bedeutet das dann, dass in der von CE genannten Adresse keine andere Adresse drin steht, sondern nur 0?
bauerj is offline  
Old 12/28/2012, 19:04   #4

 
elite*gold: 64
Join Date: May 2011
Posts: 1,229
Received Thanks: 854
warum machst du Dec und die 0 wieder hin.... lass das doch einfach weg
#Edit:
Wo ist eig. die Variable $pid deklariert?
BladeTiger12 is offline  
Old 12/28/2012, 19:33   #5
 
elite*gold: 0
Join Date: May 2009
Posts: 5
Received Thanks: 0
Achso, ja, mein ganzes Script sieht wie folgt aus:
Code:
#include <memory.au3>
Func _Readpointerscan($pid)

	Global $pointerscanOffset[3]
	$pointerscanOffset[0] = 0
	$pointerscanOffset[1] = 0x124
	$pointerscanOffset[2] = 0x1A
	$StaticOffset = 0x0020DFA8
	$openmem = _MemoryOpen($pid)
	$baseADDR = _MemoryModuleGetBaseAddress($pid, "samp.dll")
	$finalADDR = "0x" & Hex($baseADDR + $StaticOffset)
	$MemPointer = _MemoryRead($finalADDR, $openmem) +     $pointerscanOffset[1]
	MsgBox(1, "Titel",hex($MemPointer))
	$MemPointer = _MemoryRead(hex($MemPointer), $openmem) + $pointerscanOffset[2]
	MsgBox(1, "Titel",hex($MemPointer))
	$result = _MemoryRead(hex($MemPointer) , $openmem, "char[16]")
	_MemoryClose($openmem)



	Return $MemPointer
EndFunc
$pidm = WinGetProcess("GTA:SA:MP")
$result = _Readpointerscan($pidm)

MsgBox(1, "Titel",$result)
Aber das Problem besteht weiterhin.
bauerj is offline  
Old 12/28/2012, 20:14   #6

 
elite*gold: 64
Join Date: May 2011
Posts: 1,229
Received Thanks: 854
Probiers mal so:
Code:
#include <memory.au3>

Opt("WinTitleMatchMode" , 2)

Func _Readpointerscan($pid)

	Global $pointerscanOffset[2]
	$pointerscanOffset[0] = 0x124
	$pointerscanOffset[1] = 0x1A
	$StaticOffset = 0x0020DFA8
	$openmem = _MemoryOpen($pid)
	$baseADDR = _MemoryModuleGetBaseAddress($pid, "samp.dll")
	$finalADDR = $baseADDR + $StaticOffset
	$MemPointer = _MemoryRead($finalADDR, $openmem) +     $pointerscanOffset[1]
	MsgBox(1, "Titel",hex($MemPointer))
	$MemPointer = _MemoryRead(hex($MemPointer), $openmem) + $pointerscanOffset[0]
	MsgBox(1, "Titel",hex($MemPointer))
	$result = _MemoryRead(hex($MemPointer) , $openmem, "char[16]")
	_MemoryClose($openmem)



	Return $MemPointer
EndFunc
$pidm = WinList("GTA")
$result = _Readpointerscan($pidm[1][1])

MsgBox(1, "Titel",$result)
BladeTiger12 is offline  
Old 12/28/2012, 20:31   #7
 
elite*gold: 0
Join Date: May 2009
Posts: 5
Received Thanks: 0
Nein, keine Verbesserung, im Gegenteil^^

Ich glaube auch nicht, dass es an einem falsch gefundenen Prozess liegt, da ich ja die erste Adresse richtig finde.
bauerj is offline  
Old 12/28/2012, 21:04   #8

 
elite*gold: 64
Join Date: May 2011
Posts: 1,229
Received Thanks: 854
Hmm.
Hast du Skype?
Wenn ja: MrBladeTiger12 mal adden

#Edit:
Hier ist noch eine kleine UDF da muss man nicht viel angeben.
Selbst geschrieben aber kann eigentlich jeder
der ein bisschen Memory kennt auch schreiben.
Offsets mit , trennen z.b:
0x50,0xAC,0x1AF
Case = 0 Read Case = 1 Write
Code:
;Case = 0 (Read)   Case = 1 (Write)

Func MemoryPointer($Adresse,$ProcessName,$Offsets,$Case=0,$Type="",$Wert="")
	#Region Process überprüfen
		$PID = ProcessExists($ProcessName)
		If $PID = False Then
			SetError(1)
			Return "Prozess nicht gefunden!"
		EndIf
	#EndRegion Process überprüfen

	#Region Adresse-0x-hinzufügen(Wenn es nicht dabei steht)
		If StringInStr($Adresse , "0x") = False Then
			$NewAdress = "0x" & $Adresse
		Else
			$NewAdress = $Adresse
		EndIf
	#EndRegion Addresse-0x-hinzufügen

	#Region Öffnen<-Memory->Pointer Rechnen
		$Mem = _MemoryOpen($PID)
		$Module = _MemoryModuleGetBaseAddress($PID , $ProcessName)
		$Pointer = $NewAdress + $Module
	#EndRegion Öffnen<-Memory->Pointer Rechnen

	#Region Space entfernen<-Offsets->Splitten
		$ReplaceOffset = StringReplace($Offsets, " " , "")
		$SplitOffset = StringSplit($ReplaceOffset , "," , 2)
	#EndRegion Space entfernen<-Offsets->Splitten

	#Region Offsets-0x-hinzufügen(Wenn es nicht dabei steht)
		For $CheckOffsets = 0 To UBound($SplitOffset) -1
			If StringInStr($SplitOffset[$CheckOffsets] , "0x") = False Then
				$OldOffset = $SplitOffset[$CheckOffsets]
				$SplitOffset[$CheckOffsets] = "0x" & $OldOffset
			EndIf
		Next
	#EndRegion Offsets-0x-hinzufügen

	#Region Größe der Offsets
		If UBound($SplitOffset) = 1 Then
			$Size = 1
		ElseIf UBound($SplitOffset) > 1 Then
			$Size = UBound($SplitOffset) -1
		ElseIf UBound($SplitOffset) <= 0 Then
			SetError(2)
			Return "Keine Offsets gefunden!"
		EndIf
	#EndRegion Größe der Offsets

	#Region Memory lessen
		For $i = 0 To $Size
			$Pointer = _MemoryRead($Pointer , $Mem) + $SplitOffset[$i]
		Next
	#EndRegion Memory lessen

	#Region Haupt-Function Read/Write
		If $Type = "" Then
			$Type = "dword"
		EndIf

		Switch $Case
			Case 0 ;Lessen
				$ReadWrite = _MemoryRead($Pointer , $Mem , $Type)
			Case 1 ;Schreiben
				$ReadWrite = _MemoryWrite($Pointer , $Mem , $Wert , $Type)
		EndSwitch

		Return $ReadWrite
	#EndRegion Haupt-Function Read/Write
EndFunc
Und hier noch ein kleines Beispiel:
Code:
$Result = MemoryPointer(0x342342 , "GTA.exe" , "0x50,0x60,0x70,0xA4" , 0 , "dword")
MsgBox(64 , "Ergebnis" , $Result)
Wenn es hilft kannst du es ja benutzen.
BladeTiger12 is offline  
Old 12/28/2012, 22:44   #9
 
elite*gold: 0
Join Date: May 2009
Posts: 5
Received Thanks: 0
Hilft leider nichts :\
bauerj is offline  
Old 12/29/2012, 01:13   #10

 
elite*gold: 64
Join Date: May 2011
Posts: 1,229
Received Thanks: 854
Dann Probier es so:
(Musst nur Prozessname angeben weiß ihn nicht.)
Code:
#RequireAdmin
#include <Memory.au3>
$Result = MemoryPointer(0x0020E090 , "PROZESS.EXE" , "0x17C,0x1A" , 0 , "char[16]")
MsgBox(64 , "Ergebnis" , $Result)

Func MemoryPointer($Adresse,$ProcessName,$Offsets,$Case=0,$Type="",$Wert="")
	#Region Process überprüfen
		$PID = ProcessExists($ProcessName)
		If $PID = False Then
			SetError(1)
			Return "Prozess nicht gefunden!"
		EndIf
	#EndRegion Process überprüfen

	#Region Adresse-0x-hinzufügen(Wenn es nicht dabei steht)
		If StringInStr($Adresse , "0x") = False Then
			$NewAdress = "0x" & $Adresse
		Else
			$NewAdress = $Adresse
		EndIf
	#EndRegion Addresse-0x-hinzufügen

	#Region Öffnen<-Memory->Pointer Rechnen
		$Mem = _MemoryOpen($PID)
		$Module = _MemoryModuleGetBaseAddress($PID , $ProcessName)
		$Pointer = $NewAdress + $Module
	#EndRegion Öffnen<-Memory->Pointer Rechnen

	#Region Space entfernen<-Offsets->Splitten
		$ReplaceOffset = StringReplace($Offsets, " " , "")
		$SplitOffset = StringSplit($ReplaceOffset , "," , 2)
	#EndRegion Space entfernen<-Offsets->Splitten

	#Region Offsets-0x-hinzufügen(Wenn es nicht dabei steht)
		For $CheckOffsets = 0 To UBound($SplitOffset) -1
			If StringInStr($SplitOffset[$CheckOffsets] , "0x") = False Then
				$OldOffset = $SplitOffset[$CheckOffsets]
				$SplitOffset[$CheckOffsets] = "0x" & $OldOffset
			EndIf
		Next
	#EndRegion Offsets-0x-hinzufügen

	#Region Größe der Offsets
		If UBound($SplitOffset) = 1 Then
			$Size = 1
		ElseIf UBound($SplitOffset) > 1 Then
			$Size = UBound($SplitOffset) -1
		ElseIf UBound($SplitOffset) <= 0 Then
			SetError(2)
			Return "Keine Offsets gefunden!"
		EndIf
	#EndRegion Größe der Offsets

	#Region Memory lessen
		For $i = 0 To $Size
			$Pointer = _MemoryRead($Pointer , $Mem) + $SplitOffset[$i]
		Next
	#EndRegion Memory lessen

	#Region Haupt-Function Read/Write
		If $Type = "" Then
			$Type = "dword"
		EndIf

		Switch $Case
			Case 0 ;Lessen
				$ReadWrite = _MemoryRead($Pointer , $Mem , $Type)
			Case 1 ;Schreiben
				$ReadWrite = _MemoryWrite($Pointer , $Mem , $Wert , $Type)
		EndSwitch

		Return $ReadWrite
	#EndRegion Haupt-Function Read/Write
EndFunc
Ansonsten ein falscher Pointer.
BladeTiger12 is offline  
Reply


Similar Threads Similar Threads
WoW Bot AutoIT HP auslesen
10/17/2013 - AutoIt - 13 Replies
Hey,ich hab damit angefangen mit nen kleinen Bot fürn PrivatServer zu basteln,der auf der Version 3.3.3a läuft. Gibt es für PrivatServer andere Offsets als für die Offiziellen Server? Aber irgendwie bekomme ich immer als HP anzahl : 0 raus. Ich habe die richtigen Offsets genommen : ;/*Patch 3.3.3*/ ;/*Player offsets*/ Local $Mem_Player_Base = 0x00B366D0, $Mem_Player_Base_P1 = 0x34, $Mem_Player_Base_P2 = 0x24
[AutoIT] Pointer auslesen
07/14/2013 - AutoIt - 5 Replies
Guten Abend/Nacht liebe Community, heute möchte ich euch gerne das anzeigen eines Wertes via Pointer in Autoit näher bringen. Vorwort: Bitte bedenkt das dies hier mein erstes Tutorial ist und ich es mitten in der Nacht schreibe. Ich werde jeden Teil dieses Tutorials auch nocheinmal als Video verfilmen und hochladen und das Script posten damit ihr euch alles nochmal in Ruhe anschauen könnt. Als Beispiel zum Pointer auslesen habe ich das Rollenspiel NosTale genommen. Ihr könnt...
MAC-Adresse mit AutoIt auslesen?
07/28/2011 - AutoIt - 5 Replies
Mir kam gerade eine Idee für ein Login-System. Bei diesem System wird die MAC-Adresse des Benutzers ausgelesen, daraus ein Code generiert, den der Benutzer dann dem Verkäufer schicken muss, welcher den passenden Gegencode generiert, der dann gespeichert wird. Diese Code-/MAC-Adressen Kombination wird dann bei jedem Programmstart auf ihre Richtigkeit geprüft. So kann man die Benutzung auf einen einzigen PC einschränken. :) Wäre dies möglich? Kann man diese Idee umsetzen? :D Ich freue mich...
AutoIt .exe quelldateien auslesen
09/15/2010 - Last Chaos - 8 Replies
Morgen liebe com, habe mich mal ein bissi mir AutoIt beschäftigt.. nun würde ich gerne mal sehen wie z.b der ultrabot geschrieben wurde(d.h. die quelldatei mit den befehlen im wordpad oder autoit fenster öffnen).. steh grad bissl aufm schlauch und mich würds ärgern daran zu scheitern:mad: naja is denk ich ein kleines problem aber bin iwie grad neben mir:rolleyes: vielen dank für die tipps :) MfG Insanty



All times are GMT +1. The time now is 18:54.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.