popss sequence

Тема в разделе "WASM.BEGINNERS", создана пользователем Ahimov, 21 ноя 2024.

  1. Ahimov

    Ahimov Active Member

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

    В мануалах IA по инструкции pop SS сказано что она задерживает прерывания до завершения исполнения следующей инструкции:
    Это позволяет обнаружить эмуляцию/трансляцию кода статистически и однозначно.

    Есть ли еще инструкции, которые каким либо образом связаны в их последовательности, подобно popss ?
     
  2. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    151
    Код (ASM):
    1. cmp EAX, 0
    2. jz @f
    Код (ASM):
    1. lock
    2. mov EAX, [mem]
     
  3. Ahimov

    Ahimov Active Member

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

    В чем суть мува не пойму, два потока чтение и запись переменной?

    Такую связку можно перемещать в памяти произвольно, а значит изменять. Обнаружить изменение переменной не атомарное?
     
  4. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    151
    В данном примере никакой. Суть в префиксе lock, а вот команда к префиксу просто неудачная. Вы же спрашивали про действия связки команд. Вот вам два примера связывания команд.
    Любые условные переходы и lock. Еще можно вспомнить про rep+команда.
     
  5. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    137
    Отладчик/транслятор/эмулятор перемещают инструкции или увеличивают их количество(в случае эмуляции). Таким образом если подобрать последовательность инструкций в которой они связаны так, что их перемещение изменяет поведение кода, тогда получится обнаружить отладку.

    Ветвления используют только контекст и не привязаны к предыдущим инструкциям.
     
  6. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    151
    А прикол с pop ss/mov sp(esp),value работает только в реальном или однозадачном режимах. Во всех остальных стеков у каждой задачи 4-е и при возникновении отладочного исключения процессор не трогает стек текущего (отличного от 0-го) уровня привилегий и перепрыгивает по вектору прерывания (при необходимости может выполнить даже переключение аппаратной таски (TSS))

    И как вы собрались искать отладчики с этой последовательностью? В DOS это еще реально. А в x86_64 у вас даже ss нету.

    ADD: Вот что об этом говорит Intel SDM
     
    Последнее редактирование: 22 ноя 2024
  7. Ahimov

    Ahimov Active Member

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

    В защищенном режиме x32, юзермод так же работает. На счет стека в данном случае не важно, вторая инструкция другой может быть. Это сделано для атомарной загрузки ss:esp, если прерывание обрабатывается на том же уровне привилегий(тогда нет переключения стека).

    IA SDM v2:
    8E /r MOV Sreg,r/m16** 64 Valid CM/LM Valid Move r/m16 to segment register.

    Статистикой по прерываниям. Интересно какие еще есть подобные связки инструкций.
     
  8. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    151
    И вот тут то как раз нестыковка. Обработка отладочных исключений происходит в разных задачах (процессах) т.е. каждое такое исключение принудительно транслируется в другой процесс.

    С другой стороны отладчик может просто заменять инструкцию на int3 и потом просто эмитировать выполнение первой инструкции.
    Вам проще запустить свой же процесс под отладкой другой вашей программы (или той же, но с другими параметрами) и контролировать состояние этой отладки.
     
  9. Ahimov

    Ahimov Active Member

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

    Прерывание это не исключение, про последние речи небыло. Аналогично прерываниям можно подавить отладочное исключение, через cpu.flags.RF, так например происходит сервисный возврат.

    Проще да, вот только все процессы и отладчик до кучи запустятся под бинарным транслятором/эмулятором, детектить такое не получится через всякие int3 :scratch_one-s_head:

    Тут нужен принципиально иной подход.