2016-03-28 8 views
0

私のプレーヤーの健康状態を読み取ろうとしています。私はロールしているが、問題にぶつかっている。私は特定の住所にある情報のタイプを読むことができますが、実際の値が何であるかを読み取ることはできません。Pythonがctypesを使用してプロセスメモリを読み取っています

<ctypes.c_char_Array_64 object at 0x0000000002EBF9C8> 

私はc_char_Array_64オブジェクトにどのような情報が保持されているのか探していますが、どうすればいいのか分かりません。 docsから

print(ar2.value) 

:あなたが値を取得する必要が

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

余談:: 'sys.getsizeof(ctypes.wintypes。あなたは(その最初のNULバイトが同等のPython strを終了)Cスタイルの文字列としてそれを読みたい場合は、.valueを使用したいですDWORD) 'はあなたを有用な価値にしていません。これは、Pythonレベルクラスを格納するPythonインタプリタの(オーバーヘッド)オーバーヘッドを伝えています。 Cの 'DWORD'のサイズを望むなら、' ctypes.sizeof(ctypes.wintypes.DWORD) 'が必要です。 'ctypes.wintypes.DWORD =" Entity "'などとすることもできません。それは変数を宣言する方法ではなく(実際には 'DWORD'型を上書きします)。私は 'ctypes'構造体を作ることをあなたの目標としています。 [これを行う方法についてのドキュメント]をご覧ください(https://docs.python.org/3/library/ctypes.html#structures-and-unions) – ShadowRanger

答えて

1

:ここ

は私のコードです

あなたが変更可能なメモリブロックが必要な場合は、ctypesのを(create_string_bufferを持っています)関数を使用して、さまざまな方法でこれらを作成します。現在のメモリブロックの内容は、未加工のプロパティでアクセス(または変更)できます。あなたはNULで終了する文字列としてアクセスしたい場合は、プロパティを使用します。

>>> 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

最も​​配列型の空のスライスは、Python同等のタイプを返します。だから、strにあなたの64バイトのバッファを変換する(PY3 bytesに)、あなたが行うことができます:フル生の64のバイトを読み込みます

print ar2[:] 

はあなたを気に。

print ar2.value 
+0

空白行 – Scheming

+0

@Scheming: 'ar2'が空の文字列の場合、' NUL'バイトを表示してもほとんどの端末設定には何も表示されないので、それらは両方とも 'print'することはできません。私はもう少し明確にすべきだった。ファイルに書き込んだり、Pythonでデータを処理していた場合、その違いは意味がありますが、必ずしも端末に出力する必要はありません。あなたが 'a [12] = b'a''を割り当てた場合、' a'の前に 'NUL'があっても' a'が表示されます。 – ShadowRanger

+0

これはまだわかりませんが、これが私のプレーヤーの健康状態をどうにかするのか分かりません。 – Scheming

関連する問題