Использование GDB без отладочных символов на x86? - PullRequest
15 голосов
/ 26 ноября 2008

Как использовать GDB для отладки программы, у которой нет символов отладки на 32-разрядном процессоре x86? Изучение аргументов функции, локальных переменных, определение указателей было бы полезно знать, как это сделать. На самом деле нет намерения использовать это для реверс-инжиниринга, поскольку мне иногда просто лень устанавливать символы отладки, и было бы здорово узнать, как получить некоторую основную информацию из gdb.

Ответы [ 4 ]

22 голосов
/ 14 июля 2009

Для начала вы можете сделать;

gdb "whatever"
break __libc_start_main
r

, который установит точку останова в коде libc crt0 и позволит вам прерваться перед main, даже если целевой двоичный файл полностью удален

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

Это работает на всех платформах, тот факт, что ваш вопрос о IA-32 / x86 не имеет значения.

7 голосов
/ 26 ноября 2008

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

Если у вас есть источник, будет гораздо проще просто перекомпилировать его.

1 голос
/ 27 ноября 2008

Все, что вы можете сделать, это посмотреть регистры и содержимое стека - вам придется делать все, делая выводы, для чего они используются, как упоминает Дреймон.

0 голосов
/ 06 декабря 2010

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

  • Создание символов отладки с помощью -g

  • В системах, в которых C ++ выполняет разматывание исключений с помощью таблиц (возможно, в наши дни что-нибудь вроде ELF?), Флаг -funwind-tables сообщит ему о необходимости генерировать такие таблицы независимо от языка, и GDB может использовать эти таблицы (по крайней мере, для x86 linux это возможно).

  • Или, если они не пройдены, по крайней мере, убедитесь, что -fomit-frame-pointer не включен

...