2014-12-04 93 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)