Не совсем ясен механизм антидебага?

Тема в разделе "WASM.BEGINNERS", создана пользователем neutronion, 14 апр 2010.

  1. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    Привет, форумчане!
    Прохожу урок 37 Нарваховский, но похоже не получается telock так как он пишет в своей статье,
    а именно в этом месте:
    ссылка на урок:
    http://wasm.ru/article.php?article=ollydbg37
    программа здесь:
    http://wasm.ru/pub/23/files/ollydbg36.zip


    Удручает, то что этот брейк не работает в telock(пример). Telock упорно сопротивляется установке бряков, даже тех, которые должны якобы должны работать. Зараза telock, проверяет, чтобы в коде не было бряков.
    Вопрос:
    Как же так получается, я устанавливаю бряк на чтение мемори в Ольке, телок, чтобы определить это дело, должен по идее прочитать эту часть кода, где установлен мой бряк,
    для сравнения на изменения и тут то мой бряк по идее должен всплыть, но он зараза не
    всплывает. Как может быть так? Каков здесь механизм, как лучше посмотреть на него?
     
  2. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    прошу прощения за спам, Нарвахо или переводчик кажется ошибся вместо
    надо:
     
  3. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    И все же вопрос актуален:
    Как код может контролировать свой код, например если у меня установлен бряк в коде на
    чтение или аccess, ведь для того чтобы проверить этот код его необходимо механизму
    защиты прочитать и тут то Олька должна его схватить по-идее за жабры. Или нет?
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    neutronion
    Вы путаете int3, hardware breakpoint и memory breakpoint.
    1) С изменением кода связан только int3 (первый байт инструкции заменяется на 0CCh).
    Обнаружение возможно с помощью чтения области памяти с брэйкпоинтом.
    2) Hardware breakpoint устанавливается с помощью отладочных регистров CPU. Таких брейкпоинтов может быть не более четырёх, и они в отличие от других видов брейкпоинтов локальны для потока, в котором установлены.
    Обнаружение возможно чтением отладочного регистра.
    3) Memory breakpoint помечает страницу недоступной. Соответственно он так же, как и int3, глобален для процесса. Минус этого брейкпоинта в его быстродействии, т.к. он срабатывает каждый раз, когда возникает попытка доступа к странице. После чего отладчик проверяет, относится ли попытка доступа к той части страницы, на которую фактически был поставлен брэйкпоинт.
    Обнаружение возможно чтением атрибутов страницы.

    Как видно, на доступ к памяти (которым в частности является и исполнение кода) можно поставить только 2-й и 3-й типы. При этом такие брэйкпоинты не обнаружимы сравнением содержимого памяти с оригинальным, т.к. оно не меняется.
    int3 срабатывает, как точка останова, только если он исполняется как код, но не при попытке чтения. При попытке чтения программа, разумеется, не будет поймана отладчиком.
     
  5. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    Тогда защитному коду достаточно узнать, что страница стала недоступна по
    3 варианту, и таким образом защита будет знать, что что-то пошло не так и завершить программу.
    Я правильно понимаю?
     
  6. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Memory breakpoint на telock'е срабатывать должен. Hardware breakpoint уже нет, так как в этом упаковщике юзается самотрассировка, примерно так это выглядит:

    Устанавливается хендлер для обработки исключений, затем пробегается следующий код:
    Код (Text):
    1.         int     3               ; попадаем в ранее установленный обработчик
    2.         nop
    3.         mov     eax, eax        
    4. addr3   stc                     ; из обработчика сюда ставится hardware breakpoinе 3 (через DR3 регистр)
    5.         nop
    6.         lea     eax, ds:1234h[ebx*2]
    7. addr2   clc                     ; из обработчика сюда ставится hardware breakpoinе 2 (через DR2 регистр)
    8.         nop
    9.         shr     ebx, 5
    10. addr1   cld                     ; из обработчика сюда ставится hardware breakpoinе 1 (через DR1 регистр)
    11.         nop
    12.         rol     eax, 7
    13. addr0   nop                     ; из обработчика сюда ставится hardware breakpoinе 0 (через DR0 регистр)
    14.         nop
    15.         xor     ebx, ebx        
    16.         div     ebx             ; EXCEPTION_INT_DIVIDE_BY_ZERO
    Обработчик выглядит так:
    Код (Text):
    1. EXCEPTION_DISPOSITION __cdecl _except_handler(  struct _EXCEPTION_RECORD *ExceptionRecord,
    2.                                                 void *EstablisherFrame,
    3.                                                 struct _CONTEXT *ContextRecord,
    4.                                                 void *DispatcherContext )
    5. {
    6.     // skip problem instruction
    7.     ContextRecord->Eip++;
    8.  
    9.     switch ( ExceptionRecord->ExceptionCode )
    10.     {
    11.         case EXCEPTION_INT_DIVIDE_BY_ZERO:
    12.         {
    13.             ContextRecord->Eip++;   // размер div reg равен 2м байтам, так что нужно пропустить еще 1 байт
    14.            
    15.             ContextRecord->Dr0 = 0;
    16.             ContextRecord->Dr1 = 0;
    17.             ContextRecord->Dr2 = 0;
    18.             ContextRecord->Dr3 = 0;
    19.            
    20.             ContextRecord->Dr6 = 0x0FFFF0FF0;   // обнуляем все поля кроме зарезервированных
    21.             ContextRecord->Dr7 = 0xDC00;        // 1101110000000000 - обнуляем все поля кроме зарезервированных
    22.  
    23.             return ExceptionContinueExecution;
    24.         }
    25.         break;
    26.        
    27.         case EXCEPTION_SINGLE_STEP:
    28.         {
    29.             call    skip_next_byte
    30.  
    31.             db    0     // счетчик выполненных DR бряков. Если не равен 4, то нас отлаживают через DR регистры
    32.  
    33. skip_next_byte:                            
    34.             ...
    35.             pop     eax
    36.             inc     byte ptr [eax]  // инкремент счетчика DR бряков
    37.  
    38.             return ExceptionContinueExecution;
    39.         }
    40.         break;
    41.        
    42.         case EXCEPTION_BREAKPOINT:
    43.         {
    44.             ContextRecord->Dr0 = addr0;
    45.             ContextRecord->Dr1 = addr1;
    46.             ContextRecord->Dr2 = addr2;
    47.             ContextRecord->Dr3 = addr3;
    48.  
    49.             ContextRecord->Dr6 = 0x0FFFF0FF0;   // обнуляем все поля кроме зарезервированных
    50.             ContextRecord->Dr7 = 0x155;         // 101010101 - включили 4 локальных точки останова + установили флаг LocalEnable
    51.            
    52.             return ExceptionContinueExecution;
    53.         }
    54.         break;
    55.    
    56.         default:
    57.         break;
    58.     }
    59. }
    Если стоит цель разобраться с механизмом отладки, то telock с выше приведенным разжеванным материалом может этому поспособствовать =]
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    neutronion
    Да. Но telock этого не делает.
     
  8. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    уверяю вас, мемори он write не работает.
    попробуйте сами, адрес где записывается адрес функции GetVersion
    406adc - и попробуйте запустить, ничего не получается.
     
  9. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    естественно до распаковки.