[Tutorial] Memory Handeling in Guild Wars {Au3}

04/18/2009 20:01 NBA#1
Herzlich willkommen zu meinem Memory Tutorial.
Ich werde hier auf das Memory Handeling in AutoIT anhand von Guild Wars zeigen. Doch was sind Memorys?
Damit waeren wir bei unseren ersten Punkt. Was sind Memories?

1. Was sind Memorys?


Memories sind Speicheradressen. Ich bin jetzt einfach so dreist, und kopiere Wikipedia hier rein:
Speicheradresse ? Wikipedia
Quote:
Originally Posted by Wikipedia
Speicheradresse
aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Speicheradressen werden beim Datenzugriff zur Identifikation eines Speicherorts auf einem Speichermedium verwendet, beispielsweise zur Benennung einer Speicherzelle in einem RAM (siehe Speicherzugriff) oder eines Blocks auf einer Festplatte.

Speicheradressen werden meist in hexadezimaler Schreibweise angegeben. Sie beginnen meist bei null und werden in der Regel fortlaufend durchnummeriert.

Man unterscheidet zwischen logischen und physischen Speicheradressen. Die logische Adresse ist die, die ein Programm "sieht". Durch die Speicherverwaltung des Betriebssystems werden diese logischen Adressen auf physische Adressen abgebildet. Diese Abbildung ist im Allgemeinen für jeden Prozess unterschiedlich und für den Prozess transparent. Damit ist es möglich, dass mehrere Prozesse die gleichen logischen Adressen verwenden, aber dabei auf unterschiedliche physische Adressen zugreifen. Auch ist es möglich, einem Prozess mehr logischen Speicher zuzuteilen, als physisch vorhanden ist. Beim Zugriff auf die physisch nicht vorhandenen Speicherbereiche löst die CPU automatisch eine Ausnahme aus, welche vom Betriebssystem abgefangen wird. Das Betriebssystem kann dann zusätzlichen Speicher bereitstellen, in dem es beispielsweise andere Speicherbereiche auf die Festplatte auslagert. Diese Technik wird Virtuelle Speicherverwaltung genannt.

Bestimmte physische Adressbereiche können aber in mehreren Prozessen im logischen Adressraum eingeblendet werden. Diese Technik wird auch Shared Memory genannt und ist eine Form der Interprozesskommunikation.

Segmentierte Adressen [Bearbeiten]

Eine Besonderheit stellen Adressen dar, die aus einer Basisadresse und einem Versatz in Form eines ganzzahligen Wertes – auch Offset genannt – gebildet werden. Um die tatsächliche Speicheradresse zu errechnen, wird der Versatz (Offset) zur Basisadresse addiert. So wird bei der Segmentierung im Real Mode der x86-Prozessorfamilie eine Speicherstelle nach dem Schema Segment:Offset angegeben. Zusätzlich zu der Segmentadresse (Segmentnummer * 16) wird der Offset addiert. Die echte Adresse lässt sich also mittels Adresse = (Segmentnummer·16) + Offset berechnen.

Im Protected Mode lässt sich die Startadresse des Segmentes aus dem Segment selector ermitteln. Zu dieser Segmentstartadresse wird dann der Offset addiert, um eine lineare logische Speicheradresse zu erhalten.

Siehe auch: Segmentierung (Speicherverwaltung)
Kapiert - Naja, zugegeben es dauert etwas, bis man das verdaut hat.

2. Wie kann ich das auf Guild Wars anwenden?
Vielseitig. Du kannst zum Beispiel eine bestimmte Adresse auslesen.
Oder eine beschreiben. Betrachten wir dies mal in AutoIT.
Es gibt in AutoIT eine 'Memory.au3', diese ist standartmaessig dabei.
Und es gibt eine, die ist nicht standartmaessig dabei.
Die meissten nehmen die nicht standartmaessige her. Die ist etwas weniger Fehleranfaellig als die normale "Memory.au3" .
Die nicht standartmaessige heisst "NoMadMemory.au3". Wenn du dich jetzt fragst, wo der link bleibt, Voila: [Only registered and activated users can see links. Click Here To Register...] .

Sobald du die NoMadMemory.au3 runtergeladen hast, kopierst du sie in dein Includeverzeichniss (Normalerweise C:\Programme\AutoIT\Includes)
Jetzt haben wir die NoMadMemory.au3 in unserem Verzeichnis, also koennen wir loslegen.

3. Memorys praktisch anwenden

