mirror of
https://github.com/hakril/PythonForWindows
synced 2026-06-08 14:31:45 +00:00
Playing with CryptoApi
This commit is contained in:
@@ -23,4 +23,10 @@ Since 0.2:
|
||||
* Can retrieve 64b context of syswow thread via context_syswow/set_syswow_context
|
||||
* Debugger handle breakpoint in 64b part of syswow process
|
||||
* ReadSyswow64Process is now a Process (allows to parse exports of remote PEB64 of syswow process)
|
||||
* Added Debugger.detach
|
||||
* Added Debugger.detach
|
||||
|
||||
|
||||
Since 0.3:
|
||||
|
||||
* Rewrote pe_parse to minimize closure (allowing the refcount to dell all ref to WinProcess when the debugger detach it)
|
||||
* Fix debugger.detach / handling on exit_process
|
||||
@@ -18,6 +18,8 @@ TODO:
|
||||
- registry
|
||||
- test !
|
||||
|
||||
- Clean pe_parse.py
|
||||
|
||||
Documentation
|
||||
* verif samples
|
||||
|
||||
|
||||
@@ -2724,3 +2724,39 @@ typedef struct _CERT_CHAIN_ENGINE_CONFIG {
|
||||
DWORD MaximumCachedCertificates;
|
||||
DWORD CycleDetectionModulus;
|
||||
} CERT_CHAIN_ENGINE_CONFIG, *PCERT_CHAIN_ENGINE_CONFIG;
|
||||
|
||||
|
||||
typedef struct _SYSTEMTIME {
|
||||
WORD wYear;
|
||||
WORD wMonth;
|
||||
WORD wDayOfWeek;
|
||||
WORD wDay;
|
||||
WORD wHour;
|
||||
WORD wMinute;
|
||||
WORD wSecond;
|
||||
WORD wMilliseconds;
|
||||
} SYSTEMTIME, *PSYSTEMTIME;
|
||||
|
||||
|
||||
typedef struct _CERT_EXTENSIONS {
|
||||
DWORD cExtension;
|
||||
PCERT_EXTENSION rgExtension;
|
||||
} CERT_EXTENSIONS, *PCERT_EXTENSIONS;
|
||||
|
||||
typedef struct _CRYPT_KEY_PROV_PARAM {
|
||||
DWORD dwParam;
|
||||
BYTE *pbData;
|
||||
DWORD cbData;
|
||||
DWORD dwFlags;
|
||||
} CRYPT_KEY_PROV_PARAM, *PCRYPT_KEY_PROV_PARAM;
|
||||
|
||||
|
||||
typedef struct _CRYPT_KEY_PROV_INFO {
|
||||
LPWSTR pwszContainerName;
|
||||
LPWSTR pwszProvName;
|
||||
DWORD dwProvType;
|
||||
DWORD dwFlags;
|
||||
DWORD cProvParam;
|
||||
PCRYPT_KEY_PROV_PARAM rgProvParam;
|
||||
DWORD dwKeySpec;
|
||||
} CRYPT_KEY_PROV_INFO, *PCRYPT_KEY_PROV_INFO;
|
||||
@@ -1,6 +1,6 @@
|
||||
BOOL WINAPI CryptQueryObject(
|
||||
_In_ DWORD dwObjectType,
|
||||
_In_ void *pvObject,
|
||||
_In_ VOID *pvObject,
|
||||
_In_ DWORD dwExpectedContentTypeFlags,
|
||||
_In_ DWORD dwExpectedFormatTypeFlags,
|
||||
_In_ DWORD dwFlags,
|
||||
@@ -16,7 +16,7 @@ BOOL WINAPI CryptMsgGetParam(
|
||||
_In_ HCRYPTMSG hCryptMsg,
|
||||
_In_ DWORD dwParamType,
|
||||
_In_ DWORD dwIndex,
|
||||
_Out_ void *pvData,
|
||||
_Out_ VOID *pvData,
|
||||
_Inout_ DWORD *pcbData
|
||||
);
|
||||
|
||||
@@ -27,7 +27,7 @@ BOOL WINAPI CryptDecodeObject(
|
||||
_In_ BYTE *pbEncoded,
|
||||
_In_ DWORD cbEncoded,
|
||||
_In_ DWORD dwFlags,
|
||||
_Out_ void *pvStructInfo,
|
||||
_Out_ VOID *pvStructInfo,
|
||||
_Inout_ DWORD *pcbStructInfo
|
||||
);
|
||||
|
||||
@@ -37,7 +37,7 @@ PCCERT_CONTEXT WINAPI CertFindCertificateInStore(
|
||||
_In_ DWORD dwCertEncodingType,
|
||||
_In_ DWORD dwFindFlags,
|
||||
_In_ DWORD dwFindType,
|
||||
_In_ void *pvFindPara,
|
||||
_In_ VOID *pvFindPara,
|
||||
_In_ PCCERT_CONTEXT pPrevCertContext
|
||||
);
|
||||
|
||||
@@ -45,7 +45,7 @@ DWORD WINAPI CertGetNameStringA(
|
||||
_In_ PCCERT_CONTEXT pCertContext,
|
||||
_In_ DWORD dwType,
|
||||
_In_ DWORD dwFlags,
|
||||
_In_ void *pvTypePara,
|
||||
_In_ VOID *pvTypePara,
|
||||
_Out_ LPCSTR pszNameString,
|
||||
_In_ DWORD cchNameString
|
||||
);
|
||||
@@ -54,7 +54,7 @@ DWORD WINAPI CertGetNameStringW(
|
||||
_In_ PCCERT_CONTEXT pCertContext,
|
||||
_In_ DWORD dwType,
|
||||
_In_ DWORD dwFlags,
|
||||
_In_ void *pvTypePara,
|
||||
_In_ VOID *pvTypePara,
|
||||
_Out_ LPWSTR pszNameString,
|
||||
_In_ DWORD cchNameString
|
||||
);
|
||||
@@ -70,3 +70,112 @@ BOOL WINAPI CertGetCertificateChain(
|
||||
_In_ LPVOID pvReserved,
|
||||
_Out_ PCCERT_CHAIN_CONTEXT *ppChainContext
|
||||
);
|
||||
|
||||
PCCERT_CONTEXT WINAPI CertCreateSelfSignCertificate(
|
||||
_In_opt_ HCRYPTPROV_OR_NCRYPT_KEY_HANDLE hCryptProvOrNCryptKey,
|
||||
_In_ PCERT_NAME_BLOB pSubjectIssuerBlob,
|
||||
_In_ DWORD dwFlags,
|
||||
_In_opt_ PCRYPT_KEY_PROV_INFO pKeyProvInfo,
|
||||
_In_opt_ PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
|
||||
_In_opt_ PSYSTEMTIME pStartTime,
|
||||
_In_opt_ PSYSTEMTIME pEndTime,
|
||||
_In_opt_ PCERT_EXTENSIONS pExtensions
|
||||
);
|
||||
|
||||
|
||||
BOOL WINAPI CertStrToNameA(
|
||||
_In_ DWORD dwCertEncodingType,
|
||||
_In_ LPCSTR pszX500,
|
||||
_In_ DWORD dwStrType,
|
||||
_In_opt_ VOID *pvReserved,
|
||||
_Out_ BYTE *pbEncoded,
|
||||
_Inout_ DWORD *pcbEncoded,
|
||||
_Out_opt_ LPCSTR *ppszError
|
||||
);
|
||||
|
||||
BOOL WINAPI CertStrToNameW(
|
||||
_In_ DWORD dwCertEncodingType,
|
||||
_In_ LPWSTR pszX500,
|
||||
_In_ DWORD dwStrType,
|
||||
_In_opt_ VOID *pvReserved,
|
||||
_Out_ BYTE *pbEncoded,
|
||||
_Inout_ DWORD *pcbEncoded,
|
||||
_Out_opt_ LPWSTR *ppszError
|
||||
);
|
||||
|
||||
HCERTSTORE WINAPI CertOpenStore(
|
||||
_In_ LPCSTR lpszStoreProvider,
|
||||
_In_ DWORD dwMsgAndCertEncodingType,
|
||||
_In_ HCRYPTPROV_LEGACY hCryptProv,
|
||||
_In_ DWORD dwFlags,
|
||||
_In_ VOID *pvPara
|
||||
);
|
||||
|
||||
BOOL WINAPI CertAddCertificateContextToStore(
|
||||
_In_ HCERTSTORE hCertStore,
|
||||
_In_ PCCERT_CONTEXT pCertContext,
|
||||
_In_ DWORD dwAddDisposition,
|
||||
_Out_opt_ PCCERT_CONTEXT *ppStoreContext
|
||||
);
|
||||
|
||||
|
||||
BOOL WINAPI PFXExportCertStoreEx(
|
||||
_In_ HCERTSTORE hStore,
|
||||
_Inout_ CRYPT_DATA_BLOB *pPFX,
|
||||
_In_ LPCWSTR szPassword,
|
||||
_In_ VOID *pvPara,
|
||||
_In_ DWORD dwFlags
|
||||
);
|
||||
|
||||
HCERTSTORE WINAPI PFXImportCertStore(
|
||||
_In_ CRYPT_DATA_BLOB *pPFX,
|
||||
_In_ LPCWSTR szPassword,
|
||||
_In_ DWORD dwFlags
|
||||
);
|
||||
|
||||
|
||||
BOOL WINAPI CryptGenKey(
|
||||
_In_ HCRYPTPROV hProv,
|
||||
_In_ ALG_ID Algid,
|
||||
_In_ DWORD dwFlags,
|
||||
_Out_ HCRYPTKEY *phKey
|
||||
);
|
||||
|
||||
BOOL WINAPI CryptAcquireContextA(
|
||||
_Out_ HCRYPTPROV *phProv,
|
||||
_In_ LPCSTR pszContainer,
|
||||
_In_ LPCSTR pszProvider,
|
||||
_In_ DWORD dwProvType,
|
||||
_In_ DWORD dwFlags
|
||||
);
|
||||
|
||||
BOOL WINAPI CryptAcquireContextW(
|
||||
_Out_ HCRYPTPROV *phProv,
|
||||
_In_ LPWSTR pszContainer,
|
||||
_In_ LPWSTR pszProvider,
|
||||
_In_ DWORD dwProvType,
|
||||
_In_ DWORD dwFlags
|
||||
);
|
||||
|
||||
|
||||
BOOL WINAPI CryptExportKey(
|
||||
_In_ HCRYPTKEY hKey,
|
||||
_In_ HCRYPTKEY hExpKey,
|
||||
_In_ DWORD dwBlobType,
|
||||
_In_ DWORD dwFlags,
|
||||
_Out_ BYTE *pbData,
|
||||
_Inout_ DWORD *pdwDataLen
|
||||
);
|
||||
|
||||
|
||||
BOOL WINAPI CertGetCertificateContextProperty(
|
||||
_In_ PCCERT_CONTEXT pCertContext,
|
||||
_In_ DWORD dwPropId,
|
||||
_Out_ VOID *pvData,
|
||||
_Inout_ DWORD *pcbData
|
||||
);
|
||||
|
||||
DWORD WINAPI CertEnumCertificateContextProperties(
|
||||
_In_ PCCERT_CONTEXT pCertContext,
|
||||
_In_ DWORD dwPropId
|
||||
);
|
||||
@@ -17,6 +17,9 @@ dedent = textwrap.dedent
|
||||
|
||||
|
||||
TYPE_EQUIVALENCE = [
|
||||
# BYTE is defined in ctypes.wintypes as c_byte but who wants
|
||||
# BYTE to be signed ? (from MSDN: <typedef unsigned char BYTE;>)
|
||||
('BYTE', 'c_ubyte'),
|
||||
('PWSTR', 'LPWSTR'),
|
||||
('PCWSTR', 'LPWSTR'),
|
||||
('SIZE_T', 'c_ulong'),
|
||||
@@ -80,6 +83,12 @@ TYPE_EQUIVALENCE = [
|
||||
('ACCESS_MASK', 'DWORD'),
|
||||
('REGSAM', 'ACCESS_MASK'),
|
||||
('SECURITY_CONTEXT_TRACKING_MODE', 'BOOLEAN'),
|
||||
('HCRYPTPROV_OR_NCRYPT_KEY_HANDLE', 'PULONG'),
|
||||
('HCRYPTPROV_LEGACY', 'PULONG'),
|
||||
('HCRYPTKEY', 'PULONG'),
|
||||
('HCRYPTPROV', 'PULONG'),
|
||||
('HCRYPTHASH', 'PULONG'),
|
||||
('ALG_ID', 'UINT'),
|
||||
("DISPID", "LONG"),
|
||||
("MEMBERID", "DISPID"),
|
||||
('PSECURITY_DESCRIPTOR', 'PVOID'),
|
||||
@@ -158,6 +167,7 @@ class CtypesGenerator(object):
|
||||
self.parse()
|
||||
self.data += self.PARSER(open(filename).read()).parse()
|
||||
self.analyse(self.data)
|
||||
self.check_dependances()
|
||||
|
||||
class InitialDefGenerator(CtypesGenerator):
|
||||
PARSER = def_parser.WinDefParser
|
||||
@@ -283,6 +293,7 @@ class StructGenerator(CtypesGenerator):
|
||||
self.data[0].extend(new_data[0])
|
||||
self.data[1].extend(new_data[1])
|
||||
self.analyse(self.data)
|
||||
self.check_dependances()
|
||||
|
||||
class FuncGenerator(CtypesGenerator):
|
||||
PARSER = func_parser.WinFuncParser
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -4,6 +4,7 @@
|
||||
from ctypes import *
|
||||
from ctypes.wintypes import *
|
||||
from windef import *
|
||||
BYTE = c_ubyte
|
||||
PWSTR = LPWSTR
|
||||
PCWSTR = LPWSTR
|
||||
SIZE_T = c_ulong
|
||||
@@ -66,6 +67,12 @@ PHKEY = POINTER(HKEY)
|
||||
ACCESS_MASK = DWORD
|
||||
REGSAM = ACCESS_MASK
|
||||
SECURITY_CONTEXT_TRACKING_MODE = BOOLEAN
|
||||
HCRYPTPROV_OR_NCRYPT_KEY_HANDLE = PULONG
|
||||
HCRYPTPROV_LEGACY = PULONG
|
||||
HCRYPTKEY = PULONG
|
||||
HCRYPTPROV = PULONG
|
||||
HCRYPTHASH = PULONG
|
||||
ALG_ID = UINT
|
||||
DISPID = LONG
|
||||
MEMBERID = DISPID
|
||||
PSECURITY_DESCRIPTOR = PVOID
|
||||
@@ -3374,6 +3381,51 @@ class _CERT_CHAIN_ENGINE_CONFIG(Structure):
|
||||
CERT_CHAIN_ENGINE_CONFIG = _CERT_CHAIN_ENGINE_CONFIG
|
||||
PCERT_CHAIN_ENGINE_CONFIG = POINTER(_CERT_CHAIN_ENGINE_CONFIG)
|
||||
|
||||
class _SYSTEMTIME(Structure):
|
||||
_fields_ = [
|
||||
("wYear", WORD),
|
||||
("wMonth", WORD),
|
||||
("wDayOfWeek", WORD),
|
||||
("wDay", WORD),
|
||||
("wHour", WORD),
|
||||
("wMinute", WORD),
|
||||
("wSecond", WORD),
|
||||
("wMilliseconds", WORD),
|
||||
]
|
||||
SYSTEMTIME = _SYSTEMTIME
|
||||
PSYSTEMTIME = POINTER(_SYSTEMTIME)
|
||||
|
||||
class _CERT_EXTENSIONS(Structure):
|
||||
_fields_ = [
|
||||
("cExtension", DWORD),
|
||||
("rgExtension", PCERT_EXTENSION),
|
||||
]
|
||||
PCERT_EXTENSIONS = POINTER(_CERT_EXTENSIONS)
|
||||
CERT_EXTENSIONS = _CERT_EXTENSIONS
|
||||
|
||||
class _CRYPT_KEY_PROV_PARAM(Structure):
|
||||
_fields_ = [
|
||||
("dwParam", DWORD),
|
||||
("pbData", POINTER(BYTE)),
|
||||
("cbData", DWORD),
|
||||
("dwFlags", DWORD),
|
||||
]
|
||||
CRYPT_KEY_PROV_PARAM = _CRYPT_KEY_PROV_PARAM
|
||||
PCRYPT_KEY_PROV_PARAM = POINTER(_CRYPT_KEY_PROV_PARAM)
|
||||
|
||||
class _CRYPT_KEY_PROV_INFO(Structure):
|
||||
_fields_ = [
|
||||
("pwszContainerName", LPWSTR),
|
||||
("pwszProvName", LPWSTR),
|
||||
("dwProvType", DWORD),
|
||||
("dwFlags", DWORD),
|
||||
("cProvParam", DWORD),
|
||||
("rgProvParam", PCRYPT_KEY_PROV_PARAM),
|
||||
("dwKeySpec", DWORD),
|
||||
]
|
||||
CRYPT_KEY_PROV_INFO = _CRYPT_KEY_PROV_INFO
|
||||
PCRYPT_KEY_PROV_INFO = POINTER(_CRYPT_KEY_PROV_INFO)
|
||||
|
||||
class tagRECT(Structure):
|
||||
_fields_ = [
|
||||
("left", LONG),
|
||||
|
||||
@@ -69,6 +69,8 @@ def kernel32_error_check(func_name, result, func, args):
|
||||
raise Kernel32Error(func_name)
|
||||
return args
|
||||
|
||||
null_is_fail_error_check = kernel32_error_check
|
||||
|
||||
|
||||
def kernel32_zero_check(func_name, result, func, args):
|
||||
"""raise Kernel32Error if result is NOT 0"""
|
||||
@@ -188,6 +190,10 @@ class VersionProxy(ApiProxy):
|
||||
APIDLL = "version"
|
||||
default_error_check = staticmethod(kernel32_error_check)
|
||||
|
||||
class Crypt32Proxy(ApiProxy):
|
||||
APIDLL = "crypt32"
|
||||
default_error_check = staticmethod(null_is_fail_error_check)
|
||||
|
||||
#class OptionalExport(object):
|
||||
# """used 'around' a Proxy decorator
|
||||
# Should be used for export that are not available everywhere (ntdll internals | 32/64 bits stuff)
|
||||
@@ -991,6 +997,22 @@ def CryptCATAdminReleaseContext(hCatAdmin, dwFlags):
|
||||
return CryptCATAdminReleaseContext.ctypes_function(hCatAdmin, dwFlags)
|
||||
|
||||
|
||||
## Crypto API ##
|
||||
@Crypt32Proxy('CertStrToNameA')
|
||||
def CertStrToNameA(dwCertEncodingType, pszX500, dwStrType, pvReserved, pbEncoded, pcbEncoded, ppszError):
|
||||
return CertStrToNameA.ctypes_function(dwCertEncodingType, pszX500, dwStrType, pvReserved, pbEncoded, pcbEncoded, ppszError)
|
||||
|
||||
|
||||
@Crypt32Proxy('CertStrToNameW')
|
||||
def CertStrToNameW(dwCertEncodingType, pszX500, dwStrType, pvReserved, pbEncoded, pcbEncoded, ppszError):
|
||||
return CertStrToNameW.ctypes_function(dwCertEncodingType, pszX500, dwStrType, pvReserved, pbEncoded, pcbEncoded, ppszError)
|
||||
|
||||
|
||||
@Crypt32Proxy('CertCreateSelfSignCertificate')
|
||||
def CertCreateSelfSignCertificate(hCryptProvOrNCryptKey, pSubjectIssuerBlob, dwFlags, pKeyProvInfo, pSignatureAlgorithm, pStartTime, pEndTime, pExtensions):
|
||||
return CertCreateSelfSignCertificate.ctypes_function(hCryptProvOrNCryptKey, pSubjectIssuerBlob, dwFlags, pKeyProvInfo, pSignatureAlgorithm, pStartTime, pEndTime, pExtensions)
|
||||
|
||||
|
||||
# ## User32 stuff ## #
|
||||
|
||||
EnumWindows = TransparentUser32Proxy('EnumWindows')
|
||||
|
||||
Reference in New Issue
Block a user