Как отладочная сборка облегчает обратный инжиниринг? - PullRequest
8 голосов
/ 07 декабря 2010

В некоторых ответах здесь говорилось, что отладочная информация облегчит обратный инжиниринг программного обеспечения.Когда я использую Visual C ++ и распространяю исполняемый файл с отладочной информацией, но без других файлов (.pdb), будет ли он содержать какие-нибудь интересные вещи?

Я посмотрел на исполняемый файл с помощью шестнадцатеричного редактора и не нашел ничего похожего на имена символовсейчас я предполагаю, что файл .exe просто ссылается на информацию в файлах .pdb, верно?

Знаете ли вы, содержит ли он

  • имен переменных?
  • имена функций / членов?
  • номера строк?
  • что-нибудь интересное?

Ответы [ 5 ]

9 голосов
/ 07 декабря 2010

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

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

Ничто из этого не делает обратное проектирование невозможным. Это просто больше работы, чтобы выявить смысл.

5 голосов
/ 07 декабря 2010

Сборка с отладочной информацией не является отладочной сборкой.

"Отладочная сборка" - это такая сборка, когда определен символ _DEBUG. Если так, есть много строк, полезных для обратного инжиниринга (утверждений и т. Д.).

Таким образом, вы можете сделать Release build с отладочной информацией в .pbd, и декомпилировать программу будет так же сложно, как и без отладочной информации.

2 голосов
/ 07 декабря 2010

Исполняемый файл не должен содержать имен переменных или номеров строк. Он может содержать имена функций / членов для любых таких имен, которые экспортируются (более вероятно для lib / dll, чем для exe).

Структура кода будет "более близко" напоминать исходный исходный код - маловероятно, что код будет встроен, если операторы будут переупорядочены, циклы развернуты и т. Д.

1 голос
/ 16 января 2011

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

Сборка отладки не включает номера строк, имена функций и номера строк, они принадлежат PDB. Однако каждый раз, когда вы используете assert (), код будет содержать строку, содержащую имена файлов и номера строк.

1 голос
/ 07 декабря 2010

Давным-давно отладочная информация была прикреплена к исполняемому файлу (в так называемом формате CodeView). В наши дни в основном это происходит отдельно в файлах PDB. Сам exe действительно содержит только ссылку на PDB.

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

Если вы хотите проверить свои PDB, проверьте DIA2Dump в папке «DIA SDK» в вашей установке Visual Studio.

...