Может ли GDB изменять арифметику памяти?
Что такое "арифметика памяти"?
например, от "jle" (переход меньше или равен) до "jge" (переход больше или равен).
Ваш вопрос чрезвычайно неясен. Я думаю вы спрашиваете: могу ли я изменить программу для выполнения JGE
вместо текущей JLE
инструкции в GDB?
Если это ваш вопрос, ответ - да.
- Найти код операции, который в данный момент используется с командой
disas/r 0x400563,0x400564
.
- Измените код операции на
JGE
с присвоением кода операции инструкции.
Пример:
(gdb) disas/r 0x400496,0x400497
Dump of assembler code from 0x400496 to 0x400497:
0x0000000000400496 <main(int, char**)+15>: 7e 07 jle 0x40049f <main(int, char**)+24>
End of assembler dump.
Код операции 0x7E
. Код операции для JGE
: 0x7D
( таблица ).
Давай исправим. Вы можете сделать это для запущенного процесса:
(gdb) start
(gdb) set *(char*)0x400496 = 0x7d
(gdb) disas/r 0x400496,0x400497
Dump of assembler code from 0x400496 to 0x400497:
0x0000000000400496 <main(int, char**)+15>: 7d 07 jge 0x40049f <main(int, char**)+24>
End of assembler dump.
Или вы можете обновить двоичный файл на диске, но вызывая gdb --write a.out
.