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

Защита исполняемого файла от дебага, анализа и т. п.

Пожалуйста, обратите внимание, что пользователь заблокирован
По-разному, мне кажется, что ответ на этот вопрос будет тянуть на целую статью.
Но если в кратце, то виртуализация и обфускация для анализа.
Для антидебага существует множество техник. Все они конечно обходятся дефолтными плагинами того же х64дбг, но там есть свои варианты, как сделать так, чтобы не обходили.

Тут необходимо задаваться вопросом от кого ты защититься пытаешься?
Аверам скорее всего не надо полностью реверсить твой файл, если это что-то типа обычного троя. Вот если это условный итв 0дэй, то да, будет полный реверс.
Если ты пытаешься защититься от человека, который намеренно пытается именно зареверсить полностью, то равно или поздно он всё равно зареверсит. Тут все способы просто сделают его работу сложнее и дольше.
 
По-разному, мне кажется, что ответ на этот вопрос будет тянуть на целую статью.
Но если в кратце, то виртуализация и обфускация для анализа.
Для антидебага существует множество техник. Все они конечно обходятся дефолтными плагинами того же х64дбг, но там есть свои варианты, как сделать так, чтобы не обходили.

Тут необходимо задаваться вопросом от кого ты защититься пытаешься?
Аверам скорее всего не надо полностью реверсить твой файл, если это что-то типа обычного троя. Вот если это условный итв 0дэй, то да, будет полный реверс.
Если ты пытаешься защититься от человека, который намеренно пытается именно зареверсить полностью, то равно или поздно он всё равно зареверсит. Тут все способы просто сделают его работу сложнее и дольше.
Скорей просто защита от ав, не пускать же просто голый только что скомпиленный файл
Что нужно делать как защитить ?
Может заморфить как то ?
Или заюзать уже готовое хотяб для начала по типу темиды ?
 
Чекать дллки через GetModuleHandleA а от статического и эвристического анализа юзать пакер или llvm
Еще есть способы но коды дать не могу юзаю для крипта exe их
 
Пожалуйста, обратите внимание, что пользователь заблокирован
GetModuleHandleA
Если длл заинжекчена мануал мапом, то не будет находиться.

Или заюзать уже готовое хотяб для начала по типу темиды ?
Если готовое, то обфускатор на llvm. Но там есть чуток детектов.

Ты уточнил, что это нужно для защиты от аверов. Скажу тебе, что аверам в большинстве случаев поебать какие у тебя там сигнатуры.
Сигнатурный детект обходится всем чем можно. (хотя его тоже можно разделить на 2 стадии: когда сканят файл на диске и когда его сканят в памяти после распаковки). Обход: пакеры, протекторы, обфускаторы, морферы.
Есть поведенческий детект. Это просто вызовы функций в нужной последовательности с нужными параметрами. Если есть поведенческий детект, то уже без разницы какая у тебя там сигнатура)
От поведенческого детекта спасёт, наверное, только редактирование кода, либо разбавление его каким-то мусором с вызовами хукнутых апи функций, чтобы прервать цепочку вызовов, которые влекут детект.

Само собой есть техники, которые позволяют обойти хуки авера и использовать задетекченную цепочку вызовов, но информации по этому поводу мало.
Кроме, конечно, говно техники с установкой хардварного бряка на сисколе))))) Почему говно не буду говорить, потому что и так уже много букв написал. Но чтобы понять почему достаточно немного потестить на каких-то проектах, где есть многопоток
 
Если длл заинжекчена мануал мапом, то не будет находиться.


Если готовое, то обфускатор на llvm. Но там есть чуток детектов.

Ты уточнил, что это нужно для защиты от аверов. Скажу тебе, что аверам в большинстве случаев поебать какие у тебя там сигнатуры.
Сигнатурный детект обходится всем чем можно. (хотя его тоже можно разделить на 2 стадии: когда сканят файл на диске и когда его сканят в памяти после распаковки). Обход: пакеры, протекторы, обфускаторы, морферы.
Есть поведенческий детект. Это просто вызовы функций в нужной последовательности с нужными параметрами. Если есть поведенческий детект, то уже без разницы какая у тебя там сигнатура)
От поведенческого детекта спасёт, наверное, только редактирование кода, либо разбавление его каким-то мусором с вызовами хукнутых апи функций, чтобы прервать цепочку вызовов, которые влекут детект.

Само собой есть техники, которые позволяют обойти хуки авера и использовать задетекченную цепочку вызовов, но информации по этому поводу мало.
Кроме, конечно, говно техники с установкой хардварного бряка на сисколе))))) Почему говно не буду говорить, потому что и так уже много букв написал. Но чтобы понять почему достаточно немного потестить на каких-то проектах, где есть многопоток
Я тебе так скажу у меня обход авера патчем 2х байтов в дллке винды и не сносит на рантайме exe
 
