2014-12-04 63 views
1

问题:CTYPE - 蟒蛇 - 长诠释太长转换 -

Traceback (most recent call last): File "C:\Users\Nutzer\Google Drive\Code\Code\memory_read.py", line 26, in byref(bytesRead)) ctypes.ArgumentError: argument 2: : long int too long to convert

代码:

from ctypes import * 
from ctypes.wintypes import * 

PID = 4016 

address = 0x6C532407C 

OpenProcess = windll.kernel32.OpenProcess 
ReadProcessMemory = windll.kernel32.ReadProcessMemory 
CloseHandle = windll.kernel32.CloseHandle 


PROCESS_ALL_ACCESS = 0x1F0FFF 

datadummy = b'.'*200 
buffer = c_char_p(datadummy) 
bufferSize = len(buffer.value) 
bytesRead = c_ulong(0) 

processHandle = OpenProcess(PROCESS_ALL_ACCESS, False, int(PID)) 

ReadProcessMemory(processHandle, 
    address, 
    buffer, 
    bufferSize, 
    byref(bytesRead)) 

CloseHandle(processHandle) 

我试图改变bytesRead = c_ulong(0)其它一些ctypes的,但没有成功。我在Windows 8.1系统64位。经过数小时的搜索,我找不到任何解决方案或类似的问题。有人知道这里有什么错吗?

+0

集'SIZE_T = c_size_t;''ReadProcessMemory.argtypes = [手柄,LPCVOID,LPVOID,SIZE_T,POINTER(SIZE_T)];''OpenProcess.restype = HANDLE;''CloseHandle.argtypes = [手柄] '。 – eryksun 2014-12-04 04:32:20

+0

不要修改Python字符串。使用'create_string_buffer'或者使用普通的ctypes语法创建一个数组,例如'bufferSize = 201;''buffer =(c_char * bufferSize)()'。 – eryksun 2014-12-04 04:36:47

+0

确保为out参数使用正确的类型'bytesRead = SIZE_T()'。这是Win64中的8个字节。 – eryksun 2014-12-04 04:37:36

回答

0

经过了很长时间的失败和错误,我终于得到了答案。

from ctypes import * 
from ctypes.wintypes import * 
import ctypes 

OpenProcess = windll.kernel32.OpenProcess 
ReadProcessMemory = windll.kernel32.ReadProcessMemory 
CloseHandle = windll.kernel32.CloseHandle 

PROCESS_ALL_ACCESS = 0x1F0FFF 

pid = 2320 
address = 0x00C98FCC 

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)