Введение или зачем это нужно
Точки останова— мощное оружие против защищенных программ и в умелых руках они поражают цель с любого расстояния. Основных режимов стрельбы всего три — останов при чтении, записи и выполнении памяти по заданному адресу. А как быть, если адрес неизвестен, но мы знаем его содержимое? Допустим, нам захотелось установить точку останова на введенный пароль или команду JMP EAX, используемую некоторыми распаковщиками для передачи управления на оригинальную точку входа (она же OEP). Или вот мы хотим брякнуться на последовательность машинных команд: CALL XXX/TEST EAX,EAX/JX, соответствующую следующей конструкции языка высокого уровня: "if (xxx(,,,) == 0)…". Команда CALL $+5 POP REG характерна для защитных механизмов, балующихся с самомодифицирующимся кодом или копирующих себя на стек. Инструкция PUSHFD присутствует в самотрассирующихся программах и антиотладочных защитных механизмах.
Существуют и другие устойчивые шаблоны, то есть предсказуемые последовательности машинных команд, расположенные в окрестностях защитного механизма или даже внутри него самого. Если бы мы только могли устанавливать точку останова на заданную машинную команду, расположенную по произвольному адресу… Но увы, отладчику нужен адрес, который нас интересует не меньше его.
Лишенные аппаратной поддержки со стороны процессора, в общем виде эту задачу мы решить не можем, но и расписываться в собственном бессилии тоже не собираемся. Существует несколько более или менее эффективных методик, дающих вполне удовлетворительный результат, о которых мыщъх и собирается рассказать