Files

273 lines
16 KiB
C

#pragma once
#define SECURITY_WIN32
#include <windows.h>
#include <ntsecapi.h>
#include <sddl.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <lm.h>
#include <security.h>
#include "msasn1.h"
typedef const UNICODE_STRING *PCUNICODE_STRING;
// mimikatz/modules/kull_m_crypto_system.h
typedef NTSTATUS(WINAPI *PKERB_ECRYPT_INITIALIZE)(LPCVOID Key, DWORD KeySize, DWORD KeyUsage, PVOID *pContext);
typedef NTSTATUS(WINAPI *PKERB_ECRYPT_ENCRYPT)(PVOID pContext, LPCVOID Data, DWORD DataSize, PVOID Output, DWORD *OutputSize);
typedef NTSTATUS(WINAPI *PKERB_ECRYPT_DECRYPT)(PVOID pContext, LPCVOID Data, DWORD DataSize, PVOID Output, DWORD *OutputSize);
typedef NTSTATUS(WINAPI *PKERB_ECRYPT_FINISH)(PVOID *pContext);
typedef NTSTATUS(WINAPI *PKERB_ECRYPT_HASHPASSWORD_NT5)(PCUNICODE_STRING String, PVOID Output);
typedef NTSTATUS(WINAPI *PKERB_ECRYPT_HASHPASSWORD_NT6)(PCUNICODE_STRING Password, PCUNICODE_STRING Salt, DWORD Count, PVOID Output);
typedef NTSTATUS(WINAPI *PKERB_ECRYPT_RANDOMKEY)(LPCVOID Key, DWORD KeySize, PVOID Output);
typedef struct _KERB_ECRYPT
{
LONG Type0;
DWORD BlockSize;
LONG Type1;
DWORD KeySize;
DWORD Size;
DWORD unk2;
DWORD unk3;
PCWSTR AlgName;
PKERB_ECRYPT_INITIALIZE Initialize;
PKERB_ECRYPT_ENCRYPT Encrypt;
PKERB_ECRYPT_DECRYPT Decrypt;
PKERB_ECRYPT_FINISH Finish;
union
{
PKERB_ECRYPT_HASHPASSWORD_NT5 HashPassword_NT5;
PKERB_ECRYPT_HASHPASSWORD_NT6 HashPassword_NT6;
};
PKERB_ECRYPT_RANDOMKEY RandomKey;
PVOID Control;
PVOID unk0_null;
PVOID unk1_null;
PVOID unk2_null;
} KERB_ECRYPT, *PKERB_ECRYPT;
typedef struct ANSI_STRING
{
USHORT Length;
USHORT MaximumLength;
PCHAR Buffer;
} ANSI_STRING, *PANSI_STRING;
#if defined(BOF) || defined(BRC4)
// ntdll
WINBASEAPI NTSTATUS NTAPI NTDLL$RtlUnicodeStringToAnsiString(PANSI_STRING DestinationString, PCUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString);
WINBASEAPI void NTAPI NTDLL$RtlFreeAnsiString(PANSI_STRING AnsiString);
// kernel32
WINBASEAPI DWORD WINAPI KERNEL32$GetLastError(VOID);
WINBASEAPI VOID WINAPI KERNEL32$SetLastError(DWORD dwErrCode);
WINBASEAPI int WINAPI KERNEL32$FileTimeToSystemTime(CONST FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime);
WINBASEAPI HANDLE WINAPI KERNEL32$CreateToolhelp32Snapshot(DWORD dwFlags, DWORD th32ProcessID);
WINBASEAPI WINBOOL WINAPI KERNEL32$Process32FirstW(HANDLE hSnapshot, LPPROCESSENTRY32W lppe);
WINBASEAPI WINBOOL WINAPI KERNEL32$Process32NextW(HANDLE hSnapshot, LPPROCESSENTRY32W lppe);
WINBASEAPI WINBOOL WINAPI KERNEL32$CloseHandle(HANDLE hObject);
WINBASEAPI HANDLE WINAPI KERNEL32$OpenProcess(DWORD dwDesiredAccess, WINBOOL bInheritHandle, DWORD dwProcessId);
// msvcrt
WINBASEAPI void *__cdecl MSVCRT$calloc(size_t num, size_t size);
WINBASEAPI void __cdecl MSVCRT$free(void *memblock);
WINBASEAPI long __cdecl MSVCRT$strtoul(const char *string, char **end_ptr, int base);
WINBASEAPI size_t __cdecl MSVCRT$mbstowcs(wchar_t *__restrict__ _Dest, const char *__restrict__ _Source,
size_t _MaxCount);
WINBASEAPI void *__cdecl MSVCRT$malloc(size_t size);
WINBASEAPI int __cdecl MSVCRT$_vsnprintf(char *buffer, size_t count, const char *format, va_list argptr);
WINBASEAPI int __cdecl MSVCRT$_snprintf(char *buffer, size_t count, const char *format, ...);
// cryptdll
WINBASEAPI NTSTATUS WINAPI CRYPTDLL$CDLocateCSystem(LONG type, PKERB_ECRYPT *pCSystem);
// advapi32
WINADVAPI WINBOOL WINAPI ADVAPI32$OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle);
WINADVAPI WINBOOL WINAPI ADVAPI32$GetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass,
LPVOID TokenInformation, DWORD TokenInformationLength,
PDWORD ReturnLength);
WINADVAPI WINBOOL WINAPI ADVAPI32$ConvertSidToStringSidA(PSID Sid, LPSTR *StringSid);
WINADVAPI WINBOOL WINAPI ADVAPI32$AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,
BYTE nSubAuthorityCount, DWORD nSubAuthority0,
DWORD nSubAuthority1, DWORD nSubAuthority2,
DWORD nSubAuthority3, DWORD nSubAuthority4,
DWORD nSubAuthority5, DWORD nSubAuthority6,
DWORD nSubAuthority7, PSID *pSid);
WINADVAPI WINBOOL WINAPI ADVAPI32$EqualSid(PSID pSid1, PSID pSid2);
WINADVAPI PVOID WINAPI ADVAPI32$FreeSid(PSID pSid);
WINADVAPI WINBOOL WINAPI ADVAPI32$DuplicateToken(HANDLE ExistingTokenHandle,
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
PHANDLE DuplicateTokenHandle);
WINADVAPI WINBOOL WINAPI ADVAPI32$ImpersonateLoggedOnUser(HANDLE hToken);
WINADVAPI WINBOOL WINAPI ADVAPI32$LookupPrivilegeValueA(LPCSTR lpSystemName, LPCSTR lpName, PLUID lpLuid);
WINADVAPI WINBOOL WINAPI ADVAPI32$AdjustTokenPrivileges(HANDLE TokenHandle, BOOL DisableAllPrivileges,
PTOKEN_PRIVILEGES NewState, DWORD BufferLength,
PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength);
WINADVAPI ULONG WINAPI ADVAPI32$LsaNtStatusToWinError(NTSTATUS Status);
WINADVAPI WINBOOL WINAPI ADVAPI32$RevertToSelf();
WINADVAPI WINBOOL WINAPI ADVAPI32$OpenThreadToken(HANDLE ThreadHandle, DWORD DesiredAccess, BOOL OpenAsSelf,
PHANDLE TokenHandle);
WINADVAPI WINBOOL WINAPI ADVAPI32$CheckTokenMembership(HANDLE TokenHandle, PSID SidToCheck, PBOOL IsMember);
#ifndef CS_BOF
// secur32
WINBASEAPI NTSTATUS WINAPI SECUR32$LsaGetLogonSessionData(PLUID LogonId,
PSECURITY_LOGON_SESSION_DATA *ppLogonSessionData);
WINBASEAPI NTSTATUS WINAPI SECUR32$LsaFreeReturnBuffer(PVOID Buffer);
WINBASEAPI NTSTATUS WINAPI SECUR32$LsaEnumerateLogonSessions(PULONG LogonSessionCount, PLUID *LogonSessionList);
WINBASEAPI NTSTATUS WINAPI SECUR32$LsaRegisterLogonProcess(PLSA_STRING LogonProcessName, PHANDLE LsaHandle,
PLSA_OPERATIONAL_MODE SecurityMode);
WINBASEAPI NTSTATUS WINAPI SECUR32$LsaLookupAuthenticationPackage(HANDLE LsaHandle, PLSA_STRING PackageName,
PULONG AuthenticationPackage);
WINBASEAPI NTSTATUS WINAPI SECUR32$LsaCallAuthenticationPackage(HANDLE LsaHandle, ULONG AuthenticationPackage,
PVOID ProtocolSubmitBuffer, ULONG SubmitBufferLength,
PVOID *ProtocolReturnBuffer, PULONG ReturnBufferLength,
PNTSTATUS ProtocolStatus);
WINBASEAPI NTSTATUS WINAPI SECUR32$LsaDeregisterLogonProcess(HANDLE LsaHandle);
WINBASEAPI NTSTATUS WINAPI SECUR32$LsaConnectUntrusted(PHANDLE LsaHandle);
WINBASEAPI SECURITY_STATUS WINAPI SECUR32$AcquireCredentialsHandleA(SEC_CHAR *pszPrincipal, SEC_CHAR *pszPackage,
unsigned __LONG32 fCredentialUse, void *pvLogonId,
void *pAuthData, SEC_GET_KEY_FN pGetKeyFn,
void *pvGetKeyArgument, PCredHandle phCredential,
PTimeStamp ptsExpiry);
WINBASEAPI SECURITY_STATUS WINAPI SECUR32$InitializeSecurityContextA(
PCredHandle phCredential, PCtxtHandle phContext, SEC_CHAR *pszTargetName, unsigned __LONG32 fContextReq,
unsigned __LONG32 Reserved1, unsigned __LONG32 TargetDataRep, PSecBufferDesc pInput, unsigned __LONG32 Reserved2,
PCtxtHandle phNewContext, PSecBufferDesc pOutput, unsigned __LONG32 *pfContextAttr, PTimeStamp ptsExpiry);
WINBASEAPI SECURITY_STATUS WINAPI SECUR32$FreeContextBuffer(void *pvContextBuffer);
KSECDDDECLSPEC SECURITY_STATUS WINAPI SECUR32$DeleteSecurityContext(PCtxtHandle phContext);
KSECDDDECLSPEC SECURITY_STATUS WINAPI SECUR32$FreeCredentialsHandle(PCredHandle phCredential);
// msasn1
WINBASEAPI ASN1module_t ASN1API MSASN1$ASN1_CreateModule(ASN1uint32_t nVersion, ASN1encodingrule_e eRule, ASN1uint32_t dwFlags,
ASN1uint32_t cPDU, const ASN1GenericFun_t apfnEncoder[],
const ASN1GenericFun_t apfnDecoder[],
const ASN1FreeFun_t apfnFreeMemory[], const ASN1uint32_t acbStructSize[],
ASN1magic_t nModuleName);
WINBASEAPI void ASN1API MSASN1$ASN1_CloseModule(ASN1module_t pModule);
WINBASEAPI ASN1error_e ASN1API MSASN1$ASN1_CreateEncoder(ASN1module_t pModule, ASN1encoding_t *ppEncoderInfo, ASN1octet_t *pbBuf,
ASN1uint32_t cbBufSize, ASN1encoding_t pParent);
WINBASEAPI ASN1error_e ASN1API MSASN1$ASN1_Encode(ASN1encoding_t pEncoderInfo, void *pDataStruct, ASN1uint32_t nPduNum,
ASN1uint32_t dwFlags, ASN1octet_t *pbBuf, ASN1uint32_t cbBufSize);
WINBASEAPI void ASN1API MSASN1$ASN1_CloseEncoder(ASN1encoding_t pEncoderInfo);
WINBASEAPI void ASN1API MSASN1$ASN1_FreeEncoded(ASN1encoding_t pEncoderInfo, void *pBuf);
WINBASEAPI ASN1error_e ASN1API MSASN1$ASN1_CreateDecoder(ASN1module_t pModule, ASN1decoding_t *ppDecoderInfo, ASN1octet_t *pbBuf,
ASN1uint32_t cbBufSize, ASN1decoding_t pParent);
WINBASEAPI ASN1error_e ASN1API MSASN1$ASN1_Decode(ASN1decoding_t pDecoderInfo, void **ppDataStruct, ASN1uint32_t nPduNum,
ASN1uint32_t dwFlags, ASN1octet_t *pbBuf, ASN1uint32_t cbBufSize);
WINBASEAPI void ASN1API MSASN1$ASN1_CloseDecoder(ASN1decoding_t pDecoderInfo);
WINBASEAPI void ASN1API MSASN1$ASN1_FreeDecoded(ASN1decoding_t pDecoderInfo, void *pDataStruct, ASN1uint32_t nPduNum);
WINBASEAPI void ASN1API MSASN1$ASN1bitstring_free(ASN1bitstring_t *);
WINBASEAPI void ASN1API MSASN1$ASN1ztcharstring_free(ASN1ztcharstring_t);
WINBASEAPI void ASN1API MSASN1$ASN1octetstring_free(ASN1octetstring_t *);
WINBASEAPI void ASN1API MSASN1$ASN1intx_free(ASN1intx_t *);
WINBASEAPI int ASN1API MSASN1$ASN1BERDecExplicitTag(ASN1decoding_t dec, ASN1uint32_t tag, ASN1decoding_t *dd, ASN1octet_t **di);
WINBASEAPI int ASN1API MSASN1$ASN1BERDecS32Val(ASN1decoding_t dec, ASN1uint32_t tag, ASN1int32_t *);
WINBASEAPI int ASN1API MSASN1$ASN1BERDecEndOfContents(ASN1decoding_t dec, ASN1decoding_t dd, ASN1octet_t *di);
WINBASEAPI int ASN1API MSASN1$ASN1BERDecBitString(ASN1decoding_t dec, ASN1uint32_t tag, ASN1bitstring_t *);
WINBASEAPI int ASN1API MSASN1$ASN1BERDecZeroCharString(ASN1decoding_t dec, ASN1uint32_t tag, ASN1ztcharstring_t *);
WINBASEAPI int ASN1API MSASN1$ASN1BERDecPeekTag(ASN1decoding_t dec, ASN1uint32_t *tag);
WINBASEAPI int ASN1API MSASN1$ASN1BERDecOctetString(ASN1decoding_t dec, ASN1uint32_t tag, ASN1octetstring_t *val);
WINBASEAPI int ASN1API MSASN1$ASN1BERDecNotEndOfContents(ASN1decoding_t dec, ASN1octet_t *di);
WINBASEAPI void *ASN1API MSASN1$ASN1DecAlloc(ASN1decoding_t dec, ASN1uint32_t size);
WINBASEAPI void *ASN1API MSASN1$ASN1DecRealloc(ASN1decoding_t dec, void *ptr, ASN1uint32_t size);
WINBASEAPI void ASN1API MSASN1$ASN1Free(void *ptr);
WINBASEAPI int ASN1API MSASN1$ASN1BERDecGeneralizedTime(ASN1decoding_t dec, ASN1uint32_t tag, ASN1generalizedtime_t *);
WINBASEAPI int ASN1API MSASN1$ASN1BERDecSXVal(ASN1decoding_t dec, ASN1uint32_t tag, ASN1intx_t *);
WINBASEAPI int ASN1API MSASN1$ASN1BEREncExplicitTag(ASN1encoding_t enc, ASN1uint32_t tag, ASN1uint32_t *pLengthOffset);
WINBASEAPI int ASN1API MSASN1$ASN1BEREncS32(ASN1encoding_t enc, ASN1uint32_t tag, ASN1int32_t);
WINBASEAPI int ASN1API MSASN1$ASN1BEREncEndOfContents(ASN1encoding_t enc, ASN1uint32_t LengthOffset);
WINBASEAPI int ASN1API MSASN1$ASN1DEREncCharString(ASN1encoding_t enc, ASN1uint32_t tag, ASN1uint32_t len, ASN1char_t *val);
WINBASEAPI int ASN1API MSASN1$ASN1DEREncOctetString(ASN1encoding_t enc, ASN1uint32_t tag, ASN1uint32_t len, ASN1octet_t *val);
#endif
#else
__declspec(dllimport) NTSTATUS WINAPI CDLocateCSystem(LONG type, PKERB_ECRYPT *pCSystem);
#define NTDLL$RtlUnicodeStringToAnsiString RtlUnicodeStringToAnsiString
#define NTDLL$RtlFreeAnsiString RtlFreeAnsiString
#define KERNEL32$GetLastError GetLastError
#define KERNEL32$SetLastError SetLastError
#define KERNEL32$FileTimeToSystemTime FileTimeToSystemTime
#define KERNEL32$CreateToolhelp32Snapshot CreateToolhelp32Snapshot
#define KERNEL32$Process32FirstW Process32FirstW
#define KERNEL32$Process32NextW Process32NextW
#define KERNEL32$CloseHandle CloseHandle
#define KERNEL32$OpenProcess OpenProcess
#define MSVCRT$strtol strtol
#define MSVCRT$calloc calloc
#define MSVCRT$malloc malloc
#define MSVCRT$free free
#define MSVCRT$mbstowcs mbstowcs
#define MSVCRT$_vsnprintf _vsnprintf
#define MSVCRT$_snprintf _snprintf
#define ADVAPI32$OpenProcessToken OpenProcessToken
#define ADVAPI32$GetTokenInformation GetTokenInformation
#define ADVAPI32$ConvertSidToStringSidA ConvertSidToStringSidA
#define ADVAPI32$AllocateAndInitializeSid AllocateAndInitializeSid
#define ADVAPI32$EqualSid EqualSid
#define ADVAPI32$FreeSid FreeSid
#define ADVAPI32$DuplicateToken DuplicateToken
#define ADVAPI32$ImpersonateLoggedOnUser ImpersonateLoggedOnUser
#define ADVAPI32$LookupPrivilegeValueA LookupPrivilegeValueA
#define ADVAPI32$AdjustTokenPrivileges AdjustTokenPrivileges
#define ADVAPI32$LsaNtStatusToWinError LsaNtStatusToWinError
#define ADVAPI32$RevertToSelf RevertToSelf
#define ADVAPI32$OpenThreadToken OpenThreadToken
#define ADVAPI32$CheckTokenMembership CheckTokenMembership
#define SECUR32$LsaGetLogonSessionData LsaGetLogonSessionData
#define SECUR32$LsaFreeReturnBuffer LsaFreeReturnBuffer
#define SECUR32$LsaEnumerateLogonSessions LsaEnumerateLogonSessions
#define SECUR32$LsaRegisterLogonProcess LsaRegisterLogonProcess
#define SECUR32$LsaLookupAuthenticationPackage LsaLookupAuthenticationPackage
#define SECUR32$LsaCallAuthenticationPackage LsaCallAuthenticationPackage
#define SECUR32$LsaDeregisterLogonProcess LsaDeregisterLogonProcess
#define SECUR32$LsaConnectUntrusted LsaConnectUntrusted
#define SECUR32$AcquireCredentialsHandleA AcquireCredentialsHandleA
#define SECUR32$InitializeSecurityContextA InitializeSecurityContextA
#define SECUR32$FreeContextBuffer FreeContextBuffer
#define SECUR32$DeleteSecurityContext DeleteSecurityContext
#define SECUR32$FreeCredentialsHandle FreeCredentialsHandle
#define CRYPTDLL$CDLocateCSystem CDLocateCSystem
#define MSASN1$ASN1_CreateModule ASN1_CreateModule
#define MSASN1$ASN1_CloseModule ASN1_CloseModule
#define MSASN1$ASN1_CreateEncoder ASN1_CreateEncoder
#define MSASN1$ASN1_Encode ASN1_Encode
#define MSASN1$ASN1_CloseEncoder ASN1_CloseEncoder
#define MSASN1$ASN1_FreeEncoded ASN1_FreeEncoded
#define MSASN1$ASN1_CreateDecoder ASN1_CreateDecoder
#define MSASN1$ASN1_Decode ASN1_Decode
#define MSASN1$ASN1_CloseDecoder ASN1_CloseDecoder
#define MSASN1$ASN1_FreeDecoded ASN1_FreeDecoded
#define MSASN1$ASN1bitstring_free ASN1bitstring_free
#define MSASN1$ASN1ztcharstring_free ASN1ztcharstring_free
#define MSASN1$ASN1octetstring_free ASN1octetstring_free
#define MSASN1$ASN1intx_free ASN1intx_free
#define MSASN1$ASN1BERDecExplicitTag ASN1BERDecExplicitTag
#define MSASN1$ASN1BERDecS32Val ASN1BERDecS32Val
#define MSASN1$ASN1BERDecEndOfContents ASN1BERDecEndOfContents
#define MSASN1$ASN1BERDecBitString ASN1BERDecBitString
#define MSASN1$ASN1BERDecZeroCharString ASN1BERDecZeroCharString
#define MSASN1$ASN1BERDecPeekTag ASN1BERDecPeekTag
#define MSASN1$ASN1BERDecOctetString ASN1BERDecOctetString
#define MSASN1$ASN1BERDecNotEndOfContents ASN1BERDecNotEndOfContents
#define MSASN1$ASN1DecAlloc ASN1DecAlloc
#define MSASN1$ASN1DecRealloc ASN1DecRealloc
#define MSASN1$ASN1Free ASN1Free
#define MSASN1$ASN1BERDecGeneralizedTime ASN1BERDecGeneralizedTime
#define MSASN1$ASN1BERDecSXVal ASN1BERDecSXVal
#define MSASN1$ASN1BEREncExplicitTag ASN1BEREncExplicitTag
#define MSASN1$ASN1BEREncS32 ASN1BEREncS32
#define MSASN1$ASN1DEREncCharString ASN1BEREncCharString
#define MSASN1$ASN1DEREncOctetString ASN1BEREncOctetString
#define MSASN1$ASN1BEREncEndOfContents ASN1BEREncEndOfContents
#endif