Um eine Memory anwenden zu koennen, braucht man erstmal eine.
Dazu muessen wir eine Suchen. Dies koennen wir mit Cheat Engine oder mit TSearch machen. Ich nehme Cheat Engine her, die ist Einsteigerfreundlicher.

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

Installiere Sie, und starte Sie. Gleich danach startest du Guild Wars (reihenfolge spielt keine Rolle) Sobald beides geoeffnet ist, klicken wir auf farbwandelnde Flaeche in Cheat Engine und waehlen die Gw.exe an. Das ist unser Guild Wars.
Einloggen, irgenteinen Charakter auswaehlen und los gehts.
Wir suchen nach der Memoryadresse, die angibt, ob wir laufen oder nicht. Da wir erstmal nicht laufen werden suchen wir nach "0". Gib dazu bei Value 0 ein und klicke auf "Fist Scan". Nun sehen wir eine riesige Auswahl an Adressen. Diese gilt es zu beschraenken. Sorge dafuer, das dein Charakter eine lange Strecke vor sich hat und druecke die Taste fuer Automatisches Laufen (normalerweise "r"). Trage bei Cheat Engine 1 ein und klicke auf "Next Scan".
Dann, wenn du gelaufen bist gibst du bei Cheat Engine wieder 0 ein und klickst auf "Next Scan". Mach das so lange bis nur 3-4 Adressen uebrigbleiben.
Um zu ueberpruefen ob es unsere ist, doppelklicken wir auf die erste. Dann kommt die Adresse unten in ein Feld. Dort doppelklicken wir auf die Flaeche unter Value. Und tragen 1 ein. Wenn sich in GW nichts tut, ist es nicht unsere Adresse. Klick einmal auf sie drauf und druecke Entfernen - die brauchen wir nicht, die Adresse. Dann die naechste. Das machen wir so lange bis wir eine gefunden haben die den Charakter bewegt wenn man 1. reinschreibt. Diese bringen wir dann in die untere Liste und schliessen GW.

Warum? Weil wir wissen wollen ob sie statisch oder dynamisch ist.
Statische Adressen bleiben an einen Platz bis zum naechsten update. Die anderen bringen nichts.

Wir oeffnen GW wieder, waehlen es wieder in Cheat Engine aus und schauen, ob sich die Werte der Adresse geaendert haben, wenn wir wieder mit dem Charakter eingeloggt sind. Ist dies nicht der Fall haben wir eine statische. Die wir jetzt mit Hilfe von AutoIT beschreiben werden.
Wichtig: In CE sieht die Adresse so aus: 00xxxx (also mit 2 0 vorne). In Au3 müssen wir die zweite 0 mit x ersetzen. Sieht dann so aus: 0xxxx

4. Mem's in Au3 beschreiben

Dazu brauchen wir nicht viel. Da wir die NoMadMemory schon haben, koennen wir gleich loslegen.

Code:
#include <NoMadMemory.au3>
Damit binden wir die NoMadMemory ein. Wuerde man Tuerkischen Soladten deutsche Befehle erteilen, wuerde nicht viel passieren. (Ausser die Tuerkischen Soldaten koennen Deu). Genauso ist es hier.
Als naechstes muessen wir einen Process beschreibar machen.
Das geht mit
Code:
$PID = WinGetProcess("Guild Wars")
$hprocess = _MemoryOpen($PID)
Mit _MemoryOpen koennen wir nun weitere Befehle anwenden. Um eine Adresse zu beschreiben zum beispiel _MemoryWrite.
Code:
_MemoryWrite(0xA05F00, $hprcoess, 1)
Sleep(5000)
_MemoryWrite(0xA05F00, $hprocess, 0)
Wenn man sich damit etwas beschaeftigt kommt man schnell dahinter.

Aber wir wollen ja nicht immer beschreiben
Code:
_MemoryRead
Damit Lesen wir etwas auf einer adresse:
Code:
$read  _MemoryRead(Adresse, $hprocess)
MsgBox(0,"Title", "Memory :" & $read)
Und dass wars auch schon wieder bis jetzt, mit den Memorys!
Hoffe es hat geholfen!

Edit:

Extra Tutorial: Gui's mit Funktion

Wie macht man ein GUI, dass mit einer Funktion versehen ist?
Das fragen sich viele Anfaenger. Hier mal die Grundlegenden Befehle (und Ihre Anwendung)

1. Koda
Mit Koda kann man GUI's einfach erstellen. Man muss Scite4AutoIT installiert haben. ([Only registered and activated users can see links. Click Here To Register...]). Danach in irgentein Script gehen und in der Leiste unter der Titelleiste Tools anklicken. Dort einfach auf Koda(Form-Designer) klicken. Schon kann man sich austoben.

