LINUX.ORG.RU

отладка без отладочной информации

 ,


0

2

Пусть есть сишная либа статическая с отладочной информацией
Собираю с ней программу, также с отладочной, и могу в gdb поставить точку на библиотечную функцию, чтобы посмотреть регистры при её вызове
Теперь удаляю всю информацию (strip ./myprog)
Как можно теперь узнать регистры на входе той функции ?

★★★★★

1. Узнаёшь адрес нужной функции (ели она не экспортирована как символ)
2. ставишь break * 0xXXXXXXXX
3. запускаешь и ждёшь брейк
4. print $esp например или info registers
Я так загруженный в линуксовый процесс dll отлаживал

mittorn ★★★★★ ()
Ответ на: комментарий от mittorn

вот в первом пункте как раз и затык - как его узнать ?

x905 ★★★★★ ()
Ответ на: комментарий от x905

Смотря насколько там серьёзный strip был.
Если функция экспортирована - то достаточно break $funcname
Если есть исходный бинарник с отладкой - посмотреть адрес нём.
Иначе остаётся только реверс-инженеринг, декомпиляция, дизассемблирование - найти в ассемблере адрес функции в библиотеке, в gdb приссумировать его к адресу загрузки и вперёд.

mittorn ★★★★★ ()

А splitdebug какой-нибудь низзя заюзать?

false ★★★★★ ()
Ответ на: комментарий от mittorn

Смотря насколько там серьёзный strip был.

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

x905 ★★★★★ ()
Ответ на: комментарий от x905

для каждого случая индивидуальные. Если например известно, что из функции вызывается какая-то другая, можно попытаться поставить брейк на ней и смотреть в стек.
Ещё может быть полезна конструкция:
print *(void*[64]*)($esp - 4)
Она распечатает окрестность стека в виде массива указателей.
Может оказаться полезной трассировка строковых операций.
Декомпиляторы к сожалению в своём большинстве платные, с достаточно дорогой лицензией. Добавлю, что указатели обычно делятся на 3 группы: 1. указатели на кучу 2. указатели на стековую память 3. указатели на бинарник Зная, где они примерно расположены, можно найти функции. Анализируя листинг дизассемблера можно перечислить все функции в бинарнике по инструкциям call для x86 и bl (с разными флагами) для arm

mittorn ★★★★★ ()
Последнее исправление: mittorn (всего исправлений: 2)
Ответ на: комментарий от false

splitdebug как я понял обеспечивает некую дебуг инфу в сторонних файлах, а в моем случаи её нет совсем (именно его я и пытаюсь понять)

x905 ★★★★★ ()
Ответ на: комментарий от x905

splitdebug как я понял обеспечивает некую дебуг инфу в сторонних файлах, а в моем случаи её нет совсем (именно его я и пытаюсь понять)

А кто стрип сделал?

Ну можно ещё собрать софт, посмотреть на шапку функции, поискать такие же байты в целевом бинарнике.

mv ★★★★★ ()
Ответ на: комментарий от mv

А кто стрип сделал?

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

x905 ★★★★★ ()
Ответ на: комментарий от x905

Тогда твоя задачасводится к поиску иголки в стоге... иголок

mittorn ★★★★★ ()
Ответ на: комментарий от x905

Макрухаме с дампом чего-то из backtrace_symbols(), __builtin_return_address, __builtin_frame_address и dladdr() на входе в блок :) Отладил — отключил, пересобрал :) Или отладочную инфу в отдельном файле objcopy --only-keep-debug a.out a.out.sym. Все равно ж «собираешь программу с»

slackwarrior ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.