Еще один вариант IsDebuggerPresent по RDTSC

Тема в разделе "WASM.WIN32", создана пользователем leo, 7 июл 2006.

  1. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Broken Sword
    > "на дебагер из IDA не действует"
    Ну дык и я говорю, если дебагер просто идет по шагам, не заглядывая далеко вперед, то ес-но все шито-крыто. Разница в том, что Оля дизасмит и анализирует код из загруженного образа, который затем и исполняет\дебажит, а IDA (видимо) берет данные из отдельного образа, а дебажит или эмулит другой

    _BC_
    Ссылка просто для прикола или там можно найти нечто инересное и познавательное ?
    И чего на лбу написать посоветуешь, шоб лучше смотрелось ? :lol:
     
  2. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    Код (Text):
    1. Ticks for access to page
    2. 000080000000000056456881 <- data
    3. 000000000000000056742267 <- code
    4. 000000000000000000003000 <- limit
    5.  
    6. IsDebuggerPresent:   Yes
    Получено после многократного запуска (не под отладчиком)

    Asterix
    зело стремный метод отпределения отладчика
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    masquer
    Не понял, почему при (56 млн. >> 3 тыс.) выдается Yes, а не No ...
    Это мой глюк или твой ?
    PS: И что у тебя за винда интересная, которая при многократных запусках постоянно подгружает данные с диска, а не берет их из файлового кэша

    То, что метод "стремный" (по крайней мере в сырой тестовой реализации) думаю все понимают и поэтому широко улыбаются :)))
     
  4. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    leo
    у тебя показ подписей отключен? ;) Это не к тебе, а к обладателю рекламы в подписи адресовано было.
     
  5. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    Для AMD метод не катит (ибо TIME_STAMP_COUNTER переписывается полностью в отличие от Интела). То есть, остановился, снял текущее значение TSC, проанализировал что надо и сколько надо, перед переходом на следующую - подкорректировал TSC как тебе надо (с учетом вышеприведенных тестов :) )
    Интел в отличие от АМД дает перезаписывать только нижние 32 разряда 64 бит TSC.
     
  6. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    leo
    Не знаю, чей глюк и заметно ли это в моей цитате, вот строка о данных:
    000080000000000056456881 <- data

    Винда хр сп2, проц а64 х2
     
  7. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Под VMWare & Win2000 & Olly:
    ---------------------------
    IsDebuggerPresent by RDTSC
    ---------------------------
    Ticks for access to page
    000000000000000000020783 <- data
    000000000000000000007168 <- code
    oooooooooooooooooooo3000 <- limit

    IsDebuggerPresent: No

    ---------------------------
    OK
    ---------------------------

    А это обычной системе WinXP_SP2:

    ---------------------------
    IsDebuggerPresent by RDTSC
    ---------------------------
    Ticks for access to page

    000000000000000000000686 <- data

    000000000000000000000259 <- code

    oooooooooooooooooooo3000 <- limit



    IsDebuggerPresent: Yes


    ---------------------------
    ОК
    ---------------------------
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    XP sp2 RU
    AMD64 3200+ (Venic)
     
  9. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Все-таки алгоритм дельный - его только надо сделать статистически надежным. Например производить сравнение доступа со страницами, к которым отладчик попросту не протянет щупальца (выделенные во время выполнения, например - спроецированный в память файл).
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    masquer
    Отрицательную разность двух TSC придется считать глюком винды или происками какого-нить FakeRDTSC :) В коде вроде все верно - берется разность 64-битных значений и наличие минуса тут никак не объяснишь. Придется на всякий пожарный делать fabs ;))

    alpet, Asterix
    AMD как всегда рулит !!!
    И с VMWare тоже видимо все ясно

    Вот решил попробовать в качестве опорного значения использовать время чтения из страницы, выделенной VirtualAlloc. Без отладчика время доступа к этой странице и второй странице кода получается примерно одинаковым. Но интересно, что под Олей без плагина HideDebugger время доступа к аллоку стабильно увеличивается примерно в 2 раза (по сравн.с безотладочным), а при включении защиты от IsDebuggerPresent разница сохраняется, но уменьшается до 25% (хотя если просто в самой проге сбросить этот флаг, то остаются те же 2 раза). Выходит, что BeingDebugged каким-то хитрым образом и на выделение страниц физ.памяти влияет
     
  11. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    leo
    Можно как вариант запускать из процесса, дополнительный процесс (или внедрять DLL в чужой процесс), который будет так-же производить бенчмарк, и отдавать результаты по какому-нибудь IPC, для сверки.
    Вряд-ли Olly сможет начать себя отлаживать, если DLL внедрить в нее :)
     
  12. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Уже опробовано в плагине и выдало такие результаты под отладчиком ;))

    ---------------------------
    IsDebuggerPresent by RDTSC
    ---------------------------
    Ticks for access to page

    000000000000000000005260 <- data

    000000000000000000003852 <- code

    oooooooooooooooooooo3000 <- limit



    IsDebuggerPresent: No
     
  14. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    syser палится:
    3000 <- limit
    32392 <- data
    444 <- code

    я б тебе с удовольствием вытесал. еще б 10$ приплатил.
    тебе не пох?
     
  15. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Asterix
    > "Уже опробовано в плагине"
    Насколько я понял, это ты SetProcessWorkingSetSize, предложенный S_T_A_S_'ом, попробовал ? Отлично ;)

    Но видимо в таком случае возможна обратная проверка, т.е. обращение к страницам, которые заведомо должны быть инициализированными - заголовок PE, секция импорта, основная куча, куча LDR. Сегодня проверить не смогу, но завтра обязательно поковыряюсь ;)

    И еще интересный момент: Оля должна каким-то образом отлавливать запись в секцию кода. Скорее всего, при переходе к новой странице кода в окне дизассемблера, она должна проверять флаг модификации страницы (не знаю как это возможно из ring3?) и соответвенно перечитывать и дизасмить измененную страницу. В таком случае можно попробовать в самой проге модифицировать страницу и вызвать SetProcessWorkingSetSize, чтобы сделать ее недействительной. Ну а затем прыгнуть на конец предыдущей страницы, чтобы изменения попали в окно дизасма (это конечно уже получается не так скрытно, но найти применение видимо можно).

    Кстати подобный вариант - установить OEP на конец страницы (без SetProcessWorkingSetSize), я уже попробовал и "скромный" W32Dasm на этот трюк поймался :))) А куда ему деваться, ведь он должен показать последующий код. Видимо и дебагер ИДЫ должен купиться на эту фишку, если конечно это не хитрый эмулятор
     
  16. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Ага, поковыряйся. А то самостоятельно изучать тонкости логики загрузчика лень, проще посмотреть, к каким страницам будут обращения в IsDebuggerPresent'е и закоммитить их после выгрузки всего working set'а ;)

    Вообще, сама идея очень интересная, но применительно к антиотладке толк не очень большой - плохо согласуется с упаковкой\криптовкой секций.
     
  17. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    [offtop]

    Broken Sword
    Во-первых, на всех нормальных форумах реклама в подписи запрещена, во-вторых, это не первый прецедент с твоей стороны. Всё просто.

    Рекомендация написать рекламный слоган про diprotector на лбу и ходить с ним по городу -- тонкий намек на ошибочный выбор целевой аудитории и места размещения для рекламы diprotector'a.

    [/offtop]
     
  18. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    но тут-то не запрещена, или уже есть правила с учетом фич нового форума? У меня лично показ подписей вообще отключен :)

    Насчет целевой аудитории - согласен, тут ее скорее нет, чем она есть :)
     
  19. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Опробовал на AMD 3000+, XP SP0 32/64.
     
  20. BUGOR

    BUGOR New Member

    Публикаций:
    0
    Регистрация:
    14 авг 2005
    Сообщения:
    44
    000000000000000000011389 <- data
    000000000000000000000331 <- code
    oooooooooooooooooooo3000 <- limit
    IsDebuggerPresent: Yes

    Olly:

    000000000000000000000017 <- data
    000000000000000000000705 <- code
    oooooooooooooooooooo3000 <- limit
    IsDebuggerPresent: Yes

    XP SP1
    Duron 950