Если длл заинжекчена мануал мапом, то не будет находиться.


Если готовое, то обфускатор на llvm. Но там есть чуток детектов.

Ты уточнил, что это нужно для защиты от аверов. Скажу тебе, что аверам в большинстве случаев поебать какие у тебя там сигнатуры.
Сигнатурный детект обходится всем чем можно. (хотя его тоже можно разделить на 2 стадии: когда сканят файл на диске и когда его сканят в памяти после распаковки). Обход: пакеры, протекторы, обфускаторы, морферы.
Есть поведенческий детект. Это просто вызовы функций в нужной последовательности с нужными параметрами. Если есть поведенческий детект, то уже без разницы какая у тебя там сигнатура)
От поведенческого детекта спасёт, наверное, только редактирование кода, либо разбавление его каким-то мусором с вызовами хукнутых апи функций, чтобы прервать цепочку вызовов, которые влекут детект.

Само собой есть техники, которые позволяют обойти хуки авера и использовать задетекченную цепочку вызовов, но информации по этому поводу мало.
Кроме, конечно, говно техники с установкой хардварного бряка на сисколе))))) Почему говно не буду говорить, потому что и так уже много букв написал. Но чтобы понять почему достаточно немного потестить на каких-то проектах, где есть многопоток
Пакеры ав любой вскроет как нехуй делать
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Пакеры ав любой вскроет как нехуй делать
ну кстати не совсем. Условно есть самопальный пакер, который берет ключ для расшифровки данных с сервера. Обычно в песочницах инет не работает -> распаковать нельзя.
Но в целом я согласен, что пакер это херня. Вот пакер с виртуализацией это уже другое дело
 
ну кстати не совсем. Условно есть самопальный пакер, который берет ключ для расшифровки данных с сервера. Обычно в песочницах инет не работает -> распаковать нельзя.
Но в целом я согласен, что пакер это херня. Вот пакер с виртуализацией это уже другое дело
Не, самое пиздатое это когда твоя программа создает виртуальную среду и в ней выполняется в зашифрованном виде. Или просто запрещает системе к ней доступ.
 
Не, самое пиздатое это когда твоя программа создает виртуальную среду и в ней выполняется в зашифрованном виде. Или просто запрещает системе к ней доступ.
Если говорить о винде, то всякие касперские и авасты находятся на kernel уровне и просто "запретить системе к ней доступ" невозможно
 
невероятно глупая хрень, это обойдет даже средненький реверсер, но мне поравилась идея
C:
#include <windows.h>
#include <string.h>
#include <wchar.h>
#include <tlhelp32.h>
#include <stdio.h>

DWORD g_dwDebuggerProcessId = -1;

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM dwProcessId)
{
    DWORD dwWindowProcessId;
    GetWindowThreadProcessId(hwnd, &dwWindowProcessId);

    if (dwProcessId == dwWindowProcessId)
    {
        int windowTitleSize = GetWindowTextLengthW(hwnd);
        if ( windowTitleSize <= 0 )
        {
            return TRUE;
        }
        wchar_t* windowTitle = (wchar_t*)malloc((windowTitleSize + 1) * sizeof(wchar_t));
        
        GetWindowTextW(hwnd, windowTitle, windowTitleSize + 1);

        if (wcsstr(windowTitle, L"dbg") != 0 ||
            wcsstr(windowTitle, L"debugger") != 0 )
        {
            g_dwDebuggerProcessId = dwProcessId;
            return FALSE;
        }
 
       return FALSE;
    }

    return TRUE;
}

DWORD IsDebuggerProcess(DWORD dwProcessId)
{
    EnumWindows(EnumWindowsProc, (LPARAM)dwProcessId);
    return g_dwDebuggerProcessId == dwProcessId;
}

DWORD SuspendDebuggerThread()
{
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
    if (hSnapshot == INVALID_HANDLE_VALUE)
    {
        printf("Failed to create snapshot\n");
        return 1;
    }

    THREADENTRY32 te32;
    te32.dwSize = sizeof(THREADENTRY32);

    if (!Thread32First(hSnapshot, &te32))
    {
        printf("Failed to get first thread\n");
        CloseHandle(hSnapshot);
        return 1;
    }

    do
    {
        HANDLE hThread = OpenThread(THREAD_QUERY_INFORMATION | THREAD_SUSPEND_RESUME, FALSE, te32.th32ThreadID);
        if (hThread != NULL)
        {
            DWORD dwProcessId = GetProcessIdOfThread(hThread);
            if ( IsDebuggerProcess(dwProcessId) )
            {
                printf("Debugger found with pid %i! Suspending!\n", dwProcessId);
                DWORD result = SuspendThread(hThread);
                 if ( result == -1 )
                {
                    printf("Last error: %i\n", GetLastError());
                }
            }
            CloseHandle(hThread);
        }
    } while (Thread32Next(hSnapshot, &te32));

    CloseHandle(hSnapshot);

    return 0;
}

