Обратный инжиниринг вашего собственного кода C ++ - PullRequest
4 голосов
/ 30 июня 2011

У меня есть скомпилированная программа, и я хочу знать, существует ли в ней определенная строка.Есть ли способ, используя мой исходный код, я мог бы определить это?

Тони прокомментировал мое сообщение, поэтому я добавлю некоторую информацию:

  1. Я использую компилятор g ++,
  2. Я компилирую код на компьютере Linux (Scientific) / Unix
  3. Я использую только стандартную библиотеку (ничего не загружается из Интернета)
  4. Требуемая строка - либо умножениепо номеру (в подфункции группы while) или распечатывая строку в конкретном случае (оператор if)

Мне это нужно, потому что я провожу несколько симуляций MD, и иногда я нахожу себяв ситуации, когда я не уверен в условиях.

Ответы [ 2 ]

3 голосов
/ 30 июня 2011

objdump - это утилита, которую можно использовать как дизассемблер для просмотра исполняемого файла в виде сборки.
Используйте этокоманда для дизассемблирования двоичного файла,

objdump -Dslx file

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

1 голос
/ 30 июня 2011

Резюме

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

Обсуждение

Желаемой строкой является либо умножение на число (в подфункции группы while), либо печать строки в конкретном случае (оператор if)

Мне это нужно, потому что я провожу несколько симуляций MD, и иногда я оказываюсь в ситуации, когда я не уверен в условиях.

В самом простом случае, когда вы хотите, чтобы во всех симуляциях MD выполнялся последний исходный код, вы можете сравнить временные метки исходных файлов с исполняемым файлом, чтобы убедиться, что вы забыли перекомпилировать, сравнить время начала процесса (например, как указано в списке). ps) со временем создания исполняемого файла.

Если вы намеренно развертываете несколько версий программы и используете только самый последний источник, тогда это становится довольно сложно. Умножение обычно генерирует только одну инструкцию машинного кода ... если у вас нет некоторого понимания контекста, вы вряд ли узнаете, какое умножение является значительным (или если оно отсутствует). Компилятор может генерировать свои собственные умножения, например, для индексирование массива, и иногда может оптимизировать умножения в битовые сдвиги (или ничего, как комментирует Ира), так что это не так просто, как сказать: «Ну, это мое единственное умножение в функции« X »». Если вы печатаете определенную строку, которую легче распознать ... если есть уникальный строковый литерал, вы можете найти его в исполняемом файле (например, puts("Hello") -> strings program | grep Hello, хотя это может привести и к другим совпадениям, и компилятору разрешено многократное использование строковых литеральных последовательностей, так что «Well Hello» может удовлетворить ваши потребности через указатель на «H»). Если задействован новый внешний символ, вы можете увидеть его в выводе nm и т. Д.

Все это говорит (вау) ... ты должен действительно сделать что-то совсем другое. Лучше всего использовать систему контроля версий (например, svn, cvs ...) и настроить ее так, чтобы вы могли что-то сделать, чтобы выяснить, какая ревизия кодовой базы использовалась для создания исполняемого файла - это должно быть FAQ для любой ревизии. система управления.

Если это не удастся, вы можете, например, сделать что-то, чтобы распечатать, какие множители или условия использовала программа, когда она запускалась, записав это в свои журналы. Несмотря на то, что макросы являются хакерскими, вы можете «структурировать» их параметры, чтобы вы могли что-то регистрировать и выполнять, не вводя весь код дважды. Много других вариантов тоже.

Надеюсь, что это поможет ...

...