sexta-feira, 21 de junho de 2013

Engenharia reversa no Arduino

Procurando uma forma de entender melhor o funcionamento do meu Arduino, procurei saber como fazer a engenharia reversa do código que está sendo enviado para ele. Espero tentar repassar o que eu consegui descobrir para vocês.

Quando um programa é compilado no Arduino IDE, é gerado um arquivo .hex no final do processo de compilação. Esse arquivo é enviado diretamente para o microcontrolador e contém o código de máquina que será executado, sendo portanto, o último artefato da cadeia de compilação. Esse código (que é o foco da minha pesquisa) pode ser transcrito para Assembly, que por sua vez, permite um melhor entendimento do que realmente está acontecendo no processador.

Para transcrever o código, eu usei o avr-objdump, da seguinte forma:

$ avr-objdump -Dm avr Sketch.cpp.hex

Os parâmetros utilizados foram
  • -D para transcrever os opcodes para mnemônicos Assembly (maiúsculo para transcrever todas as seções do programa)
  • -m para definir a arquitetura AVR
A saída desse comando é:

Sketch.cpp.hex:     file format ihex


Disassembly of section .sec1:

00000000 <.sec1>:
       0:    0c 94 a5 00     jmp    0x14a    ;  0x14a
       4:    0c 94 cd 00     jmp    0x19a    ;  0x19a
       8:    0c 94 cd 00     jmp    0x19a    ;  0x19a
       c:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      10:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      14:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      18:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      1c:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      20:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      24:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      28:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      2c:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      30:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      34:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      38:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      3c:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      40:    0c 94 ab 08     jmp    0x1156    ;  0x1156
      44:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      48:    0c 94 98 09     jmp    0x1330    ;  0x1330
      4c:    0c 94 e6 09     jmp    0x13cc    ;  0x13cc
      50:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      54:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      58:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      5c:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      60:    0c 94 ff 02     jmp    0x5fe    ;  0x5fe
      64:    0c 94 cd 00     jmp    0x19a    ;  0x19a
      68:    07 63           ori    r16, 0x37    ; 55
      6a:    42 36           cpi    r20, 0x62    ; 98
      6c:    b7 9b           sbis    0x16, 7    ; 22
      6e:    d8 a7           std    Y+40, r29    ; 0x28
      70:    1a 39           cpi    r17, 0x9A    ; 154
      72:    68 56           subi    r22, 0x68    ; 104
      74:    18 ae           std    Y+56, r1    ; 0x38

 ...

Nesse dump é possível ver o endereço de memória, o opcode com seus parâmetros e o mnemônico com seus parâmetros.

Esses opcodes podem ser obtidos em http://www.atmel.com/Images/doc0856.pdf.

Referência:

Nenhum comentário:

Postar um comentário