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或共享库中的函扮弊数。