int main(void)
{
    SuspendDebuggerThread();

    printf("12333");
    getchar();
}

Перебираем все открытые окна, если название окна содержит строки `debugger`, `dbg`, или `debug`, то мы перечисляем все потоки и ищем те, которые связанные с отладчиками и приостанавлвием их
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Тебя всё равно крякнут, просто делай софт которому нужна постоянная поддержка, хоть на подписке "пару дошиков" намутишь.
на самом деле в таком треде единственный правильный ответ. Крякуют виндусы и фотожопы, а крякнуть какой-то мутный софт - дел на пару дней.
Но если он перестает обновляться, то уже всё печальнее. Нет дополнительных фич с апдейтов, если про малвару, тогда и чисток тоже нет)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ну, кроме шуток, единственная защита - перенести часть функционала на сервер (и то, при желании, могут и это дописать, тут уже вопрос денег). А любую защиту взломают, хоть визора, хоть ВМ.
 
Hello, in the past I've written a few anti-debugging functions.

C++:
BOOL IsIntelHardwareBreakpointPresent(VOID)
{
    BOOL bFlag = FALSE;
    PCONTEXT Context = NULL;

    Context = (PCONTEXT)VirtualAlloc(NULL, sizeof(CONTEXT), MEM_COMMIT, PAGE_READWRITE);
    if (Context == NULL)
        return FALSE;

    RtlZeroMemory(Context, sizeof(Context));

    Context->ContextFlags = CONTEXT_DEBUG_REGISTERS;

    if (!GetThreadContext(GetCurrentThreadNoForward(), Context))
        goto EXIT_ROUTINE;

    if (Context->Dr0 || Context->Dr1 || Context->Dr2 || Context->Dr3)
        bFlag = TRUE;

EXIT_ROUTINE:

    if (Context)
        VirtualFree(Context, 0, MEM_RELEASE);

    return bFlag;
}

C++:
BOOL IsDebuggerPresentEx(VOID)
{
    return GetPeb()->BeingDebugged;
}

C++:
BOOL CheckRemoteDebuggerPresent2(_In_ HANDLE hHandle, _Inout_ PBOOL pbDebuggerPresent)
{
    NTQUERYINFORMATIONPROCESS NtQueryInformationProcess = NULL;
    NTSTATUS Status = 0;
    DWORD dwProcessDebugPort = 0, dwReturnValue = 0;
    *pbDebuggerPresent = FALSE;

    if (hHandle == NULL)
        return FALSE;

    HMODULE hModule = GetModuleHandleW(L"ntdll.dll");
    if (hModule == NULL)
        return FALSE;

    NtQueryInformationProcess = (NTQUERYINFORMATIONPROCESS)GetProcAddressA((DWORD64)hModule, "NtQueryInformationProcess");
    if (!NtQueryInformationProcess)
        return FALSE;

    Status = NtQueryInformationProcess(hHandle, ProcessDebugPort, &dwProcessDebugPort, sizeof(DWORD), &dwReturnValue);
    if (NT_SUCCESS(Status) && dwProcessDebugPort == -1)
        return TRUE;

    *pbDebuggerPresent = TRUE;

    NtQueryInformationProcess = NULL;

    return TRUE;
}

C++:
BOOL AdfOpenProcessOnCsrss(VOID)
{
    HMODULE hNtdll = NULL;
    CSRGETPROCESSID CsrGetProcessId = NULL;
    HANDLE hCsrHandle = NULL;

    hNtdll = GetModuleHandleW(L"ntdll.dll");
    if (hNtdll == NULL)
        return FALSE;

    CsrGetProcessId = (CSRGETPROCESSID)GetProcAddressA((DWORD64)hNtdll, "CsrGetProcessId");
    if (CsrGetProcessId == NULL)
        return FALSE;

    hCsrHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, CsrGetProcessId());
    if (hCsrHandle == NULL)
        return FALSE;

    if (hCsrHandle)
        CloseHandle(hCsrHandle);

    CsrGetProcessId = NULL;

    return TRUE;
}
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Context = (PCONTEXT)VirtualAlloc
There's no real point in allocating a memory page for the context with VirtualAlloc, you'd better allocate it on the stack or the heap.
 


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