Как изменить содержимое памяти с помощью GDB?
Я знаю, что мы можем использовать несколько команд для доступа и чтения памяти: например, print, p, x...
Но как я могу изменить содержимое памяти в любом конкретном месте (при отладке в GDB)?
5 ответов
Самым простым является установка программной переменной (см. GDB: назначение):
(gdb) l
6 {
7 int i;
8 struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
Или вы можете просто обновить произвольное (доступное для записи) местоположение по адресу:
(gdb) set {int}0x83040 = 4
Есть еще кое-что. Прочтите руководство.
Как сказал Николай, вы можете использовать команду gdb 'set', чтобы изменить значение переменной.
Вы также можете использовать команду "set", чтобы изменить ячейки памяти. например. Расширяя пример Николая:
(gdb) l
6 {
7 int i;
8 struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
(gdb) p &i
$2 = (int *) 0xbfbb0000
(gdb) set *((int *) 0xbfbb0000) = 20
(gdb) p i
$3 = 20
Это должно работать для любого допустимого указателя и может быть приведено к любому подходящему типу данных.
Расширение на ответы, представленные здесь.
Вы можете просто сделать set idx = 1
устанавливать переменную, но этот синтаксис не рекомендуется, потому что имя переменной может конфликтовать с подкомандой set. В качестве примера set w=1
не будет действительным.
Это означает, что вы должны предпочесть синтаксис: set variable idx = 1
или же set var idx = 1
,
И последнее, но не менее важное: вы можете просто использовать свою верную старую команду печати, так как она вычисляет выражение. Разница лишь в том, что он также печатает результат выражения.
(gdb) p idx = 1
$1 = 1
Вы можете прочитать больше о GDB здесь.
Запись памяти:
(gdb) set *0x20001234 = 0xABABABAB
Чтение памяти:
(gdb) x 0x20001234
0x20001234: 0xabababab
Одна из самых полезных вещей — это прямое изменение значения регистров.
0x000000000800088e <+67>: lea rdi,[rip+0x118] # 0x80009ad
Чтобы изменить значение регистра rdi:
set $rdi = 0x8201010