Является ли каждый адрес строки источника в подробном файле MAP действительным адресом для вставки Int3h? - PullRequest
3 голосов
/ 17 июня 2009

Я пытаюсь создать инструмент покрытия кода, используя Delphi 2007.

Мой общий подход состоит в том, чтобы использовать Win32 Debug API для вставки точек останова для каждой строки исходного кода, а затем удалять точки останова по мере их прохождения - таким образом, я мог бы отслеживать каждую исполняемую строку источника.

Схема моего подхода:

  • разобрать подробный файл MAP (созданный Delphi 2007), чтобы найти все адреса для каждой строки исходного текста (только для сегментов .text)
  • открыть приложение в режиме отладки с помощью вызова API OpenProcess
  • перебирает каждую строку исходного текста и вставляет инструкцию Int3 (один байт $ cc, используя WriteProcessMemory + FlushInstructionCache) по адресу каждой строки
  • продолжить выполнение, и при срабатывании каждой точки останова удалите соответствующую точку останова и пометьте линию как покрытую
  • После того, как каждая точка останова пройдена или программа существует, я генерирую отчет о том, какие строки были охвачены, а какие - не для каждого исходного модуля

Теперь на мой вопрос:

Является ли каждый адрес строки источника в подробном файле MAP действительным адресом для вставки точки останова Int3?

Несмотря на то, что подход был успешным для некоторых простых модулей, я запустил доступ к нарушениям для некоторых более крупных приложений, где нарушенный адрес содержит $ cc - что заставило бы меня думать, что мой подход нуждается в некоторой модификации для работы.

Советы по лучшим подходам также очень приветствуются!

1 Ответ

1 голос
/ 17 июня 2009

Ну, в теории: да. И практично, я думаю, что да тоже. Если Delphi может поставить точку останова на каждой строке, то вы можете: -).

Возможно, вам понадобится определенная обработка для некоторого случая (например: первая строка процедуры - это инициализация локальных переменных, установка EBP и т. Д.). Так вы можете узнать, в каком случае это не удается?

Кстати: хороший проект! Это открытый исходный код?

P.S. если вам нужна некоторая обработка ассемблерного кода: посмотрите koldetours.pas (воспользуйтесь поиском Google).

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