Обход Titanhide

Тема в разделе "WASM.BEGINNERS", создана пользователем galenkane, 26 янв 2020.

  1. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    301
    денег нет, придётся разбираться
     
  2. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    301
    Апну кодом.

    Чет внатуре приуныл дебаггер

    Код (ASM):
    1. .686
    2. .model flat, stdcall
    3. option casemap :none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. include \masm32\include\user32.inc
    8. includelib \masm32\lib\kernel32.lib
    9. includelib \masm32\lib\user32.lib
    10.  
    11. .data
    12. RaceBufferSize equ 1024
    13. RaceBuffer dd 0
    14.  
    15. .code
    16.  
    17. ; Функция для выделения буфера в одном потоке
    18. DoAllocateRaceBuffer proc
    19.     invoke LocalAlloc, LPTR, RaceBufferSize
    20.     mov RaceBuffer, eax
    21.     ret
    22. DoAllocateRaceBuffer endp
    23.  
    24. ; Функция для освобождения буфера в другом потоке
    25. DoFreeRaceBuffer proc
    26.     mov eax, RaceBuffer
    27.     cmp eax, 0
    28.     je @f
    29.     invoke LocalFree, eax
    30.     mov RaceBuffer, 0
    31. @@:
    32.     ret
    33. DoFreeRaceBuffer endp
    34.  
    35. ; Функция, которая вызывается из другого модуля
    36. DoRace proc
    37.     ; Бесконечный цикл выделения и освобождения буфера
    38. DoRaceLoop:
    39.     invoke DoAllocateRaceBuffer
    40.     invoke DoFreeRaceBuffer
    41.     jmp DoRaceLoop
    42.     ret
    43. DoRace endp
    44.  
    45. ; Точка входа в модуль
    46. Entry proc
    47.     ; Создаем два потока для выделения и освобождения буфера
    48.     invoke CreateThread, NULL, 0, offset DoRace, NULL, 0, NULL
    49.     invoke CreateThread, NULL, 0, offset DoRace, NULL, 0, NULL
    50.     ; Ожидаем нажатия клавиши для завершения программы
    51.     push 'Q'
    52.     call GetAsyncKeyState
    53.     test eax, eax
    54.     jz Entry
    55.     ret
    56. Entry endp
    57.  
    58. end Entry
    --- Сообщение объединено, 25 сен 2024 ---
    Эта версия получше, exception не ловится, а висим долго

    Код (ASM):
    1. .686
    2. .model flat, stdcall
    3. option casemap :none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. include \masm32\include\user32.inc
    8. includelib \masm32\lib\kernel32.lib
    9. includelib \masm32\lib\user32.lib
    10.  
    11. .data
    12. RaceBufferSize equ 1024
    13. RaceBuffer dd 0
    14. RaceBufferMutex HANDLE ?
    15. RaceBufferEvent HANDLE ?
    16.  
    17. .code
    18.  
    19. ; Функция для выделения буфера в одном потоке
    20. DoAllocateRaceBuffer proc
    21.     invoke CreateMutex, NULL, FALSE, NULL
    22.     mov RaceBufferMutex, eax
    23.     invoke CreateEvent, NULL, FALSE, FALSE, NULL
    24.     mov RaceBufferEvent, eax
    25.  
    26.     invoke LocalAlloc, LPTR, RaceBufferSize
    27.     mov RaceBuffer, eax
    28.  
    29.     invoke ReleaseMutex, RaceBufferMutex
    30.     ret
    31. DoAllocateRaceBuffer endp
    32.  
    33. ; Функция для освобождения буфера в другом потоке
    34. DoFreeRaceBuffer proc
    35.     invoke WaitForSingleObject, RaceBufferMutex, INFINITE
    36.     mov eax, RaceBuffer
    37.     cmp eax, 0
    38.     je @f
    39.     invoke LocalFree, eax
    40.     mov RaceBuffer, 0
    41.     invoke SetEvent, RaceBufferEvent
    42. @@:
    43.     invoke ReleaseMutex, RaceBufferMutex
    44.     ret
    45. DoFreeRaceBuffer endp
    46.  
    47. ; Функция, которая вызывается из другого модуля
    48. DoRace proc
    49.     ; Бесконечный цикл выделения и освобождения буфера
    50. DoRaceLoop:
    51.     invoke DoAllocateRaceBuffer
    52.     invoke DoFreeRaceBuffer
    53.     jmp DoRaceLoop
    54.     ret
    55. DoRace endp
    56.  
    57. ; Точка входа в модуль
    58. Entry proc
    59.     ; Создаем два потока для выделения и освобождения буфера
    60.     invoke CreateThread, NULL, 0, offset DoRace, NULL, 0, NULL
    61.     invoke CreateThread, NULL, 0, offset DoRace, NULL, 0, NULL
    62.     ; Ожидаем нажатия клавиши для завершения программы
    63.     push 'Q'
    64.     call GetAsyncKeyState
    65.     test eax, eax
    66.     jz Entry
    67.     ret
    68. Entry endp
    69.  
    70. end Entry
    --- Сообщение объединено, 25 сен 2024 ---
    v3

    Код (ASM):
    1. .686
    2. .model flat, stdcall
    3. option casemap :none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. include \masm32\include\user32.inc
    8. includelib \masm32\lib\kernel32.lib
    9. includelib \masm32\lib\user32.lib
    10.  
    11. .data
    12. RaceBufferSize equ 1024
    13. RaceBuffer dd 0
    14. RaceBufferMutex HANDLE ?
    15. RaceBufferEvent HANDLE ?
    16. RaceBufferCounter dd 0
    17. RaceBufferOverflowFlag dd 0
    18. RaceBufferDelay equ 2000  ; Задержка в миллисекундах
    19.  
    20. .code
    21.  
    22. ; Функция для выделения буфера в одном потоке
    23. DoAllocateRaceBuffer proc
    24.     ; Захватываем мьютекс
    25.     invoke WaitForSingleObject, RaceBufferMutex, INFINITE
    26.     ; Проверяем счетчик
    27.     cmp RaceBufferCounter, 0
    28.     jne @f
    29.     ; Выделяем буфер и увеличиваем счетчик
    30.     invoke LocalAlloc, LPTR, RaceBufferSize
    31.     mov RaceBuffer, eax
    32.     inc RaceBufferCounter
    33.     ; Устанавливаем событие
    34.     invoke SetEvent, RaceBufferEvent
    35. @@:
    36.     ; Освобождаем мьютекс
    37.     invoke ReleaseMutex, RaceBufferMutex
    38.     ; Если счетчик больше 1, устанавливаем флаг переполнения
    39.     cmp RaceBufferCounter, 1
    40.     jle @f
    41.     mov RaceBufferOverflowFlag, 1
    42. @@:
    43.     ; Задержка перед освобождением буфера
    44.     invoke Sleep, RaceBufferDelay
    45.     ret
    46. DoAllocateRaceBuffer endp
    47.  
    48. ; Функция для освобождения буфера в другом потоке
    49. DoFreeRaceBuffer proc
    50.     ; Захватываем мьютекс
    51.     invoke WaitForSingleObject, RaceBufferMutex, INFINITE
    52.     ; Проверяем, что буфер выделен и счетчик больше 0
    53.     cmp RaceBufferCounter, 0
    54.     je @f
    55.     ; Уменьшаем счетчик и освобождаем буфер
    56.     dec RaceBufferCounter
    57.     mov eax, RaceBuffer
    58.     invoke LocalFree, eax
    59.     mov RaceBuffer, 0
    60.     ; Если счетчик стал 0, сбрасываем событие
    61.     cmp RaceBufferCounter, 0
    62.     jne @f
    63.     invoke ResetEvent, RaceBufferEvent
    64. @@:
    65.     ; Освобождаем мьютекс
    66.     invoke ReleaseMutex, RaceBufferMutex
    67.     ; Если был флаг переполнения, обрабатываем его
    68.     cmp RaceBufferOverflowFlag, 1
    69.     jne @f
    70.     ; Выделяем дополнительный буфер
    71.     invoke DoAllocateRaceBuffer
    72. @@:
    73.     ; Задержка перед выделением нового буфера
    74.     invoke Sleep, RaceBufferDelay
    75.     ret
    76. DoFreeRaceBuffer endp
    77.  
    78. ; Функция, которая вызывается из другого модуля
    79. DoRace proc
    80.     ; Бесконечный цикл выделения и освобождения буфера
    81. DoRaceLoop:
    82.     invoke DoAllocateRaceBuffer
    83.     invoke DoFreeRaceBuffer
    84.     ; Ждем события
    85.     invoke WaitForSingleObject, RaceBufferEvent, INFINITE
    86.     jmp DoRaceLoop
    87.     ret
    88. DoRace endp
    89.  
    90. ; Точка входа в модуль
    91. Entry proc
    92.     ; Создаем мьютекс и событие
    93.     invoke CreateMutex, NULL, FALSE, NULL
    94.     mov RaceBufferMutex, eax
    95.     invoke CreateEvent, NULL, TRUE, FALSE, NULL
    96.     mov RaceBufferEvent, eax
    97.  
    98.     ; Создаем два потока для выделения и освобождения буфера
    99.     invoke CreateThread, NULL, 0, offset DoRace, NULL, 0, NULL
    100.     invoke CreateThread, NULL, 0, offset DoRace, NULL, 0, NULL
    101.     ; Ожидаем нажатия клавиши для завершения программы
    102.     push 'Q'
    103.     call GetAsyncKeyState
    104.     test eax, eax
    105.     jz Entry
    106.     ; Очищаем ресурсы
    107.     invoke CloseHandle, RaceBufferMutex
    108.     invoke CloseHandle, RaceBufferEvent
    109.     ret
    110. Entry endp
    111.  
    112. end Entry
    ну и ловкий код без хендлов

    Код (ASM):
    1. .686
    2. .model flat, stdcall
    3. option casemap :none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. include \masm32\include\user32.inc
    8. includelib \masm32\lib\kernel32.lib
    9. includelib \masm32\lib\user32.lib
    10.  
    11. .data
    12. RaceBufferSize equ 1024
    13. RaceBuffer dd 0
    14. RaceBufferCounter dd 0
    15. RaceBufferOverflowFlag dd 0
    16. RaceBufferDelay equ 50  ; Задержка в миллисекундах
    17.  
    18. .code
    19.  
    20. ; Функция для выделения буфера в одном потоке
    21. DoAllocateRaceBuffer proc
    22.     ; Захватываем критическую секцию
    23.     push eax
    24.     push ecx
    25.     xor ecx, ecx
    26.     mov eax, RaceBufferCounter
    27.     lock xadd [RaceBufferCounter], ecx
    28.     cmp ecx, 0
    29.     jne @f
    30.     ; Выделяем буфер и увеличиваем счетчик
    31.     invoke LocalAlloc, LPTR, RaceBufferSize
    32.     mov RaceBuffer, eax
    33.     inc RaceBufferCounter
    34. @@:
    35.     ; Освобождаем критическую секцию
    36.     pop ecx
    37.     pop eax
    38.  
    39.     ; Если счетчик больше 1, устанавливаем флаг переполнения
    40.     cmp ecx, 1
    41.     jle @f
    42.     mov RaceBufferOverflowFlag, 1
    43. @@:
    44.     ; Задержка перед освобождением буфера
    45.     invoke Sleep, RaceBufferDelay
    46.     ret
    47. DoAllocateRaceBuffer endp
    48.  
    49. ; Функция для освобождения буфера в другом потоке
    50. DoFreeRaceBuffer proc
    51.     ; Захватываем критическую секцию
    52.     push eax
    53.     push ecx
    54.     xor ecx, ecx
    55.     mov eax, RaceBufferCounter
    56.     lock xadd [RaceBufferCounter], ecx
    57.     cmp ecx, 1
    58.     jne @f
    59.     ; Уменьшаем счетчик и освобождаем буфер
    60.     dec RaceBufferCounter
    61.     mov eax, RaceBuffer
    62.     invoke LocalFree, eax
    63.     mov RaceBuffer, 0
    64. @@:
    65.     ; Освобождаем критическую секцию
    66.     pop ecx
    67.     pop eax
    68.  
    69.     ; Если был флаг переполнения, обрабатываем его
    70.     cmp RaceBufferOverflowFlag, 1
    71.     jne @f
    72.     ; Выделяем дополнительный буфер
    73.     invoke DoAllocateRaceBuffer
    74. @@:
    75.     ; Задержка перед выделением нового буфера
    76.     invoke Sleep, RaceBufferDelay
    77.     ret
    78. DoFreeRaceBuffer endp
    79.  
    80. ; Функция, которая вызывается из другого модуля
    81. DoRace proc
    82.     ; Бесконечный цикл выделения и освобождения буфера
    83. DoRaceLoop:
    84.     invoke DoAllocateRaceBuffer
    85.     invoke DoFreeRaceBuffer
    86.     jmp DoRaceLoop
    87.     ret
    88. DoRace endp
    89.  
    90. ; Точка входа в модуль
    91. Entry proc
    92.     ; Создаем два потока для выделения и освобождения буфера
    93.     invoke CreateThread, NULL, 0, offset DoRace, NULL, 0, NULL
    94.     invoke CreateThread, NULL, 0, offset DoRace, NULL, 0, NULL
    95.     ; Ожидаем нажатия клавиши для завершения программы
    96.     push 'Q'
    97.     call GetAsyncKeyState
    98.     test eax, eax
    99.     jz Entry
    100.     ret
    101. Entry endp
    102.  
    103. end Entry
    --- Сообщение объединено, 25 сен 2024 ---
    Для x64
    Но требует улучшения

    Код (ASM):
    1. option casemap :none
    2. include \masm64\include64\masm64rt.inc
    3. include \masm64\include64\kernel32.inc
    4. include \masm64\include64\user32.inc
    5. includelib \masm64\lib64\kernel32.lib
    6. includelib \masm64\lib64\user32.lib
    7.  
    8. .data
    9.     counter QWORD 0
    10.     num_threads QWORD 4
    11.     str_format db "%lld", 0Ah, 0
    12.     str_result db "Final counter value: ", 0
    13.  
    14. .code
    15. printf PROTO
    16.  
    17. ; Thread procedure
    18. ThreadProc PROC
    19. @loop:
    20.     ; Небезопасный инкремент счетчика
    21.     mov rax, [counter]
    22.     inc rax
    23.     mov [counter], rax
    24.     jmp @loop  ; Бесконечный цикл
    25. ThreadProc ENDP
    26.  
    27. Entry PROC
    28.     ; Создание потоков
    29.     xor rbx, rbx  ; Thread counter
    30.     lea r12, [num_threads]
    31.     lea r13, [ThreadProc]
    32. create_thread_loop:
    33.     xor rcx, rcx  ; lpThreadAttributes
    34.     xor rdx, rdx  ; dwStackSize
    35.     mov r8, r13   ; lpStartAddress (ThreadProc)
    36.     xor r9, r9    ; lpParameter
    37.     push 0        ; lpThreadId
    38.     push 0        ; dwCreationFlags
    39.     sub rsp, 32
    40.     call CreateThread
    41.     add rsp, 48
    42.    
    43.     ; Закрываем дескриптор сразу после создания
    44.     mov rcx, rax
    45.     call CloseHandle
    46.     inc rbx
    47.     cmp rbx, r12
    48.     jl create_thread_loop
    49.  
    50.     ; Небольшая задержка для работы потоков
    51.     mov rcx, 5000  ; 5000 миллисекунд = 5 секунд
    52.     call Sleep
    53.  
    54.     ; Вывод результата
    55.     lea rcx, [str_result]
    56.     sub rsp, 32
    57.     call printf
    58.     add rsp, 32
    59.  
    60.     lea rcx, [str_format]
    61.     mov rdx, [counter]
    62.     sub rsp, 32
    63.     call printf
    64.     add rsp, 32
    65.  
    66.     ; Выход из программы
    67.     xor rcx, rcx
    68.     call ExitProcess
    69. Entry ENDP
    70.  
    71. END
     
    Research и Mikl___ нравится это.
  3. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    301
    мб кому пригодится
    upload_2024-9-28_16-0-18.png
    Код (C++):
    1. #include <Windows.h>
    2. #include <iostream>
    3. #include <TlHelp32.h>
    4. #include <algorithm>
    5. const int MAX_THREADS = 1024;
    6. int DummyVariable;
    7.  
    8. void DummyFunction1() {}
    9. void DummyFunction2() {}
    10. void DummyFunction3() {}
    11. void DummyFunction4() {}
    12.  
    13. void DummyFunction() {}
    14.  
    15. bool HasTitanHide()
    16. {
    17.     const auto dummy_breakpoint = reinterpret_cast<DWORD64>(&DummyFunction);
    18.     const DWORD64 breakpoint_mask = 1; // Mask to set the breakpoint
    19.  
    20.     HANDLE current_thread = GetCurrentThread(); // Store the current thread handle
    21.  
    22.     CONTEXT ctx = {};
    23.     ctx.Dr0 = dummy_breakpoint;
    24.     ctx.Dr7 = breakpoint_mask; // Set the breakpoint
    25.     ctx.ContextFlags = 0x10; // Context flags
    26.  
    27.     if (!SetThreadContext(current_thread, &ctx))
    28.         return false;
    29.  
    30.     if (!GetThreadContext(current_thread, &ctx))
    31.         return false;
    32.  
    33.     return ctx.Dr0 != dummy_breakpoint; // Check if the breakpoint was removed
    34. }
    35. bool HasTitanHideRandomBreakpoints()
    36. {
    37.     const auto dummy_breakpoint1 = reinterpret_cast<DWORD64>(&DummyFunction1);
    38.     const auto dummy_breakpoint2 = reinterpret_cast<DWORD64>(&DummyFunction2);
    39.     const auto dummy_breakpoint3 = reinterpret_cast<DWORD64>(&DummyFunction3);
    40.     const DWORD64 breakpoint_mask = 7; // Mask to set 3 breakpoints
    41.     HANDLE current_thread = GetCurrentThread();
    42.     CONTEXT ctx = {};
    43.     ctx.ContextFlags = 0x10;
    44.  
    45.     // Set breakpoints in random order
    46.     int order[3] = { 0, 1, 2 };
    47.     std::random_shuffle(order, order + 3);
    48.     ctx.Dr7 = breakpoint_mask;
    49.     (&ctx.Dr0)[order[0]] = dummy_breakpoint1;
    50.     (&ctx.Dr0)[order[1]] = dummy_breakpoint2;
    51.     (&ctx.Dr0)[order[2]] = dummy_breakpoint3;
    52.  
    53.     if (!SetThreadContext(current_thread, &ctx))
    54.         return false;
    55.     if (!GetThreadContext(current_thread, &ctx))
    56.         return false;
    57.     return (&ctx.Dr0)[order[0]] != dummy_breakpoint1 ||
    58.         (&ctx.Dr0)[order[1]] != dummy_breakpoint2 ||
    59.         (&ctx.Dr0)[order[2]] != dummy_breakpoint3;
    60. }
    61. bool HasTitanHideDr7Flags()
    62. {
    63.     const auto dummy_breakpoint = reinterpret_cast<DWORD64>(&DummyFunction);
    64.     const DWORD64 breakpoint_mask = 1;
    65.     const DWORD64 dr7_flags_mask = 0x155; // Mask for DR7 flags (bits 0, 2, 4, 6)
    66.     HANDLE current_thread = GetCurrentThread();
    67.     CONTEXT ctx = {};
    68.     ctx.Dr0 = dummy_breakpoint;
    69.     ctx.Dr7 = breakpoint_mask;
    70.     ctx.ContextFlags = 0x10;
    71.     if (!SetThreadContext(current_thread, &ctx))
    72.         return false;
    73.     if (!GetThreadContext(current_thread, &ctx))
    74.         return false;
    75.     return (ctx.Dr7 & dr7_flags_mask) != breakpoint_mask;
    76. }
    77.  
    78. DWORD GetThreadIds(HANDLE hProcess, DWORD* thread_ids)
    79. {
    80.     DWORD count = 0;
    81.     HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
    82.     if (hSnapshot != INVALID_HANDLE_VALUE)
    83.     {
    84.         THREADENTRY32 te;
    85.         te.dwSize = sizeof(THREADENTRY32);
    86.         if (Thread32First(hSnapshot, &te))
    87.         {
    88.             do
    89.             {
    90.                 if (te.th32OwnerProcessID == GetProcessId(hProcess))
    91.                 {
    92.                     thread_ids[count++] = te.th32ThreadID;
    93.                 }
    94.             } while (Thread32Next(hSnapshot, &te));
    95.         }
    96.         CloseHandle(hSnapshot);
    97.     }
    98.     return count;
    99. }
    100.  
    101.  
    102.  
    103. bool HasTitanHideMultipleThreadBreakpoints()
    104. {
    105.     const auto dummy_breakpoint = reinterpret_cast<DWORD64>(&DummyFunction);
    106.     const DWORD64 breakpoint_mask = 1;
    107.     HANDLE current_process = GetCurrentProcess();
    108.     CONTEXT ctx = {};
    109.     ctx.Dr0 = dummy_breakpoint;
    110.     ctx.Dr7 = breakpoint_mask;
    111.     ctx.ContextFlags = 0x10;
    112.  
    113.     DWORD thread_ids[MAX_THREADS];
    114.     DWORD thread_count = GetThreadIds(current_process, thread_ids);
    115.  
    116.     for (DWORD i = 0; i < thread_count; ++i)
    117.     {
    118.         HANDLE thread = OpenThread(THREAD_ALL_ACCESS, FALSE, thread_ids[i]);
    119.         if (thread != NULL)
    120.         {
    121.             if (!SetThreadContext(thread, &ctx) || !GetThreadContext(thread, &ctx))
    122.             {
    123.                 CloseHandle(thread);
    124.                 return false;
    125.             }
    126.             if (ctx.Dr0 != dummy_breakpoint)
    127.             {
    128.                 CloseHandle(thread);
    129.                 return true;
    130.             }
    131.             CloseHandle(thread);
    132.         }
    133.     }
    134.     return false;
    135. }
    136. bool HasTitanHideExecuteBreakpoint()
    137. {
    138.     const auto dummy_breakpoint = reinterpret_cast<DWORD64>(&DummyFunction);
    139.     const DWORD64 breakpoint_mask = 1 << 0; // Mask to set execute breakpoint
    140.     HANDLE current_thread = GetCurrentThread();
    141.     CONTEXT ctx = {};
    142.     ctx.Dr0 = dummy_breakpoint;
    143.     ctx.Dr7 = breakpoint_mask;
    144.     ctx.ContextFlags = 0x10;
    145.     if (!SetThreadContext(current_thread, &ctx))
    146.         return false;
    147.     if (!GetThreadContext(current_thread, &ctx))
    148.         return false;
    149.     return ctx.Dr0 != dummy_breakpoint;
    150. }
    151. bool HasTitanHideMemoryBreakpoint()
    152. {
    153.     const auto dummy_address = reinterpret_cast<DWORD64>(&DummyVariable);
    154.     const DWORD64 breakpoint_mask = 1 << 2; // Mask to set memory breakpoint
    155.     HANDLE current_thread = GetCurrentThread();
    156.     CONTEXT ctx = {};
    157.     ctx.Dr0 = dummy_address;
    158.     ctx.Dr7 = breakpoint_mask;
    159.     ctx.ContextFlags = 0x10;
    160.     if (!SetThreadContext(current_thread, &ctx))
    161.         return false;
    162.     if (!GetThreadContext(current_thread, &ctx))
    163.         return false;
    164.     return ctx.Dr0 != dummy_address;
    165. }
    166. bool HasTitanHideMultipleBreakpoints()
    167. {
    168.     const auto dummy_breakpoint1 = reinterpret_cast<DWORD64>(&DummyFunction1);
    169.     const auto dummy_breakpoint2 = reinterpret_cast<DWORD64>(&DummyFunction2);
    170.     const auto dummy_breakpoint3 = reinterpret_cast<DWORD64>(&DummyFunction3);
    171.     const auto dummy_breakpoint4 = reinterpret_cast<DWORD64>(&DummyFunction4);
    172.     const DWORD64 breakpoint_mask = 0xF; // Mask to set all 4 breakpoints
    173.     HANDLE current_thread = GetCurrentThread();
    174.     CONTEXT ctx = {};
    175.     ctx.Dr0 = dummy_breakpoint1;
    176.     ctx.Dr1 = dummy_breakpoint2;
    177.     ctx.Dr2 = dummy_breakpoint3;
    178.     ctx.Dr3 = dummy_breakpoint4;
    179.     ctx.Dr7 = breakpoint_mask;
    180.     ctx.ContextFlags = 0x10;
    181.     if (!SetThreadContext(current_thread, &ctx))
    182.         return false;
    183.     if (!GetThreadContext(current_thread, &ctx))
    184.         return false;
    185.     return ctx.Dr0 != dummy_breakpoint1 || ctx.Dr1 != dummy_breakpoint2 ||
    186.         ctx.Dr2 != dummy_breakpoint3 || ctx.Dr3 != dummy_breakpoint4;
    187. }
    188. int main()
    189. {
    190.     std::cout << "TitanHide Detection Results:" << std::endl;
    191.  
    192.     // Первоначальная функция обнаружения
    193.     if (HasTitanHide())
    194.         std::cout << "  - TitanHide detected (basic detection)" << std::endl;
    195.     else
    196.         std::cout << "  - TitanHide not detected (basic detection)" << std::endl;
    197.  
    198.     // Обнаружение через установку нескольких аппаратных точек останова
    199.     if (HasTitanHideMultipleBreakpoints())
    200.         std::cout << "  - TitanHide detected (multiple breakpoints)" << std::endl;
    201.     else
    202.         std::cout << "  - TitanHide not detected (multiple breakpoints)" << std::endl;
    203.  
    204.     // Обнаружение через установку точки останова на доступ к памяти
    205.     if (HasTitanHideMemoryBreakpoint())
    206.         std::cout << "  - TitanHide detected (memory breakpoint)" << std::endl;
    207.     else
    208.         std::cout << "  - TitanHide not detected (memory breakpoint)" << std::endl;
    209.  
    210.     // Обнаружение через установку точки останова на выполнение
    211.     if (HasTitanHideExecuteBreakpoint())
    212.         std::cout << "  - TitanHide detected (execute breakpoint)" << std::endl;
    213.     else
    214.         std::cout << "  - TitanHide not detected (execute breakpoint)" << std::endl;
    215.  
    216.     // Обнаружение через установку точек останова на несколько потоков
    217.     if (HasTitanHideMultipleThreadBreakpoints())
    218.         std::cout << "  - TitanHide detected (multiple thread breakpoints)" << std::endl;
    219.     else
    220.         std::cout << "  - TitanHide not detected (multiple thread breakpoints)" << std::endl;
    221.  
    222.     // Обнаружение через проверку флагов регистра Dr7
    223.     if (HasTitanHideDr7Flags())
    224.         std::cout << "  - TitanHide detected (DR7 flags)" << std::endl;
    225.     else
    226.         std::cout << "  - TitanHide not detected (DR7 flags)" << std::endl;
    227.  
    228.     // Обнаружение через установку точек останова в случайном порядке
    229.     if (HasTitanHideRandomBreakpoints())
    230.         std::cout << "  - TitanHide detected (random breakpoints)" << std::endl;
    231.     else
    232.         std::cout << "  - TitanHide not detected (random breakpoints)" << std::endl;
    233.  
    234.     return 0;
    235. }
    под масморито32бито

    Код (ASM):
    1. .data
    2. dummy_breakpoint        dd 0
    3. TitanHideDetectedMsg    db "TitanHide detected", 0
    4. TitanHideNotDetectedMsg db "TitanHide not detected", 0
    5. TitanHideTitle          db "HasTitanHide", 0
    6. ctx           CONTEXT <> ; Объявление переменной для структуры CONTEXT
    7.  
    8. .code
    9.  
    10. ; DummyFunction
    11. DummyFunction proc
    12.     ret
    13. DummyFunction endp
    14.  
    15.  
    16. HasTitanHide  proc
    17.     ; Save registers
    18.     push ebx
    19.     push ecx
    20.     push edx
    21.     push esi
    22.     push edi
    23.  
    24.     %DBG "HasTitanHide: Начало выполнения"
    25.  
    26.     ; Set breakpoint on dummy_breakpoint
    27.     mov eax,                  offset DummyFunction
    28.     mov [ctx.iDr0],           eax
    29.     mov dword ptr [ctx.iDr7], 1
    30.  
    31.     %DBG "HasTitanHide: Установлена точка останова на DummyFunction (0x%X)", eax
    32.  
    33.     ; Set CONTEXT.ContextFlags
    34.     mov dword ptr [ctx.ContextFlags], CONTEXT_DEBUG_REGISTERS
    35.  
    36.     %DBG "HasTitanHide: Установлены флаги контекста CONTEXT_DEBUG_REGISTERS"
    37.  
    38.     ; Call SetThreadContext
    39.     invoke GetCurrentThread
    40.     invoke SetThreadContext, eax, addr ctx
    41.  
    42.     %DBG "HasTitanHide: Вызван SetThreadContext, результат: 0x%X", eax
    43.  
    44.     ; Call GetThreadContext
    45.     invoke GetCurrentThread
    46.     invoke GetThreadContext, eax, addr ctx
    47.  
    48.     %DBG "HasTitanHide: Вызван GetThreadContext, результат: 0x%X", eax
    49.  
    50.     ; Check if breakpoint is still set
    51.     mov eax,        offset DummyFunction
    52.     cmp [ctx.iDr0], eax
    53.     jne @F
    54.     %DBG "HasTitanHide: Проверка точки останова, результат: все еще установлена"
    55.     jmp TitanHideNotDetected
    56. @@:
    57.     %DBG "HasTitanHide: Проверка точки останова, результат: снята"
    58.     jmp TitanHideDetected
    59.  
    60. TitanHideNotDetected:
    61.     ; TitanHide not detected
    62.     xor eax, eax
    63.     %DBG "HasTitanHide: TitanHide не обнаружен"
    64.     jmp Exit
    65.  
    66. TitanHideDetected:
    67.     mov eax, 1
    68.     %DBG "HasTitanHide: Обнаружен TitanHide!"
    69.  
    70. Exit:
    71.     ; Restore registers
    72.     pop edi
    73.     pop esi
    74.     pop edx
    75.     pop ecx
    76.     pop ebx
    77.  
    78.     %DBG "HasTitanHide: Завершение выполнения, результат: 0x%X", eax
    79.  
    80.     ret
    81. HasTitanHide endp
    82.  
     
    Mikl___ и Research нравится это.
  4. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    187
    Как я понял здесь всё крутится вокруг регистров отладки DRx что ли (хард-бряки)?
    Так плагин "ScyllaHide" для x64dbg перехватывает-же обращения к ним не только под юзером Get/SetThreadContext(), но и ниже в нативной NtGet/SetContextThread(). Можете сбросить сюда свой ConsoleApp3.exe? ..посмотрим на реакцию данного плага на него.

    ScyllaHide.png
     
  5. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    301
    вот. чекайте лог в .log файле, а не с cmd сообщения

    upload_2024-9-29_8-0-19.png
    если это будет установлено в scyllahide то тоже будет детект

    по сути main.zip детектит и титанку и скиляку
     

    Вложения:

    • main.zip
      Размер файла:
      127,5 КБ
      Просмотров:
      95
    Последнее редактирование: 29 сен 2024
    Marylin и Research нравится это.
  6. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    187
    да, есть детект в логе..
     
  7. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    301
    теперь на него DoRace под vm какой-то чтобы не понятно откуда вызывается и будет веселья крякерам
     
  8. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    447
    Детектик (какой-то?) дебаггер без дебаггера запущенного
     
  9. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    301
    смотри в лог. там в cmd еще не до конца сделано
    --- Сообщение объединено, 29 сен 2024 ---
    TrIsDebug и Setup.StkTrap самые важные

    0xC0000353 это без дебагера
    0x0 детект дебагера