Может ли GDB изменить код сборки работающей программы? - PullRequest
9 голосов
/ 25 июня 2011

Я хочу добавить дополнительную функциональность в /bin/ls.
Поэтому я запустил его на GDB и добавил точку останова в начале.

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

В Windows я легко могу сделать это, например, с помощью olldbg. Как насчет Linux?

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

Спасибо.

Ответы [ 5 ]

15 голосов
/ 25 июня 2011

Вы можете записать двоичный файл в память напрямую, но GDB не имеет встроенного ассемблера по умолчанию, однако вы можете сделать что-то вроде set *(unsigned char*)0x80FFDDEE = 0x90, чтобы изменить мнемонику по этому адресу, например, на NOP.Однако вы можете использовать NASM для написания шелл-кода и использовать perl или python для внедрения его в программу:)

Вам также может понравиться этот маленький файл .gdbinit, чтобы упростить отладку: https://gist.github.com/985474

7 голосов
/ 25 июня 2011

Я бы рекомендовал другой подход: скачайте пакет coreutils и измените исходный код для ls.Если возможно, вы должны получить пакет из репозиториев вашего дистрибутива и применить любые исправления.

3 голосов
/ 06 января 2012

Вот запись в блоге , в которой объясняется, как изменить код во время выполнения как для gdb, так и для Visual Studio.

2 голосов

compile code команда

Представленная в версии 7.9, она позволяет компилировать и вставлять код.Документация: https://sourceware.org/gdb/onlinedocs/gdb/Compiling-and-Injecting-Code.html

Я привел минимальный пример в этом ответе .

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

А представление котла GNU предполагает, что реальная модификация кода может быть добавлена ​​позже как расширение этой функции, см. слайд 30«Исправить и продолжить».

Есть несколько конструкций, которые не работали, как я ожидал, например return, поэтому я спросил, почему: В команде кода компиляции GDB, какие языковые конструкциивести себя точно так, как если бы они присутствовали в оригинальном источнике?

0 голосов
/ 06 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...