x86: возможно ли выполнить отладку, когда в стек помещается определенный указатель на строку? - PullRequest
1 голос
/ 19 декабря 2008

Я отлаживаю стороннюю DLL, для которой у меня нет исходного кода. Эта DLL поддерживает пул строк. Я хочу отловить самое раннее вхождение, когда одна из этих строк передается в функцию ... любую функцию вообще ...

Другими словами, я хочу определить, когда указатель на строку с нулевым символом в конце, имеющей определенный формат, помещается в стек ... кем-либо, и я хочу выполнить Отладочный разрыв, когда это происходит .

Я знаю, что вы можете установить точку останова "break-on-access", которая будет срабатывать, когда процессор читает / записывает / выполняет определенный адрес. То, что я хочу, похоже на это: для каждой строки, помещенной в стек, я хочу проверить ее на соответствие определенному формату и, если она совпадает, выполнить разрыв.

Использование WinDbg, OllyDb, VS2008, что угодно ... какие-нибудь идеи?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 19 декабря 2008

Я бы сказал, что это невозможно с вашими требованиями:

Я хочу определить, когда указатель на строку с нулевым символом в конце имеет определенный формат

Как и в предыдущем ответе, вы сможете сопоставить свою строку с чем угодно, когда ваши точки останова достигнут

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

Итак, вам нужно определить, когда какая-либо функция вызывается с определенным параметром указателя в стеке - это «невозможная» часть. В теории есть несколько способов сделать это, но они должны быть медленными и сложными ... А что, если функция получает указатель на указатель, значение которого вы отслеживаете, или массив, содержащий этот указатель ...

Чего вы пытаетесь достичь? Зачем вам нужно место, где строка сначала передается в функцию? Чаще всего важно использовать строку, и, как вы знаете, вы можете разбить ее с помощью простой точки останова доступа к памяти (если строка копируется, добавьте еще одну точку останова).

Я бы порекомендовал вам использовать другой подход, использовать дизассемблер и провести более статический анализ с небольшой отладкой, чтобы получить то, что вам нужно ...

1 голос
/ 19 декабря 2008

С WinDBG, прочитайте эту статью

...