ctypespython
⑴ python怎麼導入ctypes
1. 載入Windows系統自帶的dll文件:
#載入cdecl調用約定的dll
msvcrt =cdll.msvcrt
#載入stdcall調用約定的dll
kernel32 =windll.kernel32
2. 載入自己dll文件,假如為addFuncDll,方式如下:
mydll =CDLL("addFuncDll.dll")
或者 mydll = cdll.addFuncDll
如果其中有函數add,計算兩個整數的和,則使用方式如下:
result=mydll.add(4,5)
可以多一步指明add函數的參數類型(也可不指明):
mydll.add.argtypes= [c_int,c_int]
3. 結構體在python中定義為Structure的子類如下:
class POINT(Structure):
_fields_ = [("x", c_int),
("y",c_int)]
_fields中每一項為元組(成員名稱,類型)
結構體還可以用於其他的結構體:
class RECT(Structure):
_fields_ = [("upperleft",POINT),
("lowerright",POINT)]
⑵ ctypes怎麼下
1、首先在瀏覽器中搜索ctypes官網,點擊下載。
2、其次上傳到/opt目錄下,並執行解壓操作。猛迅返
3、最後准備編譯環境、准枝飢備安裝依賴包zlibopenssl、預編譯:安裝到/usr/python-3.7.0目錄,安昌碰裝即可。
⑶ python怎麼修改某個內存地址的數據
使用ctypes模塊調用WriteProcessMemory函數,在創建程序進程後,就可以修改該程序指定內存地址。WriteProcessMemory的函數原型如下所示。
BOOL WriteProcessMemory(
HANDLE hProcess,
LPVOID lpBaseAddress,
LPCVOID lpBuffer,
SIZE_T nSize,
SIZE_T* lpNumberOfBytesWritten
);
其參數含義如下。
· hProcess:要寫內存的進程句柄。
· lpBaseAddress:要寫的內存起始地址。
· lpBuffer:寫入值的地址。
· nSize:寫入值的大小。
· lpNumberOfBytesWritten :實際寫入的大小。
python代碼示例如下:
fromctypesimport*
#定義_PROCESS_INFORMATION結構體
class_PROCESS_INFORMATION(Structure):
_fields_=[('hProcess',c_void_p),
('hThread',c_void_p),
('dwProcessId',c_ulong),
('dwThreadId',c_ulong)]
#定義_STARTUPINFO結構體
class_STARTUPINFO(Structure):
_fields_=[('cb',c_ulong),
('lpReserved',c_char_p),
('lpDesktop',c_char_p),
('lpTitle',c_char_p),
('dwX',c_ulong),
('dwY',c_ulong),
('dwXSize',c_ulong),
('dwYSize',c_ulong),
('dwXCountChars',c_ulong),
('dwYCountChars',c_ulong),
('dwFillAttribute',c_ulong),
('dwFlags',c_ulong),
('wShowWindow',c_ushort),
('cbReserved2',c_ushort),
('lpReserved2',c_char_p),
('hStdInput',c_ulong),
('hStdOutput',c_ulong),
('hStdError',c_ulong)]
NORMAL_PRIORITY_CLASS=0x00000020#定義NORMAL_PRIORITY_CLASS
kernel32=windll.LoadLibrary("kernel32.dll")#載入kernel32.dll
CreateProcess=kernel32.CreateProcessA#獲得CreateProcess函數地址
ReadProcessMemory=kernel32.ReadProcessMemory#獲得ReadProcessMemory函數地址
WriteProcessMemory=kernel32.WriteProcessMemory#獲得WriteProcessMemory函數地址
TerminateProcess=kernel32.TerminateProcess
#聲明結構體
ProcessInfo=_PROCESS_INFORMATION()
StartupInfo=_STARTUPINFO()
file='ModifyMe.exe'#要進行修改的文件
address=0x0040103c#要修改的內存地址
buffer=c_char_p("_")#緩沖區地址
bytesRead=c_ulong(0)#讀入的位元組數
bufferSize=len(buffer.value)#緩沖區大小
#創建進程
ifCreateProcess(file,0,0,0,0,NORMAL_PRIORITY_CLASS,0,0,byref(StartupInfo),byref(ProcessInfo)):
#讀取要修改的內存地址,以判斷是否是要修改的文件
ifReadProcessMemory(ProcessInfo.hProcess,address,buffer,bufferSize,byref(bytesRead)):
ifbuffer.value=='x74':
buffer.value='x75'#修改緩沖區內的值,將其寫入內存
#修改內存
ifWriteProcessMemory(ProcessInfo.hProcess,address,buffer,bufferSize,byref(bytesRead)):
print'成功改寫內存!'
else:
print'寫內存錯誤!'
else:
print'打開了錯誤的文件!'
TerminateProcess(ProcessInfo.hProcess,0)#如果不是要修改的文件,則終止進程
else:
print'讀內存錯誤!'
else:
print'不能創建進程!'
⑷ ctypes找不到指定模塊
途徑不對或者被殺毒軟體隔離。
可以把文件路徑改為絕對路徑,把殺毒軟體關閉芹歲重新操作。嫌缺睜
ctypes是Python的外部函數庫,它提供了與C語言兼容的數據類型,並允許調用DLL或共享庫中的函扮弊數。