更新 1:
を使用して、以下の解決策を試しましたbuffer.value.decode()
。これは正しい方向への一歩ですが、これを に戻し(#
たいです9000
。Cheat Engine を使用してアドレス値を に変更すると2000
、同じ方法でエラーが発生しますUnicodeDecodeError: 'utf-8' can't decode byte 0xd0 in position 0: invalid continuation byte
。だから私は間違ったエンコーディングを持っていると推測しています。私はそれで何をすべきかについて何か提案はありますか?
元の質問:
ctypes から ReadProcessMemory を使用して、プロセス内のアドレスから値を取得しようとしています。バイトデータは問題なく取得できているようですが、適切な形式に変換するのに苦労しています。チート エンジンを使用してサード パーティの方法でデータを検査し、それを使用してアドレスのデータを変更しています。スクリプトから正しいアドレスが出力されていると確信しています。返されると予想される値は 9000 です。使用している完全なコードは以下のとおりですが、(ctypes から) c_char_p 型のバッファーにメモリを読み込んでいます。値を文字列に変換して出力する方法をいくつか試しました。を使用するとstr(buffer)
、期待どおり、バイト表現が として返されc_char_p(b'(#')
ます。str(int.from_bytes(buffer, sys.byteorder))
I get backを使用してデータを変換しようとすると、43586512
. を使用してバイトから変換する機能を他の場所で見ましたbuffer.decode()
が、c_char_p にはデコード メソッドがないため、これは ctypes バージョン用ではないようです (これは、ctypes 以外のプロセス アドレス値を取得するために別のアプローチを取る必要があることを示唆している可能性があります)。探している形式でこのアドレスの値を正しく取得するために何をする必要があるかを誰かが指摘できますか? どうもありがとう!
コード:
from ctypes import *
from ctypes.wintypes import *
OpenProcess = windll.kernel32.OpenProcess
ReadProcessMemory = windll.kernel32.ReadProcessMemory
CloseHandle = windll.kernel32.CloseHandle
PROCESS_ALL_ACCESS = 0x1F0FFF #I'll try to do minimum permissions later.
pid = 3112 #Don't worry about this, I know it's right.
address = 0x2411918 #This too.
buffer = c_char_p(b"The data goes here") #Maybe I should be using something else?
bufferSize = len(buffer.value)
bytesRead = c_ulong(0)
processHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
if ReadProcessMemory(processHandle, address, buffer, bufferSize, byref(bytesRead)):
print("Success:" + str(int.from_bytes(buffer, "little"))) #Here's the problem print line.
else:
print("Failed.")
CloseHandle(processHandle)