[Memory read] Baseadresse mit Script rausfinden?

02/13/2012 15:11 Masterscripter#1
Hallo erstmal,

zuerst einmal die Situation. Also ich habe in dem Spiel "Aion" einen Pointer für die HP Anzahl herausgefunden. Der lautet : "Game.dll"+0009C01C und der Offsetwert des Pointers lautet : 4.

Ich hab den Pointer jetzt in mein Script eingefügt, indem ich die game.dll Adresse in Cheat engine gesucht und mit dem Wert "0009C01C" addiert habe und den Offset Wert dazu gegeben habe. Ich habe mit der Nomadmemory.au3 gearbeitet. Das hat auch alles soweit wunderbar geklappt.

Das Problem:

Das Problem ist, dass ich nicht jedesmal wenn ich das Spiel neustarte, die "game.dll" mit Cheat engine neu rausfinden möchte. Ich würde es gerne so machen, dass mein Autoit Script dies automatisch bei jedem Start des Spiels für mich erledigt, sodass ich nicht immer die game.dll bei Cheat engine rausfinden und in meinem Script ändern muss.

Weiß einer zufällig wie das funltionieren könnte?
Vielen Dank schonmal im vorraus :)


Das Script sieht übrigens so aus:
Code:
$Adresse = 0x2CA00000 + 0x0009C01C
Dim $Offset[2] = [0, 0x4]

    $Open = _MemoryOpen(ProcessExists("aion.bin"))
    If Not @error Then
        $Read = _MemoryRead($Adresse, $Open)
        $Value = _MemoryRead($Read + $Offset[1], $Open)
Und die Adresse "0x2CA00000" ist die "Game.dll", die ich bei jedem Neustart des Spiels im Script ändern muss.

Edit:
Problem gelöst, Autoit Script musste zu x86 compiled werden, damit die "Game.dll" gefunden werden konnte.
02/13/2012 18:51 °Remus°#2
gibts in der nomadmemory.au3 nicht auch ne
_MemoryGetBaseAddress()
methode?
hab ich zumindestens schonmal irgendwo gesehen
02/13/2012 19:11 jacky919#3
Ja gibt es
02/14/2012 16:42 Masterscripter#4
@Remus Ja damit hab ich's jetzt mal versucht.

Also damit:
Code:
$baseADDR = _MemoryGetBaseAddress($pid, "Game.dll")
Kommt allerdings immer nur 0 raus ... :/
02/16/2012 13:47 FichteFoll#5
Related:
[Only registered and activated users can see links. Click Here To Register...] #post12835381
[Only registered and activated users can see links. Click Here To Register...] #post12874739

Speziell _ProcessUDGetModuleBaseAddress() sollte dir das liefern, was du suchst.
02/18/2012 21:11 maxi39#6
PHP Code:
#RequireAdmin 
#include <Pointer.au3> 

