使用ctypes获取信息

2024-07-05 11:44:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试对ctypes使用GetTokenInformation函数。 问题是它永远不会打印任何内容。在

import winappdbg
from ctypes import *

LPVOID = c_void_p
PVOID = LPVOID
PSID = PVOID
DWORD = c_uint32


class SID_AND_ATTRIBUTES(Structure):
    _fields_ = [
        ("Sid",         PSID),
        ("Attributes",  DWORD),
    ]

class TOKEN_USER(Structure):
    _fields_ = [
        ("User", SID_AND_ATTRIBUTES),]

tokenprivs = (winappdbg.win32.TOKEN_QUERY | winappdbg.win32.TOKEN_READ | winappdbg.win32.TOKEN_IMPERSONATE | winappdbg.win32.TOKEN_QUERY_SOURCE | winappdbg.win32.TOKEN_DUPLICATE | winappdbg.win32.TOKEN_ASSIGN_PRIMARY)
hProcess = winappdbg.win32.OpenProcess(winappdbg.win32.PROCESS_QUERY_INFORMATION, False, winappdbg.win32.GetCurrentProcessId())
hToken = winappdbg.win32.OpenProcessToken(hProcess, DesiredAccess = tokenprivs)

tokeninformation = TOKEN_USER()
dwLength = DWORD(0)
windll.advapi32.GetTokenInformation(hToken, winappdbg.win32.TokenUser, byref(tokeninformation), sizeof(TOKEN_USER), byref(dwLength))
print tokeninformation.User.Sid

另外,我知道win32安全.GetTokenInformation存在。但是我想使用ctypes,因为它是真正的进程处理程序。在

编辑:

工作代码:

^{pr2}$

Tags: importtokenctypesqueryclasswin32siduser
1条回答
网友
1楼 · 发布于 2024-07-05 11:44:47

尽管令牌信息类TokenUser的查询在目标缓冲区中存储了一个TOKEN_USER结构,但它本身并不包含所有必需的信息。正如您在该结构的文档中看到的,它只包含SID_AND_ATTRIBUTES结构,而该结构又只包含指向SID的指针和带标志的整数。在

如果您添加了更多的错误检查,您将看到对GetTokenInformation()的调用没有成功,报告的错误代码是ERROR_INSUFFICIENT_BUFFER(122),dwLength被设置为类似36的值(绝对超过sizeof(TOKEN_USER),只有8)。在

显然,该函数需要在目标缓冲区中有足够的空间来存储SID本身,然后指向文档输出结构TOKEN_USER中的额外数据。在


我不太了解Ctypes,但您需要将输出缓冲区创建为实际的缓冲区/数组,而不仅仅是结构,并对其执行强制转换以获取数据。您可以采取简单的方法,在第一次尝试时创建足够大的缓冲区,或者调用函数两次,第一次获得所需的缓冲区长度,第二次调用该函数来填充它。在

相关问题 更多 >