ищу антидебаг инди

Тема в разделе "WASM.SOURCES & 2LZ", создана пользователем galenkane, 23 ноя 2023.

  1. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    302
    Вообщем пофиксил основную часть, вывод в логе.
    Трабл есть с WsGet который сканит память модулей что залезли в ПО. Нужно ресерчить еще, а так годнота
    --- Сообщение объединено, 24 сен 2024 ---
    для фикса WsGet нужно увеличить
    Local Mm[2048]:ULONG
     

    Вложения:

  2. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    302
    кто захочет подебажит)
     

    Вложения:

  3. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
    Какой критерий палива
    безусловная терминация процесса или что-то еще?
     
  4. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    302
    из длл полет нормальный, тестовая структура для вывода
    --- Сообщение объединено, 24 сен 2024 ---
    на таймерах вылетает без анхуков разных под скиллахайдом ,дальше не тестил еще
    --- Сообщение объединено, 24 сен 2024 ---
    но код бодрый, под мультипоток замутить будет пушка
     

    Вложения:

    • main.zip
      Размер файла:
      130,4 КБ
      Просмотров:
      672
  5. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
    под дебуггером валится на

    Log data, item 2
    Address = 1000262B
    Message = Access violation when writing to [000000D0] - passed to application
     
  6. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    302
    там валится должно да,главное под продакшен чтобы не мешало
    --- Сообщение объединено, 24 сен 2024 ---
    по критериям подойдет опрос структуры раз в минуту думаю,кому как нрав.

    всевдокод

    Код (ASM):
    1. ; cb.asm
    2. ; Добавьте следующие глобальные переменные и функции
    3.  
    4. .data
    5. gDebugLog DEBUG_LOG <?>
    6. gDebugLogMutex HANDLE ?
    7. gUpdateThreadHandle HANDLE ?
    8. gStopUpdateThread BOOL FALSE
    9.  
    10. .code
    11. UpdateDebugLogThread proc
    12.     .while !gStopUpdateThread
    13.         ; Захват мьютекса
    14.         invoke WaitForSingleObject, gDebugLogMutex, INFINITE
    15.        
    16.         ; Обновление gDebugLog
    17.         ; ... (код для обновления различных полей gDebugLog)
    18.         inc gDebugLog.UpdateCounter
    19.        
    20.         ; Освобождение мьютекса
    21.         invoke ReleaseMutex, gDebugLogMutex
    22.        
    23.         ; Ожидание перед следующим обновлением
    24.         invoke Sleep, 100  ; Обновление каждые 100 мс
    25.     .endw
    26.     ret
    27. UpdateDebugLogThread endp
    28.  
    29. StartDebugLogUpdate proc
    30.     ; Создание мьютекса
    31.     invoke CreateMutex, NULL, FALSE, NULL
    32.     mov gDebugLogMutex, eax
    33.    
    34.     ; Создание потока обновления
    35.     invoke CreateThread, NULL, 0, addr UpdateDebugLogThread, NULL, 0, NULL
    36.     mov gUpdateThreadHandle, eax
    37.    
    38.     ret
    39. StartDebugLogUpdate endp
    40.  
    41. StopDebugLogUpdate proc
    42.     ; Установка флага остановки
    43.     mov gStopUpdateThread, TRUE
    44.    
    45.     ; Ожидание завершения потока
    46.     invoke WaitForSingleObject, gUpdateThreadHandle, INFINITE
    47.    
    48.     ; Закрытие хэндла потока
    49.     invoke CloseHandle, gUpdateThreadHandle
    50.    
    51.     ; Закрытие мьютекса
    52.     invoke CloseHandle, gDebugLogMutex
    53.    
    54.     ret
    55. StopDebugLogUpdate endp
    56.  
    57. GetDebugLog proc pDebugLog:PTR DEBUG_LOG
    58.     ; Захват мьютекса
    59.     invoke WaitForSingleObject, gDebugLogMutex, INFINITE
    60.    
    61.     ; Копирование данных
    62.     invoke CopyMemoryInternal, pDebugLog, addr gDebugLog, sizeof DEBUG_LOG
    63.    
    64.     ; Освобождение мьютекса
    65.     invoke ReleaseMutex, gDebugLogMutex
    66.    
    67.     ret
    68. GetDebugLog endp
    69.  
    70. ; ... (остальной код остается без изменений)
    Код (C++):
    1. #include "cblib.h"
    2. #include <iostream>
    3. #include <iomanip>
    4. #include <thread>
    5. #include <atomic>
    6. #include <chrono>
    7.  
    8. std::atomic<bool> g_stopThread(false);
    9. DEBUG_LOG g_latestDebugLog;
    10.  
    11. void UpdateDebugLogThread() {
    12.     while (!g_stopThread) {
    13.         GetDebugLog(&g_latestDebugLog);
    14.         std::this_thread::sleep_for(std::chrono::milliseconds(50));
    15.     }
    16. }
    17.  
    18. void PrintDebugLog(const DEBUG_LOG& debugLog) {
    19.     // ... (код для вывода содержимого DEBUG_LOG)
    20. }
    21.  
    22. bool DetectAnomaly(const DEBUG_LOG& debugLog) {
    23.     // Пример простой проверки на аномалию
    24.     if (debugLog.IsDebuggerPresent || debugLog.SysexitFlags != 0) {
    25.         return true;
    26.     }
    27.     return false;
    28. }
    29.  
    30. int main() {
    31.     // Запуск обновления DEBUG_LOG в DLL
    32.     StartDebugLogUpdate();
    33.  
    34.     // Создание потока для обновления g_latestDebugLog
    35.     std::thread updateThread(UpdateDebugLogThread);
    36.  
    37.     // Основной цикл программы
    38.     int anomalyCounter = 0;
    39.     while (true) {
    40.         if (DetectAnomaly(g_latestDebugLog)) {
    41.             anomalyCounter++;
    42.             std::cout << "Warning: Debug detected! (" << anomalyCounter << " times)" << std::endl;
    43.         }
    44.  
    45.         // Вывод текущего состояния DEBUG_LOG каждые 5 секунд
    46.         if (g_latestDebugLog.UpdateCounter % 50 == 0) {
    47.             PrintDebugLog(g_latestDebugLog);
    48.         }
    49.  
    50.         std::this_thread::sleep_for(std::chrono::milliseconds(100));
    51.  
    52.         // Пример условия выхода из цикла
    53.         if (anomalyCounter > 10) {
    54.             std::cout << "Too many anomalies detected. Exiting." << std::endl;
    55.             break;
    56.         }
    57.     }
    58.  
    59.     // Остановка потока обновления и очистка ресурсов
    60.     g_stopThread = true;
    61.     updateThread.join();
    62.     StopDebugLogUpdate();
    63.  
    64.     return 0;
    65. }
    --- Сообщение объединено, 24 сен 2024 ---
    Вот мультипоточный с реализацией кода выше
     

    Вложения:

    • antik_mt.7z
      Размер файла:
      112,5 КБ
      Просмотров:
      672
  7. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    302
    сорцы рабочей либы + пример как в нативе юзать

    StkTrapResult: 0x00000000
    TrIsDebug: 0x00000000

    это в отладке

    если
    StkTrapResult: 0xc0000353
    TrIsDebug: 0xc0000353
    то не отлаживают
     

    Вложения:

    • adb2.7z
      Размер файла:
      157,5 КБ
      Просмотров:
      655
  8. Ahimov

    Ahimov Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    41
    Привет.

    Это отлаживалось на старом крэклабе и там в конце была проблема с анстабом связанная с планировщиком(сброс кэша для стека и есчо что то).

    GtCall & RtCall - реализация этого. Перед вызовом загружается шифрованный указатель на код возврата и адрес который прочитает ядро, без выборки из юзер. При вызове состояние треда восстанавливается, в частности сбрасывается тф если до вызова небыло трассировки. Сохраненное состояние в юзер не прочитать, вызовы мб рекурсивны(цепь):
    SvMsgBox сохраняет контекст и ключ, возвращая управление. RtMsgBox читает ключ и восстанавливает контекст, передавая управление на шифрованный адрес. SvGetTicks формирует цепь адресов возврата, RtGetTicks возвращает управление проходя цепь.

    Ws* это проверка рабочего набора, если память прочитать(например просмотрев отладчиком) он изменится.

    По антидебагу интересное вот это было, в частности что бы пином не крутили, из того что помню :)
     
  9. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    302
    ну можешь доделать,собирается на masm32v11
     
  10. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    302
    upload_2024-10-16_22-38-36.png
    По CFG: Нелинейный буфер. сохраню для нубисов
    ФайлЧто происходит
    Gp.asm- Подготовка и применение патчей к коду
    - Манипуляции с памятью для создания динамических патчей
    - Модификация потока выполнения программы
    - Использование недокументированных структур NT
    Scan.asm- Инициализация и настройка окружения для сканирования
    - Использование SList для сканирования памяти без генерации исключений
    - Обнаружение отладки через подсчет квантований потока
    - Попытки обхода точек останова на чтение памяти
    - Проверка на наличие строки в памяти (возможно, сигнатуры)
    Swap.asm- Настройка механизма для измерения времени выполнения
    - Использование SList для обнаружения планирования потоков
    - Реализация механизма "swap" для обхода анализа потока выполнения
    - Измерение количества переключений контекста за определенное время
    Self.asm- Использование FPU для определения текущего адреса выполнения
    - Нарушение предполагаемого потока выполнения для обнаружения DBI
    - Манипуляции со стеком для обхода анализа
    - Проверка на возможность доступа к нижней границе стека без его расширения
     

    Вложения:

    • sl.7z
      Размер файла:
      156,9 КБ
      Просмотров:
      661
    alex_dz нравится это.
  11. Ahimov

    Ahimov Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    41
    На скрине неточно, как понял это работает так:

    Код (ASM):
    1. GtCall proc C
    2.     push ebp
    3.     push fs:[TEB.NtTib.ExceptionList]
    4.     push esp   ; s: stack
    5.  
    6. ; NtUserEnumDisplayMonitors(arg1, arg2, *lpfnEnum, s)
    7.  
    8.     Call @f   ; *lpfnEnum
    9. ; lpfnEnum(3args, s):
    10.     mov  esp, DWORD PTR[esp][4*4]   ;  s
    11.     pop  fs:[TEB.NtTib.ExceptionList]
    12.     pop  ebp
    13.     retn   ; return
    14. @@:
    15.     push 0   ; arg1 & 2
    16.     push 0
    17.     %ENVR Eax, Gid   ; GateID" = Service ID.
    18.         %IGATE   ; syscall NtUserEnumDisplayMonitors -> lpfnEnum
    19.  
    20. ; caller -> GtCall -> syscall -> (push STATE) -> lpfnEnum -> ret
    21.  
    22. GtpRet:
    23.     .if Esi   ; fetch?
    24.         add ebx, eax   ; +[k]: read from km.
    25.     .else
    26.         add ebx, fs:[DKEY]   ; +k
    27.     .endif
    28.     %TRT   ; restack
    29.     jmp Ebx  ; go
    30.  
    31. RtCall proc C
    32.     %TST   ; save stack.
    33.     %ENVR Edx, Gsz   ; Narg
    34.     mov ecx, ebx   ; fetch?
    35.     Int 2BH   ; (pop STATE) -> GtpRet
    36.  
    37. %CBR macro K
    38.     mov ebx,K   ; k or *k
    39.     jmp RtCall
    40.  
    41. %CBC macro F
    42.     mov  esi, F   ; fetch?
    43.     Call GtCall
    Там рядом был эксперимент - если тормознуть тред, он остановится не в начале кванта. Значит если исполнять что либо на начале кванта, это не будет видно в отладчике при остановке.
     
    galenkane нравится это.