HotKeySet("{F1}""_Read"

$PID ProcessExists("aion.exe"
If 
$PID 0 Then 
    $Handle 
_MemoryOpen($PID
    
$Address _MemoryModuleGetBaseAddress(ProcessExists("aion.exe"), "Game.dll"
    
$Address "0x" Hex($Address Dec("9C01C")) 
    
Dim $Offset[2] = [0,0x4
Else 
    Exit 
EndIf 

While 
True 
    Sleep
(10
WEnd 

Func _Read
() 
    
$Read _MemoryPointerRead($Address$Handle$Offset"float"
    
MsgBox(0""$Read[1]) 
EndFunc 
vlt so ?? oda etwas umändern ...
03/13/2012 17:35 Masterscripter#7
@maxi39 also bei deinem Script:

Code:
#RequireAdmin 
#include <Pointer.au3> 

HotKeySet("{F1}", "_Read") 

$PID = ProcessExists("aion.exe") 
If $PID > 0 Then 
    $Handle = _MemoryOpen($PID) 
    $Address = _MemoryModuleGetBaseAddress(ProcessExists("aion.exe"), "Game.dll") 
    $Address = "0x" & Hex($Address + Dec("9C01C")) 
    Dim $Offset[2] = [0,0x4] 
Else 
    Exit 
EndIf 

While True 
    Sleep(10) 
WEnd 

Func _Read() 
    $Read = _MemoryPointerRead($Address, $Handle, $Offset, "float") 
    MsgBox(0, "", $Read[1]) 
EndFunc
kommt leider immer nur 0 raus. Weiß einer wieso?:/
03/15/2012 20:09 Masterscripter#8
Kann denn keiner helfen?:/
03/15/2012 20:11 jacky919#9
Debug Privilegien?
03/15/2012 21:59 K1ramoX#10
Les dir mal [Only registered and activated users can see links. Click Here To Register...] durch. Hatte genau das gleiche Problem wie du ;o
03/17/2012 15:33 Masterscripter#11
@Applecode Danke, aber hat anscheinend auch nicht funktioniert. Jetzt kommt zwar nicht mehr 0 raus, dafür hab ich jetzt ne andere Fehlermeldung, die ich noch nie hatte^^. Sieht etwa so aus:

[Only registered and activated users can see links. Click Here To Register...]

Noch einer ne Idee? Ich weiß echt nicht mehr weiter :/

Edit:

Ich suche ja nur eine Alternative, um die Baseadresse von "game.dll" rauszubekommen. Im Moment sieht das ganze halt so aus:

Code:
$Adresse = 0x2CA00000 + 0x0009C01C
Dim $Offset[2] = [0, 0x4]

    $Open = _MemoryOpen(ProcessExists("aion.bin"))
    If Not @error Then
        $Read = _MemoryRead($Adresse, $Open)
        $Value = _MemoryRead($Read + $Offset[1], $Open)
Ich hab also einfach nur "game.dll" bei Cheat engine eingegeben, sodass ich den Wert raushatte und dann hab ich ihn einfach mit der Adresse addiert und da kam auch immer das richtige bei heraus. Nur das Problem ist ja, dass sich die "game.dll" bei jedem Spielneustart ändert.
03/17/2012 15:40 jacky919#12
Scheinbar wird die Funktion rekursiv aufgerufen, sie ruft sich also selber immer wieder auf. AutoIt limitiert aber die Anzahl der Inkarnationen. Die Grenze wurde von deinem Programm überschritten.
Viellleicht könntest du die Funktion hier mal posten.
03/17/2012 15:41 lolkop#13
Quote:
Originally Posted by Masterscripter View Post
@Applecode Danke, aber hat anscheinend auch nicht funktioniert. Jetzt kommt zwar nicht mehr 0 raus, dafür hab ich jetzt ne andere Fehlermeldung, die ich noch nie hatte^^. Sieht etwa so aus:

[Only registered and activated users can see links. Click Here To Register...]

Noch einer ne Idee? Ich weiß echt nicht mehr weiter :/

Edit:

Ich suche ja nur eine Alternative, um die Baseadresse von "game.dll" rauszubekommen. Im Moment sieht das ganze halt so aus:

Code:
$Adresse = 0x2CA00000 + 0x0009C01C
Dim $Offset[2] = [0, 0x4]

    $Open = _MemoryOpen(ProcessExists("aion.bin"))
    If Not @error Then
        $Read = _MemoryRead($Adresse, $Open)
        $Value = _MemoryRead($Read + $Offset[1], $Open)
Ich hab also einfach nur "game.dll" bei Cheat engine eingegeben, sodass ich den Wert raushatte und dann hab ich ihn einfach mit der Adresse addiert und da kam auch immer das richtige bei heraus. Nur das Problem ist ja, dass sich die "game.dll" bei jedem Spielneustart ändert.
lass das ganze doch erstmal in scite direkt über den interpreter laufen... dann wird wir auch in der console direkt der fehler angezeigt...

Edit:
davon abgesehen steht doch da das der maximal vorgegebene rekursionslevel überschritten wurde...
03/17/2012 15:43 jacky919#14
Quote:
Originally Posted by lolkop View Post
lass das ganze doch erstmal in scite direkt über den interpreter laufen... dann wird wir auch in der console direkt der fehler angezeigt...

Edit:
davon abgesehen steht doch da das der maximal vorgegebene rekursionslevel überschritten wurde...
Dazu sei gesagt, dass er SciTE mit Administator-Rechten starten muss.
03/17/2012 15:53 Masterscripter#15
Ja also der Fehler an sich ist mir schon klar, aber ich weiß nicht, wie ich ihne beheben kann, geschweige denn, was ich falsch mache.

Mein Script ist:
Code:
#RequireAdmin
#include <NoMadMemory.au3>

HotKeySet("{F1}", "_Read")

$PID = ProcessExists("aion.bin")
If $PID > 0 Then
    $Handle = _MemoryOpen($PID)
    $Address = _MemoryModuleGetBaseAddress(ProcessExists("aion.bin"), "Game.dll")
    $Address = "0x" & Hex($Address + Dec("9C01C"))
    Dim $Offset[2] = [0,0x4]
Else
    Exit
EndIf

While True
    Sleep(10)
WEnd

Func _Read()
    $Read = _PointerRead($Address, $Handle, $Offset, "float")
    MsgBox(0, "", $Read[1])
EndFunc
Und das einzige, was ich erreichen möchte, ist die HP Anzahl herausbekommen. In meinem 1. Post könnt ihr das Script, mit dem es klappt sehen. Es klappt nur nach Neustart des Spiels halt nicht mehr.