Как вы извлекаете информацию о локальной переменной (адрес и тип) из программы Delphi или отладочной информации, генерируемой компилятором?

Моя цель:

  • Учитывая приостановленный поток в скомпилированной Delphi 32- или 64-разрядной программе Windows, для обхода стека (выполнимо)
  • Данные записи стека для перечисления локальных переменных в каждом методе и их значений. То есть, по крайней мере, найдите их адрес и тип (целое число 32/64 /подписанный /без знака, строка, число с плавающей точкой, запись, класс ...), комбинация которых может использоваться для поиска их значения.

Первое - хорошо, и второе, о чем этот вопрос. На высоком уровне, как вы перечисляете локальные переменные с учетом записи в стеке в Delphi?


На низком уровне это то, что я расследовал:

RTTI: не перечисляет такую ​​информацию о методах. Это не было чем-то, что я действительно когда-либо считал реалистичным, но все равно перечислял здесь.

Отладочная информация: загрузка отладочной информации, созданной для отладочной сборки.

  • Файлы карт: даже файл подробной карты (файл в текстовом формате! Откройте его и посмотрите) не содержит информации о локальной переменной. Это в основном список адресов и номеров строк исходного файла. Отлично подходит для адресации к файлу и корреляции строк, например, синие точки в желобе; не подходит для более подробной информации
  • Информация об удаленной отладке (файл RSM) - нет известной информации о ее содержимом или формат.
  • Файлы TD32 /TDS: моя текущая линия исследований. Они содержат глобальные и локальные символы среди множества другой информации.

Проблемы, с которыми я здесь сталкиваюсь:

  • Нет документации о формате файла TD32 (которую я могу найти.)
  • Большая часть моих знаний о них основана на коде JCL Jedi, использующем их (JclTD32.pas), и я не уверен, как использовать этот код или достаточно ли там структуры для отображения локальных переменных. Я почти уверен, что он будет обрабатывать глобальные символы, но я очень не уверен насчет локальных. Существует большое разнообразие заданных констант и без документации для формата, чтобы прочитать, что они значат, я угадаю. Однако эти константы и их имена должны быть откуда-то.
  • Источник, который я могу найти с помощью информации TDS , не загружает и не обрабатывает локальные символы.

Если это правильный подход, тогда возникает вопрос: «Есть ли документация для формата файла TDS /TD32, и есть ли примеры кода, которые загружают локальные переменные?»

Пример кода не является обязательным, но может быть очень полезным, даже если он очень минимален.

104 голоса | спросил David M 1 Maypm15 2015, 19:17:27

1 ответ


0

Проверьте, не было ли каких-либо символов отладки в двоичном виде. Также возможно использование GDB (в Windows порт Это). Было бы здорово, если бы вы нашли .dbg или .dSYM файл. Они содержат исходный код, например.

gdb> list foo
56 void foo()
57 {
58  bar();
59  sighandler_t fnc = signal(SIGHUP, SIG_IGN);
60  raise(SIGHUP);
61  signal(SIGHUP, fnc);
62  baz(fnc);
63 }

Если у вас нет файлов для отладки, вы можете попробовать получить MinGW или Cygwin и использовать nm (1) ( справочная страница ). Он будет читать имена символов из двоичного файла. Они могут содержать некоторые типы, такие как C ++:

int abc::def::Ghi::jkl(const std::string, int, const void*)

Не забудьте добавить параметр --demangle, иначе вы получите что-то вроде:

__ZN11MRasterFont21getRasterForCharacterEh

вместо:

MRasterFont::getRasterForCharacter(unsigned char)
ответил Top Sekret 4 32015vEurope/Moscow11bEurope/MoscowWed, 04 Nov 2015 04:51:50 +0300 2015, 04:51:50

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132