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)定义了argtypes和restype。您应该为
    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)定义了argtypes和restype。您应该为
    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字段包含什么?