Приветствую. В мануалах IA по инструкции pop SS сказано что она задерживает прерывания до завершения исполнения следующей инструкции: Это позволяет обнаружить эмуляцию/трансляцию кода статистически и однозначно. Есть ли еще инструкции, которые каким либо образом связаны в их последовательности, подобно popss ?
MaKsIm В чем суть мува не пойму, два потока чтение и запись переменной? Такую связку можно перемещать в памяти произвольно, а значит изменять. Обнаружить изменение переменной не атомарное?
В данном примере никакой. Суть в префиксе lock, а вот команда к префиксу просто неудачная. Вы же спрашивали про действия связки команд. Вот вам два примера связывания команд. Любые условные переходы и lock. Еще можно вспомнить про rep+команда.
Отладчик/транслятор/эмулятор перемещают инструкции или увеличивают их количество(в случае эмуляции). Таким образом если подобрать последовательность инструкций в которой они связаны так, что их перемещение изменяет поведение кода, тогда получится обнаружить отладку. Ветвления используют только контекст и не привязаны к предыдущим инструкциям.
А прикол с pop ss/mov sp(esp),value работает только в реальном или однозадачном режимах. Во всех остальных стеков у каждой задачи 4-е и при возникновении отладочного исключения процессор не трогает стек текущего (отличного от 0-го) уровня привилегий и перепрыгивает по вектору прерывания (при необходимости может выполнить даже переключение аппаратной таски (TSS)) И как вы собрались искать отладчики с этой последовательностью? В DOS это еще реально. А в x86_64 у вас даже ss нету. ADD: Вот что об этом говорит Intel SDM
MaKsIm В защищенном режиме x32, юзермод так же работает. На счет стека в данном случае не важно, вторая инструкция другой может быть. Это сделано для атомарной загрузки ss:esp, если прерывание обрабатывается на том же уровне привилегий(тогда нет переключения стека). IA SDM v2: 8E /r MOV Sreg,r/m16** 64 Valid CM/LM Valid Move r/m16 to segment register. Статистикой по прерываниям. Интересно какие еще есть подобные связки инструкций.
И вот тут то как раз нестыковка. Обработка отладочных исключений происходит в разных задачах (процессах) т.е. каждое такое исключение принудительно транслируется в другой процесс. С другой стороны отладчик может просто заменять инструкцию на int3 и потом просто эмитировать выполнение первой инструкции. Вам проще запустить свой же процесс под отладкой другой вашей программы (или той же, но с другими параметрами) и контролировать состояние этой отладки.
MaKsIm Прерывание это не исключение, про последние речи небыло. Аналогично прерываниям можно подавить отладочное исключение, через cpu.flags.RF, так например происходит сервисный возврат. Проще да, вот только все процессы и отладчик до кучи запустятся под бинарным транслятором/эмулятором, детектить такое не получится через всякие int3 Тут нужен принципиально иной подход.