Wie kann ich mit AutoIT einen Wert auslesen, dessen Adresse ich nicht kenne, aber den Pointer weiß, der auf die Adresse weißt. Wie heißt die Funktion? Welches Modul brauche ich?
Memory & Pointer
-
- [ gelöst ]
-
ChrisEU -
6. Oktober 2009 um 21:49 -
Geschlossen -
Erledigt
-
-
Brauchste eine Include dafür, habs im Anhang für dich hochgeladen.
-
Mhh.. ich bekomm ein ERROR:
==> Subscript used with non-Array variable.:
$value = _MemoryRead($adresse[1], $open)
$value = _MemoryRead($adresse^ ERRORMein Script:
[autoit]
[/autoit]
$pointer = 0x09DB914
$adresse = _MemoryPointerRead($pointer,$open,30)
MsgBox(1,"",$adresse[1])Was mach ich falsch?
-
Hier ein Beispiel für Pinball:
Spoiler anzeigen
[autoit]#include <ButtonConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Pointer.au3>
SetPrivilege("SeDebugPrivilege", 1)#Region ### START Koda GUI section ### Form=
[/autoit] [autoit][/autoit] [autoit]
$Form1 = GUICreate("Pinball", 207, 75, 361, 194)
$Button1 = GUICtrlCreateButton("Wert lesen", 8, 8, 83, 25, 0)
$Button2 = GUICtrlCreateButton("Wert schreiben", 112, 8, 83, 25, 0)
$Label1 = GUICtrlCreateLabel("", 10, 40, 300, 50)
GUICtrlSetFont ( -1, 16 )
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###AdlibEnable ( "PinballPointerLesen" )
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
PinballPointerLesen()
Case $Button2
PinballPointerSchreiben()
EndSwitch
WEndFunc PinballPointerLesen()
[/autoit] [autoit][/autoit] [autoit]
$pid = ProcessExists("Pinball.exe")
$pinball=_MemoryOpen ( $pid )If $pid = 0 Then
[/autoit] [autoit][/autoit] [autoit]
MsgBox(16,@ScriptName,'Prozess nicht gefunden, Skript wird beendet.')
Exit 1
EndIfLocal $av_Offset[2]
[/autoit] [autoit][/autoit] [autoit]
$av_Offset[0]=0
$av_Offset[1]=82$PointerReadReturn=_MemoryPointerRead ( 0x01025040, $pinball, $av_Offset )
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetData ( $Label1, $PointerReadReturn[1] )
EndFuncFunc PinballPointerSchreiben()
[/autoit] [autoit][/autoit] [autoit]
$score=InputBox ( "Wert eingeben", "Wie hoch soll der Score werden ?", "" )
$pid = ProcessExists("Pinball.exe")
$pinball=_MemoryOpen ( $pid )If $pid = 0 Then
[/autoit] [autoit][/autoit] [autoit]
MsgBox(16,@ScriptName,'Prozess nicht gefunden, Skript wird beendet.')
Exit 1
EndIfLocal $av_Offset[2]
[/autoit] [autoit][/autoit] [autoit]
$av_Offset[0]=0
$av_Offset[1]=82$return=_MemoryPointerWrite ( 0x01025040, $pinball, $av_Offset, $score )
[/autoit]
EndFunc -
In CE wird folgende Pointer Adresse angezeigt: atioglxx.dll+00166E0C
Wie kann ich mit der suchen?
Nur 0x0166E06 funktioniert nicht. -
Ist aber kein Bot oder so? Bin mir gerade nicht sicher ob ich noch helfen darf^^,
Du musst auf Add Address Manually gehen,, da bei Address of Pointer atioglxx.dll+00166E0C reinschreibe ( Prozess muss ausgewählt sein ), jetzt steht da obendrüber die Adresse die du brauchst ( Kannst auch auf Ok drücken und sie steht unten drin).
-
nein nein, kein bot

wie das bei cheatengine funzt, weiß ich aber ich möchte jetzt, dass mein script diesen pointer ausließt. und da weiß ich nicht, wie das geht
-
Ja die Adressen atioglxx.dll+00166E0C müssen ja erst "addiert" werden damit du es in AutoIt nutzen kannst, dann musste es eigentlich nur so machen wie in dem Beispiel, die Offsets müssen Dezimal sein und der erste Offset immer 0 ( $av_Offset[0]=0 ), steht ja bei der Beschreibung drin. Musst dir immer den Return von der Funktion anschauen und gucken ob es auf die richtige Adresse zeigt.
-
So, das funktioniert jetzt alles.
[autoit]
Code sieht so aus:$pointer = "atioglxx.dll+0x0166E0C" ;hier weiß ich nicht wie man die "addiert"
[/autoit][autoit][/autoit][autoit]
$offset[0] = 0
$offset[1] = 297$open = _MemoryOpen(ProcessExists("wop.exe"))
[/autoit]
$adresse = _MemoryPointerRead($pointer,$open,$offset)
MsgBox(1,"",$adresse[0])Das, was in der MsgBox steht ist 0x00000129
Das ist natürlich nicht die Adresse. Das was mir jetzt noch fehlt ist, die Addition von atioglxx.dll+00166E0C / atioglxx.dll+0x0166E0C
Wie stelle ich dies an? -
Ja schon klar^^, das hab ich doch extra geschrieben

Kannst du dir von CE ausgeben lassen, so wie ich es gesagt hab:
ZitatDu musst auf Add Address Manually gehen, da bei Address of Pointer atioglxx.dll+00166E0C reinschreibe ( Prozess muss ausgewählt sein ), jetzt steht da obendrüber die Adresse die du brauchst ( Kannst auch auf Ok drücken und sie steht unten drin).
So grigst du die "Addierte" Adresse.
-
also geht es nicht, das autoit das selber macht, sodass man komplett unabhängig von CE ist. Das, sobald man das Script weiter gibt, es auch auf dem anderen PC funktioniert?!
-
also geht es nicht, das autoit das selber macht, sodass man komplett unabhängig von CE ist. Das, sobald man das Script weiter gibt, es auch auf dem anderen PC funktioniert?!
Doch! Ich glaub ich muss nen Video machen

Du sollst ganz einfach, den Prozess Öffnen, dann auf Add Address Manually gehen, und bei Address atioglxx.dll+00166E0C reinschreiben, dann auf Ok. Jetzt hast du die "Addierte" Adresse von atioglxx.dll+00166E0C in der Liste unten stehen. Die ist auch statisch! Das ist dann genau das selbe wie atioglxx.dll+00166E0C , nur das du damit auch was Anfangen kannst
, keine Ahnung warum CE da erst atioglxx.dll+00166E0C hinschreibt und nicht gleich die richtige Adresse schreibt. -
Zitat
Doch! Ich glaub ich muss nen Video machen

jaaa n video

(also wenn du zeit hast, würd mich auch intressieren)
-
jaaa n video

(also wenn du zeit hast, würd mich auch intressieren)
Nagut, hab mal eins schnell gemacht
Ist aber für Prototype, hab jetzt keinen hohen Pointer für andere Programme gehabt sry. Vergebt mir

-
danke, jetzt weiß ich, was du meinst und es funktioniert!
-
geile sache.
vielen dank
