Como modificar o conteúdo da memória usando GDB?

87

Eu sei que podemos usar vários comandos para acessar e ler a memória: por exemplo, print, p, x ...

Mas como posso alterar o conteúdo da memória em qualquer local específico (durante a depuração no GDB)?

bits
fonte
escreva uma string na memória: stackoverflow.com/questions/19503057/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respostas:

124

O mais fácil é definir uma variável de programa (ver GDB: atribuição ):

(gdb) l
6       {
7           int i;
8           struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10

Ou você pode apenas atualizar a localização arbitrária (gravável) por endereço:

(gdb) set {int}0x83040 = 4

Tem mais. Leia o manual .

Nikolai Fetissov
fonte
4
Eu preciso definir uma variável de programa ANTES de acessar locais de memória arbitrários? Não posso simplesmente executar o segundo comando set imediatamente?
Spidey
também set (str[6]) = 'c'funciona, caso você tenha uma matriz, comochar str[]
xealits
29

Como Nikolai disse, você pode usar o comando gdb 'set' para alterar o valor de uma variável.

Você também pode usar o comando 'set' para alterar os locais da memória. por exemplo. Expandindo o exemplo de Nikolai:

(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

Isso deve funcionar para qualquer ponteiro válido e pode ser convertido para qualquer tipo de dados apropriado.

Andrew Edgecombe
fonte
set {char[100]}(0x00) = ""Limpa 100 bytes de memória no endereço 0x00
davenpcj
16

Expandindo as respostas fornecidas aqui.

Você pode apenas fazer set idx = 1para definir uma variável, mas essa sintaxe não é recomendada porque o nome da variável pode entrar em conflito com um subcomando set. Como exemplo set w=1não seria válido.

Isso significa que você deve preferir a sintaxe: set variable idx = 1ou set var idx = 1.

Por último, mas não menos importante, você pode simplesmente usar seu antigo e confiável comando de impressão, já que ele avalia uma expressão. A única diferença é que ele também imprime o resultado da expressão.

(gdb) p idx = 1
$1 = 1

Você pode ler mais sobre gdb aqui .

João portela
fonte