Typ einer Adresse auslesen (DWORD, CHAR, etc)

11/28/2013 13:02 Croco™#1
Hi,
ist es möglich den Typ (Char, DWORD, etc) einer Adresse auszulesen?
Ich benutze zum Auslesen die KDMemory UDF.
11/28/2013 16:46 alpines#2
Das sollte schon möglich sein, in der Parameterliste der UDF-Funktionen kommt bei einigen ja $type oder ähnliches vor. Versuch dort einfach mal den Typ anzugeben, z.B. float, double, dword, ...
11/28/2013 17:22 KDeluxe#3
Genau das macht doch meine UDF. Bei der NomadMemory.au3/Pointer.au3 ist der "Typ" Parameter optional. Das führte häufig nur dazu, dass Anfänger nicht wussten, weshalb ein "float" Wert nicht korrekt ausgegeben wurde. "4 Bytes" hat ja auch immer funktioniert. Das ist eines der Gründe, weshalb ich den Parameter nicht optional gemacht habe, eine Angabe des Typs muss immer erfolgen.

Hier mal eine kleine Tabelle:
Cheat EngineAutoIt
Bytebyte
2 BytesWORD
4 BytesDWORD
8 BytesQWORD
Floatfloat
Doubledouble
Array of bytesbyte[$size]
Textchar[$length] (ANSI), WCHAR[$length] (Unicode)

Für das Lesen oder Schreiben eines Textes empfehle ich dir Funktionen
  • _KDMemory_ReadProcessString()
  • _KDMemory_WriteProcessString()
Das hat klare Vorteile gegenüber der Methode ein Char-Array als Typ zu verwenden.

Beispiele:
Code:
$memoryData = _KDMemory_ReadProcessMemory($handles, $address, "byte")
$memoryData = _KDMemory_ReadProcessMemory($handles, $address, "WORD")
$memoryData = _KDMemory_ReadProcessMemory($handles, $address, "DWORD")
$memoryData = _KDMemory_ReadProcessMemory($handles, $address, "QWORD")
$memoryData = _KDMemory_ReadProcessMemory($handles, $address, "float")
$memoryData = _KDMemory_ReadProcessMemory($handles, $address, "double")
$memoryData = _KDMemory_ReadProcessMemory($handles, $address, "byte[4]")
$memoryData = _KDMemory_ReadProcessString($handles, $address)
Falls das aber nicht gemeint ist, sondern die Frage, ob man den Typ einer Adresse automatisch erkennen kann: Nein, das ist nicht möglich. Du musst diesen selbst angeben.
11/28/2013 18:41 Croco™#4
OK, danke der letzte Satz hat meine Frage beantwortet.

Quote:
Falls das aber nicht gemeint ist, sondern die Frage, ob man den Typ einer Adresse automatisch erkennen kann: Nein, das ist nicht möglich. Du musst diesen selbst angeben.
11/28/2013 19:44 alpines#5
Wäre es nicht möglich alle durchzuprobieren und bei korrekter Ausgabe den Typ festzulegen? Das ist sicherlich nicht effizient oder schnell aber würde doch sicherlich funktionieren oder?
11/28/2013 20:00 Shadow992#6
Quote:
Originally Posted by alpines View Post
Wäre es nicht möglich alle durchzuprobieren und bei korrekter Ausgabe den Typ festzulegen? Das ist sicherlich nicht effizient oder schnell aber würde doch sicherlich funktionieren oder?
Nö, überhaupt nicht.
Das Ganze funktioniert nur bei folgenden Szenarien:

1. Der Wert steht zufällig an der allerletzten Speicherzelle im Ram.
Dann würde es bei einem Wert, der größer als der wirklich genutzte Speicher ist einen Fehler geben.

2. Nur dieser eine Wert hat Read-Rechte und alle Werte in der Umgebung nicht. Dann könnte man testen bei welchem größten Datentyp das Lesen klappt.

Aber wieso geht das sonst nicht?
Die Antwort ist easy, stellen wir uns vor wir haben folgenden Speicher (jede Zeile entsprich genau einem halben BYTE):

Halbes Byte #WertBinär
110001
220010
330011
440100

Der Grund wieso man das jetzt nicht erkennen kann ist folgender:
Wenn wir statt einem short (=2 Byte) ein char (=1 Byte) auslesen lassen, dann kriegen wir folgende Zahl zurück:
PHP Code:
0001 0010 = 18 
Lesen wir jetzt aber 2 Byte aus sieht unsere Zahl so aus:
PHP Code:
0001 0010 0011 0100 = 4660 
Lesen wir hingegen nur ein halbes Byte aus sieht unsere Zahl so aus:
PHP Code:
0001 = 1 
Alle 3 Zahlen sind existierende Zahlen und wenn das Programm nicht weiß, wie groß diese Zahl ist, dann ist jeder Datentyp eine mögliche echte Zahl, auch der halbbyte Datentyp, auch wenn der so gar nicht existiert.
Vondaher ist es nicht möglich, ohne Vorwissen, den Datentyp komplett automatisch bestimmen zu lassen. Zumindest nicht ohne das Programm o.ä. zusätzlich analysieren zu lassen. Alleine durch die Adresse/den Pointer ist der Datentyp nicht festgelegt.
11/28/2013 20:01 alpines#7
Gut zu wissen, dann muss man also die Werte selber anschauen und bestimmen welcher Datentyp korrekt ist.
11/29/2013 00:20 KDeluxe#8
Shadow992 hat es ganz gut erklärt, hat allerdings einen (Leichtsinns) Fehler gemacht. Ein Byte besteht aus 8 Bit, nicht aus 4.
Folgendes ist deshalb ein Beispiel für 2 Byte und nicht für 4 Byte.
Quote:
Originally Posted by Shadow992 View Post
Lesen wir jetzt aber 4 Byte aus sieht unsere Zahl so aus:
PHP Code:
0001 0010 0011 0100 = 4660