2012-02-16 3 views
2

Есть ли способ обнаружить/инициировать скрещивание записи в строку без использования mprotect (что я не могу использовать)?Определить запись в строку

В настоящее время я могу обнаружить запись только в следующем чтении, но это слишком поздно (следующее чтение может исходить из совершенно другой библиотеки).

Примечание. Использование gdb с точками наблюдения завершилось неудачей из-за того, что оптимизатор перемещает строку в памяти процесса.

Редактировать: переменная, о которой идет речь, является членом класса (char *), который содержит некоторые метаданные в качестве префикса для строки. Строка - это часть, которая должна быть неизменной, а префикс должен быть доступен для записи. У меня есть несколько миллионов этих объектов в статическом статическом хеше, и к ним обращаются практически из любого места в нашем коде.

+1

Как насчет использования точек наблюдения gdb по неоптимизированному коду? –

+0

Поскольку я не могу воспроизвести ошибку на другом компьютере и заменить все файлы libs \ execs на unoptimized, потребуется переустановка ОС (это очень низкоуровневый код). – Neowizard

+0

Не 'watch myString' не зависит от того, где Оптимизатор разместил вашу строку 'myString'? Разве это не головная боль отладчика, чтобы выяснить, где в памяти «myString»? –

ответ

1

Вы можете попробовать обернуть весь код, который пишет в память в макросах препроцессора, которые проверяют адрес, который вы используете, но так как большинство людей любят использовать указатели с пустыми костями (вместо вызовов библиотек, которые инкапсулируют вещи), это будет вероятно, будет много усилий.

Единственный другой вариант - mprotect(2) или GDB, которые используют специальные части процессора для просмотра адресной шины для доступа к соответствующей памяти.

Поскольку вы не можете использовать это, последний вариант заключается в том, чтобы напечатать код на бумаге и сесть в тихом уголке на пару дней, чтобы прочитать его. Обычно это работает, но большинство людей избегают усилий (и потому, что это не похоже на «настоящую» работу ;-).

+0

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

+0

Если это всегда одна и та же строка, которая искажается, тогда код-нарушитель должен каким-то образом получить свой адрес.Это означает, что он не может быть полностью не связан с кодом, который создает/использует строку. –

+1

Правда, это тот же процесс, но это гигантский процесс. В любом случае, мне удалось сузить его до соответствующего потока процессов, и оттуда это был просто вопрос чтения кода с большим вниманием ... тоже меня это выглядело как «реальный» (и в конечном итоге очень эффективный) труд :). – Neowizard

0

Я не уверен, есть ли команда в gdb, похожая на «trace» в dbx, но в dbx я помню, используя команду «trace», которая может использоваться для отслеживания отдельных переменных в коде, и это заставляет вас когда значение переменной изменяется во время выполнения.

+0

'След' не делает то, что вы здесь говорите. Согласно DBX docs-'trace-Have трассировочная информация, напечатанная при выполнении программы'. Фактически, 'stop ' делает это! Ссылаясь на DBX docs -stop-Stop выполнение, когда данная линия достигнута, введена или введена процедура или функция, изменена переменная, загружен или выгружен модуль, или условие true' И 'watch' - ближайший эквивалент' stop' в GDB –

+0

Да, информация о трассировке означает, что она печатает как и когда значение в конкретной переменной изменяется, когда программа находится в процессе выполнения. Стоп может использоваться, если вы хотите, чтобы программа остановилась, как только изменится значение переменной. trace продолжает выполнение печати каждый раз при изменении значения переменной. –

Смежные вопросы