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
Kapiert - Naja, zugegeben es dauert etwas, bis man das verdaut hat.Quote:
Originally Posted by WikipediaSpeicheradresse
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)
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:
.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 :

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>
Als naechstes muessen wir einen Process beschreibar machen.
Das geht mit
Code:
$PID = WinGetProcess("Guild Wars")
$hprocess = _MemoryOpen($PID)
Code:
_MemoryWrite(0xA05F00, $hprcoess, 1) Sleep(5000) _MemoryWrite(0xA05F00, $hprocess, 0)
Aber wir wollen ja nicht immer beschreiben
Code:
_MemoryRead
Code:
$read _MemoryRead(Adresse, $hprocess) MsgBox(0,"Title", "Memory :" & $read)
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. (
). 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
Doch wie nutzt man jetzt das Input und die Buttons?
Das geht mit einem
Code:
GuiCtrlRead($input1) ; Input auslesen
Code:
Case $Button1
GuiCtrlSetData($button1, GuiCtrlRead($input1)) ;Button 1 ansprechen
Case $Button2
GuiCtrlSetData($button2, GuiCtrlRead($input1)) ; Button 2 ansprechen
Nichts grossartiges, hoffe es ist verstaendlich...






