|
You last visited: Today at 18:54
Advertisement
Speicherbereich auslesen mit AutoIt
Discussion on Speicherbereich auslesen mit AutoIt within the AutoIt forum part of the Coders Den category.
12/28/2012, 17:26
|
#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?
|
|
|
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)
|
|
|
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?
|
|
|
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?
|
|
|
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.
|
|
|
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)
|
|
|
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.
|
|
|
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.
|
|
|
12/28/2012, 22:44
|
#9
|
elite*gold: 0
Join Date: May 2009
Posts: 5
Received Thanks: 0
|
Hilft leider nichts :\
|
|
|
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.
|
|
|
 |
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.
|
|