我尝试对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}$
尽管令牌信息类
TokenUser
的查询在目标缓冲区中存储了一个TOKEN_USER
结构,但它本身并不包含所有必需的信息。正如您在该结构的文档中看到的,它只包含SID_AND_ATTRIBUTES
结构,而该结构又只包含指向SID的指针和带标志的整数。在如果您添加了更多的错误检查,您将看到对
GetTokenInformation()
的调用没有成功,报告的错误代码是ERROR_INSUFFICIENT_BUFFER
(122),dwLength
被设置为类似36的值(绝对超过sizeof(TOKEN_USER)
,只有8)。在显然,该函数需要在目标缓冲区中有足够的空间来存储SID本身,然后指向文档输出结构
TOKEN_USER
中的额外数据。在我不太了解Ctypes,但您需要将输出缓冲区创建为实际的缓冲区/数组,而不仅仅是结构,并对其执行强制转换以获取数据。您可以采取简单的方法,在第一次尝试时创建足够大的缓冲区,或者调用函数两次,第一次获得所需的缓冲区长度,第二次调用该函数来填充它。在
相关问题 更多 >
编程相关推荐