Quote:
Originally Posted by JakeFrost77
| Local | Steht meist in einer Funktion und ist nur in dieser Gültig! | | Dim/Global | Sind relativ gleich und gelten über das ganze Script | | Der Add "Const" | Heist nichts anderes wie "Konstante" und sorgt dafür, das die deklaration direkt am Anfang geladen wird, weshalb sie direkt unter unseren includes stehen sollte. |
|
Ich zitiere mal aus der Hilfe:
Quote:
|
Originally Posted by AutoIt Hilfe
Der Unterschied zwischen Dim, Local und Global ist der Gültigkeitsbereich, für den die Variablen deklariert werden:
Dim = Wenn der Variablename nicht schon mit globalem Gültigleitsbereich existiert, hat die definierte Variable einen lokalen Gültigkeitsbereich (falls die Variable schon global existiert, so wird die globale Variable verwendet!)
Global = Erzwingt globale Gültigkeit der Variablen
Local = Erzwingt lokale Gültigkeit der Variablen, bzw. innerhalb der Funktion
|
Und der Teil mit den Konstanten ist auch nicht ganz richtig:
Quote:
|
Originally Posted by AutoIt Hilfe
Wenn eine Konstante einmal erzeugt wurde, kann ihr Wert danach nicht mehr verändert werden. Außerdem kann man eine existierende Variable nicht in eine Konstante umwandeln.
|
Eine Konstante ist einfach nur konstant, das hat nichts mit irgendwelchen Zeiten zu tun.
______________________________
Quote:
Originally Posted by JakeFrost77
Er heist "$PROCESS_ALL_ACCESS".
Also schreibt ihr $PROCESS_ALL_ACCESS = 0x1f0FFF als Global Constant direkt unter eurem Include.
|
"Sie" [Die Variable] heißt $PROCESS_ALL_ACCESS, und das ist nur von Windows übernommen :P Achja, ich würfe hexadezimale Zahlen immer groß schreiben, also "0x001F0FFF".
Und es müsste
Global Const heißen.
______________________________
Quote:
Originally Posted by JakeFrost77
Nun wartet unser kleines Programm immerhin schon mal.
Jetzt müssen wir den Existierenden Prozess als ID deklarieren und ihn per WinAPI zugänglich machen.
|
"Der" WinAPI zugänglich machen.
______________________________
Quote:
Originally Posted by JakeFrost77
$iAccess: Hier wird die Art des "Eintretens in den Prozess" gewählt. In unserem Fall, volle Rechte auf diesem.
|
Auf diesen oder über diesen, aber man hat keine Rechte "auf einem" haben.
______________________________
Quote:
Originally Posted by JakeFrost77
_WinAPI_WriteProcessMemory($hProcess, $pBaseAddress, $pBuffer, $iSize, ByRef $iWritten) Klingt erstmal verwirrend, ich versuche mal die einzelnen Schritte zu erklären.
$hProcess: Hier kommt der Prozess rein, der in der Variable von OpenProcess steht, in unserem Beispiel $PH
$pBaseAddress: Hier kommt einfach die Addresse rein, die wir spätern editieren wollen(Beachte: AutoIT erkennt HexDezimale Zahlen z.B 00CA53F89 NUR! wenn "0x" davor steht[0x00CA53F89])
$pBuffer: Hier bezieht er die Value, die in die vorher deklarierte Adresse geschrieben werden soll und unserem falle können wir aber nicht einfach "4" reinschreiben, sondern müssen diese aus unserer DLL Struktur auslesen lassen.
$iSize: Hier kriegen wir über die DLL Struktur unseren Valuetyp
ByRef $iWritten: Hier wird eine Rückgabe geliefert, aber nur wenn die Adresse erfolgreich editiert wurde! Das heist:
Erfolg = Rückgabe = True
Fail = Rückgabe = False
|
$hProcess: Hier kommt ein Handle hin, das den Prozess identifiziert und Windows wissen lässt, womit es zu tun hat. Handles sind intern und werden von Windows deklariert und benutzt. (Auch in AutoIt gibt es viele Handles, zB bei FileOpen)
In unserem Beispiel wäre es also
$PH.
$pBaseAddress: Hier kommt einfach die Addresse rein, die wir spätern editieren wollen (Beachte: AutoIT erkennt HexDezimale Zahlen z.B 00CA53F89
NUR! wenn "0x" davor steht[0x00CA53F89])
$pBuffer: Buffer bezeichnet temporäre Daten im Speicher.
_WinAPI_WriteProcessMemory erwartet allerdings einen Pointer [Zeiger, herzuleiten vom "p"], der auf diese Datenstruktur zeigt. Siehe dazu weiter unten.
$iSize: Dies bezeichnet die Anzahl der zu schreibenden Bytes, also die größe der Struktur im Speicher. Ein "DWORD" verbraucht zB 4 Bytes, ebenso wie "float". "double" dagegen belegt 8 Bytes.
ByRef $iWritten: Dies ist eine Variable zur erweiterten Funktionsrückgabe.
ByRef bedeutet, dass die Variable nicht wie normalerweise kopiert wird, sondern dass es sich hier um exakt dieselbe handelt. Wird also die Variable in der Funktion geändert, dann kann man im Programm nacher darauf zugreifen.
$iWritten enthält also die Anzahl der Bytes, die tatsächlich in den Prozess geschrieben wurden.
Das heist:
Erfolg: $iWritten > 0 (dies sollte die selbe Zahl sein, die wir bei $iSize übergeben haben
Fehlschlag: $iWritten = 0
Dazu sei gesagt, dass "If" bei einer Abfrage von Integern "0" als "False" interpretiert und Werte über 0 als "True".
______________________________
Quote:
Originally Posted by JakeFrost77
Bevor wir weitermachen können, brauchen wir unsere DLL Struktur.
Es ist sozusagen eine virtuelle DLL die Daten enthalten wird, aber da sie eben nur "virtuell" ist, keine feste datei sondern nur kurzzeitig vorhanden, eben solange wie wir sie brauchen.
|
Es wäre richtiger zu sagen, dass es sich um eine simple "Struktur" handelt. Das "DLL" ist nur ein Prefix von AutoIt.
Eine Struktur ist eine ansammlung von Daten, die sich im Speicher befinden. Wie genau sie dort vorhanden sind, wäre nun wohl etwas zu elementar; Sagen wir also, dass irgendwo im Speicher unsere Daten rumfliegen.
______________________________
Quote:
Originally Posted by JakeFrost77
Zuerst der Prozess der von _WinAPI_OpenProcess in der Variable $PH abgespeichert wurde, dann unsere Adresse " 0x00CA5B85". Jetzt muss an dieser Stelle unsere Value rein, sieh steht ja in unserer DLL Struktur also in $struct. Damit wir nun die Value wieder klauen können, brauchen wir den Befehl DLLStructGetPtr hier müssen wir nun zuerst unsere Struktur wählen und dann das Element.
|
Eigentlich sagt man "Der Value"... Wie auch immer.
Zuerst das Handle zum Prozess, das von
_WinAPI_OpenProcess in der Variable
$PH abgespeichert wurde.
Dann unsere Adresse
0x00CA5B85.
Anschließend müssen wir den Wert übergeben, den wir schreiben wollen. Da aber die Adresse, die wir vorher angegeben haben, ebenfalls ein Pointer [Zeiger] auf Daten in dem Prozess ist, muss auch an diese Stelle ein Pointer.
Einen Pointer bekommen wir über unsere Struktut - Genauer gesagt über
DLLStructGetPtr.
______________________________
Quote:
Originally Posted by JakeFrost77
Als Nächstes benötigen wir noch unseren ValueTyp der ja nun ebenfalls in der Struktur vorhanden ist. Wir kommen an diesen Wert mit dem Befehl DLLStructGetSize. Vielleicht fragt euch hier - "Warum GetSize?" - Das liegt daran, das in der Programmierung die verschiedenen Typen wie Float,4 Bytes,Double etc. nicht nur unterschiedliche Typen von Zahlen darstellen, sondern unterschiedliche Speichergrößen benutzen. Daher lesen wir diese Speichergröße aus der Struktur aus welche bei uns 4 Bytes ist(Durch dword deklariert). Der Syntax ist sehr einfach und man versteht ihn auch leicht, ihr solltet es hinbekommen.
Der letzte Punkt wäre unser Booleanischer Rückgabewert Index - "Boolean": Ist ein weiterer deklarationstyp und stellt die Werte "True" und "False" zur Verfügung.
|
Dazu hab ich weiter oben schon etwas geschrieben.
Als nächstes müssen wir die Anzahl der Bytes, $iSize, angeben. Um die größe eines bestimmten Wertes im Speicher immer korrekt zu bestimmen, kann man ganz leicht
DLLStructGetSize
benutzen.
Der letzte Punkt wäre unser Rückgabewert mit der Anzahl der geschriebenen Bytes.