х86:Можно ли прервать отладку, когда определенный указатель на строку помещается в стек?

StackOverflow https://stackoverflow.com/questions/380798

Вопрос

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

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

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

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

Спасибо!

Это было полезно?

Решение

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top