2. Code
Der sieht dann ungefaehr so aus(nat. Ohne die Kommentare):
Code:
#include <ButtonConstants.au3> ;Includes halt
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Langweilig", 194, 80, 201, 126) ;Form erstellen
$Input1 = GUICtrlCreateInput("Input1", 8, 8, 161, 21) ;Input erstellen
$Button1 = GUICtrlCreateButton("Button1", 8, 40, 75, 25, 0) ;Button 1 erstellen
$Button2 = GUICtrlCreateButton("Button2", 96, 40, 75, 25, 0) ; Button 2 erstellen
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd
3. Anwenden
Doch wie nutzt man jetzt das Input und die Buttons?
Das geht mit einem
Code:
GuiCtrlRead($input1) ; Input auslesen
Und einem
Code:
Case $Button1
        GuiCtrlSetData($button1, GuiCtrlRead($input1)) ;Button 1 ansprechen
Case $Button2 
GuiCtrlSetData($button2, GuiCtrlRead($input1)) ; Button 2 ansprechen
Joa..ein kleines Tut fuer Koda und Gui's .. mehr nicht..einfach nur so als billige zugabe.
Nichts grossartiges, hoffe es ist verstaendlich...
04/18/2009 20:04 cab_killer#2
Super geil darauf warte ich schon etwas länger :D
Vieleicht raffe ich jetzt auch mal ein bisschen was von den Mems.

THX

MFG
04/20/2009 12:01 Read Me#3
Auch wenn ich das schon kenne, aber geschrieben ist es gut^^
04/20/2009 13:41 NBA#4
Naja...hab versucht ein bisschen reinzubringen..nicht viel. Vielleicht erweitere ich es.
Was aber Pflicht ist bei diesem kleinen Tut:

Ganz mit Hirn durchlesen. So oft googlen, au3 hilfe nutzen usw. bis man es wirklich verstanden hat. Alles andere ist - nicht auszusprechen.
04/20/2009 13:53 __wadim#5
also ich kann immer wieder hier drauf verweisen, meiner meinung nach werden im ersten teil offsets gut erklärt. wer will kann dann noch weiterlesen :)
[Only registered and activated users can see links. Click Here To Register...]
04/24/2009 15:16 NANAAA#6
also iwie hab ich ne Adresse gefunden in Cheat Engine , funktioniert auch wenn ich Value 1 eingebe dann läuft der Char :) aber weiter mhmhm

habe das gefunden = 00A0D7E8

wenn ihc zb die mit dem updater ansehe sind da immer 0xa davor ...

kann mir jemand weiterhelfen ?
04/24/2009 15:45 NBA#7
00A0D7E8 = 0xA07E8 sollte so sein ;)

edit: Thanks sind erwünscht!
04/24/2009 17:46 blauwiggle#8
Quote:
Originally Posted by NBA View Post
00A0D7E8 = 0xA07E8 sollte so sein ;)

edit: Thanks sind erwünscht!
Und warum funktioniert das auch mit 0x00A07E8? :rolleyes:
04/24/2009 18:05 NBA#9
So lange es funzt ist es mir egal...
04/25/2009 23:14 NANAAA#10
noch ne frage bez den memorys

wie bekomme ich die death memory ?

hab mir das so iwie gedacht
Quote:
bei Cheat Engine im Gebiet Lebend 0 eingeben
sterben lassen und bei tod 1 eingeben
und so weiter bis nurnoch paar adressen übrig sind...
aber glaube falsch gedacht xD könnt jemand genäuer erklären ?

und wie finde ich mousecordeB bez. A heraus ?
04/26/2009 00:58 NBA#11
1) Wenn Leben dann 0 wenn Tod dann 1. DU musst halt auch wirklich sterben.
2) Hab ich mir noch keine Gedanken gemacht...
04/26/2009 14:42 kknb#12
du kannst ja vorher nie genau wissen wie die werte sich ändern, also such bei unbekannten werten lieber nach changed / unchanged.
04/27/2009 14:43 Moppel123#13
genau.. und dann am besten neu einloggen und den char wechseln.. dann sind noch 2 oder 3 übrig und meistens verschiebt sich das ganze ja nur bisschen, also kann man mit dem ausschlussverfahren die richtige adresse finden :-)
04/29/2009 11:33 Icke999#14
Geht das auch Im Fenster Modus ?`habe bei diesem Belohnung typen bis auf 2 gemacht und dann gestestet und beide gehen nicht :(

MfG
04/29/2009 14:53 Specter cason#15
jo geht im fenster