Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """
- Access windows credentials
- """
- import ctypes as CT
- import ctypes.wintypes as WT
- CRED_TYPE_GENERIC = 0x01
- LPBYTE = CT.POINTER(WT.BYTE)
- LPTSTR = WT.LPSTR
- LPCTSTR = WT.LPSTR
- class CREDENTIAL_ATTRIBUTE(CT.Structure):
- _fields_ = [
- ('Keyword', LPTSTR),
- ('Flags', WT.DWORD),
- ('ValueSize', WT.DWORD),
- ('Value', LPBYTE)]
- PCREDENTIAL_ATTRIBUTE = CT.POINTER(CREDENTIAL_ATTRIBUTE)
- class CREDENTIAL(CT.Structure):
- _fields_ = [
- ('Flags', WT.DWORD),
- ('Type', WT.DWORD),
- ('TargetName', LPTSTR),
- ('Comment', LPTSTR),
- ('LastWritten', WT.FILETIME),
- ('CredentialBlobSize', WT.DWORD),
- ('CredentialBlob', LPBYTE),
- ('Persist', WT.DWORD),
- ('AttributeCount', WT.DWORD),
- ('Attributes', PCREDENTIAL_ATTRIBUTE),
- ('TargetAlias', LPTSTR),
- ('UserName', LPTSTR)]
- PCREDENTIAL = CT.POINTER(CREDENTIAL)
- advapi32 = CT.WinDLL('Advapi32.dll')
- advapi32.CredReadA.restype = WT.BOOL
- advapi32.CredReadA.argtypes = [LPCTSTR, WT.DWORD, WT.DWORD, CT.POINTER(PCREDENTIAL)]
- def GetPassword(url):
- credPtr = PCREDENTIAL()
- if advapi32.CredReadA(url, CRED_TYPE_GENERIC, 0, CT.byref(credPtr)):
- username = credPtr.contents.UserName
- passwordSize = credPtr.contents.CredentialBlobSize
- unicodePassword = credPtr.contents.CredentialBlob[:passwordSize:2]
- password = ''.join(map(chr, unicodePassword))
- advapi32.CredFree(credPtr)
- return username, password
- else:
- raise IOError("Failure reading credential")
Add Comment
Please, Sign In to add comment