Загрузка данных
#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;
}