2016-08-10 7 views
0

Так что я недавно изменил часть вредоносного ПО и понял, что могу использовать условную точку останова, которая прерывалась бы всякий раз, когда был установлен флаг нуля для конкретной команды jz. Я прочитал документацию в Интернете и в файле справки, который предоставляет olly, но не может найти примеров того, как я это сделаю. В онлайн-документации говорится, что регистры EFL или Flags могут использоваться в выражении watch/conditional breakpoint, но не упоминается, как обращаться к ним. Я пробовал простое выражение, такое как ZF == 1, а также ZF = 1 (на всякий случай, если я ошибался), и он не работал. Я искал google как сумасшедший и ничего, поэтому я надеюсь, что кто-то там нашел способ ссылаться на регистр флагов. Для тех из вас, кто задается вопросом, почему я не просто использую выражение без регистров флагов, мне более любопытно, как ссылаться на регистр флагов в том случае, когда я действительно нуждаюсь в нем.Ollydbg watch/условное выражение точки останова для регистров флагов?

Заранее благодарен!

ответ

2

AFAIK вы не можете разбить на определенное имя флага для EFLAGS, но вы можете получить значение из EFLAGS, так что вы все еще есть несколько возможностей оттуда:

примечание: проверено на OllyDbg v2.01

1) Разбейте все значение EFLAGS (обратите внимание, что значение регистра EFLAGS для условного синтаксиса ollydbg равно либо EFL, либо FLAGS).

EFL==0x246 

2) перерыв на конкретном флаге

  • Вы должны знать flag position, например, ZF бит 6 (начало отсчета от 0).
  • Либо использовать битовую позицию в качестве маски:

    пример с ZF (бит 6 установлен в 1 является 0x40): (EFL & 0x40)==0x40

  • Сдвиг флаги по своей позиции, маскировать его только и испытание для него :

    пример с ZF (бит 6): (EFL >> 6) & 1==1

+0

Так выглядит версии 1.10 до версии 2.0 не позволяют реферирования на EFL, ни РЕГИСТР FLAGS р. Похоже, что он был добавлен только к версии 2.01. После некоторого тестирования я заметил, что мои часы, использующие регистр EFL и FLAGS, действительно показывали значения, которые я хотел. Как только я попытался создать условные точки останова, я столкнулся с проблемой, что их не ударили, несмотря на то, что регистр EFL был именно тем условием, которое я установил. – John

+0

Я заметил, что для запуска этой условной точки останова мне пришлось добавить нормальную точку останова int3 до условного, чтобы заставить ее запускаться. Не могли бы вы узнать, почему я должен был бы добавить точку останова перед условным? Я нигде не упоминал об этом, и мне показалось странным, что нужно иметь условную точку останова. Большое вам спасибо за то, что он работает с 2.01, поскольку я использовал только v1.10 и v2.0. – John

+0

@John Я проверил его еще раз (все еще на v2.01) и не смог воспроизвести вашу проблему: мой условный BP попал ** без ** любого «обычного» BP до него в моей тестовой программе (попробовал это на Windows 10 * calc.exe *; поместите несколько cond. BP на некоторые JZ и JNZ jcc и запустите программу прямо из точки входа). – Neitsa