Изучите данные в windbg, когда срабатывает точка останова по адресу (ba)

Я хотел бы создать точку останова таким образом, чтобы она создавала еще одну одноразовую точку останова, которая будет «dd» определенного адреса памяти при записи в эту память.

Поэтому, когда точка останова срабатывает, я хотел бы запустить команду вроде:

  ba w4 @ESP+4 /1 ''dd [memory address of this breakpoint]''

Поскольку эта точка останова создается другой точкой останова (и потенциально может вызываться несколько раз), я не могу указать номер точки останова. В противном случае я мог бы использовать псевдорегистр, такой как «$ bp3», чтобы получить адрес памяти точки останова № 3.

У кого-нибудь есть мысли о том, как создать команду точки останова, которая может «дд» адрес памяти точки останова?

Спасибо!


person IFacer    schedule 22.12.2009    source источник


Ответы (2)


вы можете уточнить, чтобы использовать другие псевдорегистры общего назначения: t0..t19

bp your-address "r$t1=your-other-address; ba w4 @$t1 /1 \"dd @$t1;gc\""
person deemok    schedule 22.12.2009
comment
Если точка останова «ваш-адрес» срабатывает дважды (до того, как срабатывает «ваш-другой-адрес»), изменит ли это значение $t1 и приведет ли обе одноразовые точки останова к dd @$t1 на одном и том же адрес? Спасибо!!! - person IFacer; 22.12.2009
comment
В этом случае сведите точки останова к минимуму. Зная, что у вас есть один на «вашем адресе», он также может сбросить все остальные биты в секунду. Используйте что-то вроде 'bc1-10' в его условии (при условии, что 'your-address' находится на bp0!), чтобы избавиться от последних 10 точек останова, которые еще не сработали. - person deemok; 23.12.2009
comment
В качестве альтернативы вы можете установить $t1 в 0 (чтобы убедиться, что ;o) и сбросить его в 0 в одиночном выстреле bp. Затем просто проверьте на 0 (или на другое значение) и создайте новый однократный bp только в том случае, если выполняется определенное условие (например, 0). - person deemok; 23.12.2009

Если вы знаете, что никогда не будет определено более одной «дочерней» точки останова ba, вы можете использовать псевдорегистр @$bpN, установив команду «управляющей» точки останова на:

ba1 w4 /1 @esp+4 "dd @$bp1"

То есть укажите номер точки останова, который должен быть назначен этой новой точке останова, и псевдорегистр для этой точки останова все еще определен в команде точки останова.

Однако, если вы думаете, что управляющая точка останова будет срабатывать несколько раз, и хотите определить несколько точек останова ba, это, очевидно, не сработает, потому что тогда «точка останова 1» будет просто переопределяться каждый раз. Но вы все еще можете это сделать!

Хитрость заключается в том, чтобы команда управляющей точки останова фактически содержала буквальный текст адреса, а не пыталась пройти через псевдорегистр. И вы можете сделать это с текстовыми псевдонимами.

Попробуйте это для контрольной точки останова:

bu @WHATEVER "aS /x ${/v:baaddy} @esp+4; .block{ ba w4 /1 baaddy \"dd baaddy\"; ad ${/v:baaddy} }"

Когда срабатывает контрольная точка останова, происходит следующее:

  • Псевдоним устанавливается для текста "baaddy" с значением вычисления выражения @esp+4.
  • .block гарантирует, что расширение псевдонима произойдет для дальнейшего.
  • Затем интерпретатор псевдонимов расширит все вхождения «baaddy» в блоке, за исключением команды ad (из-за ключа /v).
  • Таким образом, если значение @esp+4 равно 0x1234, команда точки останова доступа буквально становится: ba w4 /1 0x1234 \"dd 0x1234\" со встроенным в нее фактическим адресом.
  • Затем текстовый псевдоним удаляется.

Важно удалить текстовый псевдоним в конце, иначе при следующем срабатывании этой контрольной точки останова расширение псевдонима произойдет перед командой aS, а "baaddy" будет расширено с использованием предыдущего значение. Это также означает, что этот текстовый псевдоним не должен существовать при первой установке управляющей команды точки останова.

person Kurt Hutchinson    schedule 13.10.2014