Можно ли отлаживать основной файл, созданный исполняемым файлом, скомпилированным без флага gdb?

Можно ли отлаживать основной файл, сгенерированный исполняемым файлом, скомпилированным без флага gdb?

Если да, какие-либо указатели или учебные пособия по нему?


person Hemanth    schedule 02.08.2011    source источник
comment
Что вы имеете в виду под флагом gdb? Вы имеете в виду флаг -g (флаг отладки)   -  person Pradeep    schedule 02.08.2011
comment
Как предполагает ваш один хороший ответ, отладка на уровне сборки - это все, что вы получите таким образом. Это можно сделать, но это непросто, и не будет «учебника». Вам придется выучить язык ассемблера процессора, на котором работает программа.   -  person Omnifarious    schedule 05.08.2011
comment
Может быть полезно знать операционную систему, архитектуру процессора и формат объектного файла, чтобы задать более разумный вопрос. Не могли бы вы предоставить эту информацию?   -  person Jens    schedule 09.08.2011
comment
Если вы не выберете ответ, он будет выбран за вас. :-)   -  person Omnifarious    schedule 12.08.2011


Ответы (3)


Да, ты можешь. Хотя это будет непросто. Я приведу вам пример.

Допустим, у меня есть следующая программа с именем foo.c:

main()
{
    *((char *) 0) = '\0';
}

Соберу и позабочусь, чтобы не было символов:

$ cc foo.c
$ strip a.out
$ file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped

Ладно, пора запускать:

$ ./a.out
Segmentation fault (core dumped)

Упс. Кажется, это ошибка. Запустим отладчик:

$ gdb ./a.out core
[..]
Reading symbols from /tmp/a.out...(no debugging symbols found)...done.
[..]
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0  0x0804839c in ?? ()
(gdb) bt
#0  0x0804839c in ?? ()
#1  0xb7724e37 in __libc_start_main () from /lib/i386-linux-gnu/libc.so.6
#2  0x08048301 in ?? ()

Хм, выглядит плохо. Никаких символов. Можем ли мы выяснить, что произошло?

(gdb) x/i $eip
=> 0x804839c:   movb   $0x0,(%eax)

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

(gdb) p $eax
$1 = 0
(gdb)

Это не удалось, потому что регистр EAX указывает на нулевой адрес памяти, и он попытался сохранить байт по этому адресу. Ой!

К сожалению, у меня нет указателей на хорошие учебники. Поиск по запросу «реверс-инжиниринг gdb» дает несколько ссылок с потенциально полезными фрагментами.

Обновление:

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

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

Кажется, это дубликат этого вопроса:

Основной файл отладки без символов

Там есть дополнительная информация.

person snap    schedule 05.08.2011

Да, вы можете, это то, что делают люди, которые, т. е. пишут крэки, к сожалению, у меня больше нет слайдов и документов курса, который я изучал в университете, но поиск в Google reverse engineering или disassembly tutorials даст вам некоторые отправные точки. Также важно знать, как ориентироваться в ассемблере.

Наш класс был основан на книге, в основном главы 1 и 3, но сейчас вышло новое издание.

Computer Systems: A programmer's perspective by R.E. Bryant and D.R. O'Hallaron

который объясняет основы компьютерных систем, а также дает вам хорошие знания о работе программ в системах.

Также при изучении этого имейте в виду, что 64-битный процессор имеет другой код сборки, чем 32-битный процессор, на всякий случай.

person Xtroce    schedule 11.08.2011

Если программа скомпилирована без флага -g, вы не сможете отладить файл ядра.

В противном случае вы можете сделать так: исполняемый основной файл gdb

Дополнительную информацию можно найти по адресу: http://wwwpub.zih.tu-dresden.de/~mlieber/practical_debugging/04_gdb.pdf

person Pradeep    schedule 02.08.2011
comment
Таким образом, в большинстве клиентских сценариев их исполняемый файл был бы скомпилирован без gdbflag -g, верно? Итак, как мы можем отлаживать дампы ядра, созданные в случае клиентских сценариев? - person Hemanth; 05.08.2011
comment
По сценариям клиентов, я думаю, вы говорите о выпущенной сборке или exe. Так что в этом случае отладка невозможна для дампа ядра, согласно моему опыту. Вы можете подождать лучшего ответа, чтобы я также мог получить пользу :) - person Pradeep; 05.08.2011
comment
По моему опыту, выпускные сборки по-прежнему создаются с параметром -g (даже с оптимизациями, такими как -O3). Это обеспечивает некоторую возможность отладки. Исполняемые файлы копируются в архив. Затем символы извлекаются из исполняемых файлов (включая библиотеки), которые также архивируются. Наконец, версия без символов выпущена в дикую природу. Затем вы можете указать gdb установить исполняемый файл в отлаживаемый исполняемый файл, используя основной файл из исполняемого файла с удаленными символами. Тогда GDB счастлив, и все работает (ну, насколько работает отладка оптимизированного исполняемого файла). - person inetknght; 23.06.2014