Playing with CryptoApi

This commit is contained in:
hakril
2016-11-27 11:49:18 +01:00
committed by Clement Rouault
parent d2b801cada
commit 15e40da1ca
8 changed files with 317 additions and 14 deletions
+7 -1
View File
@@ -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
+2
View File
@@ -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
);
+11
View File
@@ -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
+52
View File
@@ -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),
+22
View File
@@ -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')