Python Ctypes-Can';无法使用NtQueryInformationProcess获取PEB地址
我正在使用Python Ctypes-Can';无法使用NtQueryInformationProcess获取PEB地址,python,python-3.x,winapi,ctypes,Python,Python 3.x,Winapi,Ctypes,我正在使用ctypes并尝试使用NtQueryInformationProcess函数获取PEB地址 返回值为0,表示函数已成功完成。 但是PROCESS\u BASIC\u INFORMATION结构(作为第三个参数给出)不包含PEB地址 class PROCESS_BASIC_INFORMATION(Structure): _fields_ = [ ("Reserved1", c_void_p), ("PebBaseAddress", DWORD),
ctypes
并尝试使用NtQueryInformationProcess
函数获取PEB
地址
返回值为0,表示函数已成功完成。
但是PROCESS\u BASIC\u INFORMATION
结构(作为第三个参数给出)不包含PEB
地址
class PROCESS_BASIC_INFORMATION(Structure):
_fields_ = [
("Reserved1", c_void_p),
("PebBaseAddress", DWORD),
("Reserved2", c_void_p * 2),
("UniqueProcessId", DWORD),
("Reserved3", c_void_p)]
ntdll = WinDLL('ntdll')
NTSTATUS = LONG
ntdll.argtypes = [HANDLE, DWORD, c_void_p, DWORD, PDWORD]
ntdll.restype = NTSTATUS
processInformation = PROCESS_BASIC_INFORMATION()
processInformationLength = sizeof(PROCESS_BASIC_INFORMATION)
result = ntdll.NtQueryInformationProcess(hProcess, 0, processInformation, processInformationLength, byref(DWORD(0)))
考虑返回值为0这一事实,有什么问题吗?清单
ntdll.NtQueryInformationProcess
定义它们。当我们在这里的时候,很明显你喜欢德沃德。即使在这种情况下没有区别,也要保持函数签名与C中的签名一致:
ntdll.NtQueryInformationProcess.argtypes=[HANDLE,c_int,c_void_p,ULONG,PULONG]
ntdll.NtQueryInformationProcess.restype=NTSTATUS
未能在函数上定义argtypes和restype(或操作不正确),可能(,并且很可能会)导致:
ProcessInformation
指向调用应用程序提供的缓冲区的指针,函数将请求的信息写入该缓冲区
因此,您的调用应该如下所示(通过引用传递processInformation):
result=ntdll.NtQueryInformationProcess(hProcess,0,byref(processInformation),processInformationLength,byref(DWORD(0)))
课程流程基本信息(结构):
_字段=[
(“保留1”,c_void_p),
(“PebBaseAddress”,c_void_p),
(“保留2”,c_void_p*2),
(“UniqueProcessId”,c_void_p),
(“保留3”,c_void_p),
]
您的版本(64位)短8字节(因为DWORD和指针之间的大小差异为(2)),导致传递给函数的缓冲区太短,即UndefinedBehavior(可能导致崩溃)ntdll.NtQueryInformationProcess
定义它们。当我们在这里的时候,很明显你喜欢德沃德。即使在这种情况下没有区别,也要保持函数签名与C中的签名一致:
ntdll.NtQueryInformationProcess.argtypes=[HANDLE,c_int,c_void_p,ULONG,PULONG]
ntdll.NtQueryInformationProcess.restype=NTSTATUS
未能在函数上定义argtypes和restype(或操作不正确),可能(,并且很可能会)导致:
ProcessInformation
指向调用应用程序提供的缓冲区的指针,函数将请求的信息写入该缓冲区
因此,您的调用应该如下所示(通过引用传递processInformation):
result=ntdll.NtQueryInformationProcess(hProcess,0,byref(processInformation),processInformationLength,byref(DWORD(0)))
课程流程基本信息(结构):
_字段=[
(“保留1”,c_void_p),
(“PebBaseAddress”,c_void_p),
(“保留2”,c_void_p*2),
(“UniqueProcessId”,c_void_p),
(“保留3”,c_void_p),
]
您的版本(64位)短8字节(因为DWORD和指针之间的大小差异为(2)),导致传递给函数的缓冲区太短,即UndefinedBehavior(可能导致崩溃)函数返回后,PEB字段包含什么?函数返回后,PEB字段包含什么?