Memory & Pointer

  • 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?

    Einmal editiert, zuletzt von ChrisEU (8. Oktober 2009 um 18:15)

  • Mhh.. ich bekomm ein ERROR:

    ==> Subscript used with non-Array variable.:
    $value = _MemoryRead($adresse[1], $open)
    $value = _MemoryRead($adresse^ ERROR

    Mein Script:

    [autoit]


    $pointer = 0x09DB914
    $adresse = _MemoryPointerRead($pointer,$open,30)
    MsgBox(1,"",$adresse[1])

    [/autoit]

    Was mach ich falsch?

  • Hier ein Beispiel für Pinball:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <Pointer.au3>
    SetPrivilege("SeDebugPrivilege", 1)

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $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 ###

    [/autoit] [autoit][/autoit] [autoit]

    AdlibEnable ( "PinballPointerLesen" )

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    PinballPointerLesen()
    Case $Button2
    PinballPointerSchreiben()
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func PinballPointerLesen()
    $pid = ProcessExists("Pinball.exe")
    $pinball=_MemoryOpen ( $pid )

    [/autoit] [autoit][/autoit] [autoit]

    If $pid = 0 Then
    MsgBox(16,@ScriptName,'Prozess nicht gefunden, Skript wird beendet.')
    Exit 1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $av_Offset[2]
    $av_Offset[0]=0
    $av_Offset[1]=82

    [/autoit] [autoit][/autoit] [autoit]

    $PointerReadReturn=_MemoryPointerRead ( 0x01025040, $pinball, $av_Offset )
    GUICtrlSetData ( $Label1, $PointerReadReturn[1] )
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func PinballPointerSchreiben()
    $score=InputBox ( "Wert eingeben", "Wie hoch soll der Score werden ?", "" )
    $pid = ProcessExists("Pinball.exe")
    $pinball=_MemoryOpen ( $pid )

    [/autoit] [autoit][/autoit] [autoit]

    If $pid = 0 Then
    MsgBox(16,@ScriptName,'Prozess nicht gefunden, Skript wird beendet.')
    Exit 1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $av_Offset[2]
    $av_Offset[0]=0
    $av_Offset[1]=82

    [/autoit] [autoit][/autoit] [autoit]

    $return=_MemoryPointerWrite ( 0x01025040, $pinball, $av_Offset, $score )
    EndFunc

    [/autoit]
  • 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).

    Einmal editiert, zuletzt von Greek (8. Oktober 2009 um 21:29)

  • 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.
    Code sieht so aus:

    [autoit]

    $pointer = "atioglxx.dll+0x0166E0C" ;hier weiß ich nicht wie man die "addiert"
    $offset[0] = 0
    $offset[1] = 297

    [/autoit][autoit][/autoit][autoit]

    $open = _MemoryOpen(ProcessExists("wop.exe"))
    $adresse = _MemoryPointerRead($pointer,$open,$offset)
    MsgBox(1,"",$adresse[0])

    [/autoit]

    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:

    Zitat

    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).

    So grigst du die "Addierte" Adresse.

    Einmal editiert, zuletzt von Greek (8. Oktober 2009 um 21:30)

  • 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 :rolleyes:

    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.

    Einmal editiert, zuletzt von Greek (8. Oktober 2009 um 21:30)