2016-03-28 6 views
0

Ich versuche, meine Spieler Gesundheit zu lesen. Ich habe eine Rolle gespielt, bin aber auf ein Problem gestoßen. Ich bin in der Lage zu lesen, welche Art von Informationen ist an einer bestimmten Adresse, aber kann nicht lesen, was der tatsächliche Wert ist, zum Beispiel hier ist die Antwort, die ich erhalte.Python lesen Prozess Speicher mit Ctypes

<ctypes.c_char_Array_64 object at 0x0000000002EBF9C8> 

ich für welche Informationen suchen in der c_char_Array_64 Objekt gehalten, haben aber keine Ahnung, wie ich es gehen würde.

Hier ist mein Code:

class User: 
    ctypes.wintypes.DWORD = "Entity" 
    ctypes.wintypes.c_int = "Team" 
    ctypes.wintypes.c_int = "Health" 
    ctypes.wintypes.c_int = "Player" 

    def getSelfInfo(self): 
     adr1 = clientdll + dw_LocalPlayer 
     adr2 = ctypes.create_string_buffer(64) 
     bytes_read = ctypes.c_size_t() 

     (rPM(PROCESS.handle, adr1, adr2, sys.getsizeof(ctypes.wintypes.DWORD), ctypes.byref(bytes_read))) 
     print adr2 
t = User() 
t.getSelfInfo() 
+0

Side-note: 'sys.getsizeof (ctypes.wintypes. DWORD) 'bringt Ihnen keinen nützlichen Wert; Es sagt Ihnen den (rohen) Overhead des Python-Interpreters, um die Python-Level-Klasse zu speichern. Wenn Sie die Größe eines C 'DWORD' wollen, wollen Sie' ctypes.sizeof (ctypes.wintypes.DWORD) '. Sie können auch nicht 'ctypes.wintypes.DWORD =" Entity "' und ähnliches, das ist nicht wie Sie eine Variable deklarieren (Sie überschreiben tatsächlich den 'DWORD' Typ). Ich nehme an, Ihr Ziel ist es, eine 'ctypes' Struktur zu erstellen; schau dir [die Dokumente an, wie du das machen sollst.] (https://docs.python.org/3/library/ctypes.html#structures-and-unions) – ShadowRanger

Antwort

1

Sie müssen den Wert erhalten:

print(ar2.value) 

Von den docs:

Wenn Sie änderbare Speicherblöcke, ctypes benötigen hat eine create_string_buffer () Funktion, die diese auf verschiedene Arten erzeugt. Auf den Inhalt des aktuellen Speicherblocks kann mit der Eigenschaft raw zugegriffen werden (oder geändert werden); wenn Sie darauf zugreifen wollen, als NUL Zeichenfolge beendet, verwenden Sie den Wert Eigenschaft:

>>> from ctypes import * 
>>> p = create_string_buffer(3)  # create a 3 byte buffer, initialized to NUL bytes 
>>> print sizeof(p), repr(p.raw) 
3 '\x00\x00\x00' 
>>> p = create_string_buffer("Hello")  # create a buffer containing a NUL terminated string 
>>> print sizeof(p), repr(p.raw) 
6 'Hello\x00' 
>>> print repr(p.value) 
'Hello' 
>>> p = create_string_buffer("Hello", 10) # create a 10 byte buffer 
>>> print sizeof(p), repr(p.raw) 
10 'Hello\x00\x00\x00\x00\x00' 
>>> p.value = "Hi" 
>>> print sizeof(p), repr(p.raw) 
10 'Hi\x00lo\x00\x00\x00\x00\x00' 
>>> 
0

Die leere Scheibe meisten ctypes Array-Typen wird die Python gleichwertigen Typ zurück. Also Ihr 64-Byte-Puffer auf eine str (in PY3 bytes) zu konvertieren, können Sie tun:

print ar2[:] 

, dass die volle rohe 64 Bytes lesen Sie etwas dagegen. Wenn Sie es als C-String (also der erste NUL Byte beendet den Python äquivalent str) lesen mögen, dann würden Sie .value verwenden:

print ar2.value 
+0

Es kann kein Wert gedruckt werden nur ein Leerzeile – Scheming

+0

@Scheming: Wenn 'ar2' die leere Zeichenkette ist, können beide" nichts drucken ", da das Drucken des' NUL'-Bytes auf den meisten Terminal-Setups nichts anzeigt. Ich hätte ein bisschen klarer sein sollen. Wenn Sie in eine Datei schreiben oder die Daten in Python verarbeiten, ist der Unterschied zwar sinnvoll, aber nicht unbedingt auf das Terminal gedruckt. Wenn Sie 'a [12] = b'a' 'zugewiesen haben, dann gedruckt, selbst wenn' NUL's dem 'a' vorangehen, würden Sie das' a' gedruckt sehen, wahrscheinlich in einem Offset. – ShadowRanger

+0

Es ist immer noch unklar, ich verstehe nicht, wie dies mir erlauben würde, die Gesundheit meines Spielers zu bekommen – Scheming