更新1:
我使用buffer.value.decode()
尝试了下面给出的解决方案。这导致只返回(#
,这是向正确方向迈出的一步,但我希望将其转换为9000
。当我使用Cheat Engine将地址值更改为2000
时,同样的方法会遇到错误UnicodeDecodeError: 'utf-8' can't decode byte 0xd0 in position 0: invalid continuation byte
。所以我猜我编码错了。关于我应该怎么做的任何建议?
原始问题:
我正在尝试使用来自ctypes的ReadProcessMemory来从进程中的地址获取值。我似乎没有问题地获取字节数据,但我很难将其转换为适当的形式。我正在使用Cheat Engine通过第三方方法检查数据,并使用它来更改地址中的数据我确信我的脚本输出正确。我期望返回的值是9000.我正在使用的完整代码如下,但我正在将内存读入c_char_p类型的缓冲区(来自ctypes)。我已经尝试了几种方法将值转换为字符串并打印它。只使用str(buffer)
,按预期我将字节表示恢复为c_char_p(b'(#')
。当我尝试使用str(int.from_bytes(buffer, sys.byteorder))
转换数据时,我会回来43586512
。我已经在其他地方看到了使用buffer.decode()
从字节转换的能力,但似乎这不适用于ctypes版本,因为c_char_p没有解码方法(这可能表明我应该采用不同的方法来获取进程地址值其他比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)
答案 0 :(得分:2)
事实证明我的问题与ctypes表示有关。如果我使用memmove移动将c_char_p移动到c_int,那么我最终会打印出正确的结果。这可以在下面完整的代码中看到。
from ctypes import *
from ctypes.wintypes import *
import struct
OpenProcess = windll.kernel32.OpenProcess
ReadProcessMemory = windll.kernel32.ReadProcessMemory
CloseHandle = windll.kernel32.CloseHandle
PROCESS_ALL_ACCESS = 0x1F0FFF
pid = 3112
address = 0x2411918
buffer = c_char_p(b"The data goes here")
val = c_int()
bufferSize = len(buffer.value)
bytesRead = c_ulong(0)
processHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
if ReadProcessMemory(processHandle, address, buffer, bufferSize, byref(bytesRead)):
memmove(ctypes.byref(val), buffer, ctypes.sizeof(val))
print("Success:" + str(val.value))
else:
print("Failed.")
CloseHandle(processHandle)
答案 1 :(得分:0)
c_char_p(b"test").value.decode()