Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
Hardware Hacking Cheatsheet — Hardware Hacking Cheatsheet | Kitploit
Ferramentas/GitLabGitLab/myasnik/hardware-hacking-cheatsheet
Embedded Systems SecurityIoT SecurityHardware SecurityLearning & EducationCurated ResourcesFirmware Analysis
GitLabmyasnik/hardware-hacking-cheatsheet

Hardware Hacking Cheatsheet

Hardware Hacking Cheatsheet

Ver Repositório
2há 5 anosAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Folha de Dicas de Hardware Hacking

[[TOC]]

Aviso Legal

  • Sou um noob tentando aprender esse tipo de coisa, então talvez algo possa não estar 100% correto
  • Desculpe pelo mau inglês

Notas

  • Siga a metodologia do caminho mais fácil primeiro
  • Às vezes você precisará soldar coisas; aqui um guia rápido e simples de como fazer
    • Você pode precisar soldar fios diretamente em vias da PCB (vídeo)
      1. Risque a superfície da PCB usando um cortador até ver o brilho sob a máscara de solda
      2. Risque novamente a superfície usando lápis de fibra de vidro
      3. Limpe a superfície com um pouco de IPA e um cotonete
      4. Aplique um pouco de fluxo
      5. Estanhe o fio e solde
    • Notas
      • Sempre estanhe a ponta do seu ferro de solda
      • Temperatura: 250-350 C
      • Não toque na PCB com as mãos

Coleta de informações e primeira interação

  1. Olhe o rótulo na parte de trás do dispositivo e encontre
    • Nome do modelo
    • Número de série
    • A empresa que marcou o dispositivo (pode não ser a que o construiu)
  2. Pesquise na internet usando as informações recém-coletadas
    • Melhores sites contendo informações
      • TechInfoDepot
      • OpenWRT
    • Pesquise por ..., isso geralmente leva a muitas informações
      • FCC ID (site de referência)
      • Nome do SOC
      • Nome e quantidade do chip de flash
      • Nome e quantidade do chip de RAM
      • Outras possíveis fontes de informação
  3. Abra o dispositivo
    • Procure tutoriais sobre como abrir o dispositivo
    • Alguns dispositivos podem ser colados para impedir a abertura, seja gentil
    • Às vezes há dissipadores de calor que cobrem parte do circuito; se possível, remova-os
  4. Identifique os componentes
    • Para tornar os nomes dos circuitos mais legíveis
      • Use algodão + álcool; quando o álcool secar, cubra o circuito com giz e depois limpe-o; agora o nome do circuito deve estar legível
      • Use uma lupa
    • Pesquise informações e datasheets na internet sobre esses componentes; se nada for encontrado, tente em mecanismos de busca chineses
      • Baidu
      • Sogou
      • Haosou
    • IMPORTANTE: encontrar um componente que tenha VCC e GND bem expostos é muito útil
  5. Localize a interface UART: mais ou menos um TTY
    • Pesquise na internet
    • Pesquise na PCB por GND, IN ou RX, OUT ou TX e VCC
    • Procure por 3/4 pinos na PCB
      1. Encontre uma referência a GND
        • Usando componentes encontrados anteriormente
        • Geralmente placas de metal estão em GND
      2. Encontre uma referência a VCC
        • Usando componentes encontrados anteriormente
        • Procure por capacitores, eles geralmente têm um ponto em VCC
      3. Teste os pinos candidatos a UART preenchendo a tabela abaixo (os itens são, respectivamente, cada coluna da tabela)
        1. Teste a resistência dos pinos UART em relação a GND (multímetro na medição de resistência, geralmente )
  6. Conecte via UART: use um adaptador serial (UART -> USB) para conectar à placa através de um computador
    • Adaptador serial escolhido: FT232H + Focaccia Board
    1. Escolha a tensão apropriada (3.3V ou 5V), caso contrário a placa ou o adaptador serial será danificado
    2. Conecte o RX da placa ao TX do adaptador e o TX da placa ao RX do adaptador
      • NOTA: geralmente não é necessário conectar o pino VCC
    3. Conecte o adaptador ao computador
      1. sudo lsusb para localizar o adaptador
      2. ls -lart /dev para localizar todos os arquivos de dispositivo; o nosso deve ser um dos últimos, geralmente ttyUSB0
      3. Para acessar este dispositivo, precisamos fazer parte do grupo dialout (ou ser ); para verificar nossos grupos, use
  7. Localize a interface JTAG
    • O que é JTAG: a interface JTAG oferece aos fabricantes uma maneira de testar as conexões físicas entre pinos de um chip. Quando engenheiros eletricistas falam em usar JTAG para "depurar" um chip, estão falando de algo muito diferente da depuração de software tradicional. Eles estão falando de garantir que o pino A do chip A esteja fisicamente conectado ao pino B do chip B, e que todos esses pinos estejam funcionando corretamente. Como o JTAG dá acesso direto ao hardware de um dispositivo, também é uma ferramenta fantástica para pesquisa de segurança.
    • Propriedades do JTAG
      • Controlabilidade: definir bits internos para 0 ou 1
      • Observabilidade: verificar o valor dos bits internos
      • ...portanto, ler/gravar EEPROM
      • Depuração em circuito: depurar código no circuito (usando, por exemplo, OpenOCD e GDB)
    • Pesquise na internet
    • Pesquise na PCB por TCK, TDI, TDO, TMS e TRST (opcional)
      • TCK (Test Clock): o baterista, ou metrônomo, que dita a velocidade do controlador. A tensão neste pino simplesmente pulsa para cima e para baixo em uma batida rítmica e constante. A cada "batida" do clock, o controlador executa uma única ação.
      • TMS (Test Mode Select): as tensões no pino Mode Select controlam qual ação o JTAG executa. Ao manipular a tensão neste pino, você diz ao JTAG o que deseja que ele faça.
  8. Conecte via JTAG: use um "adaptador serial" (JTAG -> USB) para conectar à placa através de um computador
    • "Adaptador serial" escolhido: FT232H + Focaccia Board
    1. Escolha a tensão adequada (3.3V ou 5V), caso contrário a placa ou o adaptador serial serão danificados
    2. Usando o pinout JTAG encontrado anteriormente, conecte tudo
    3. Mantenha a conexão UART aberta (como explicado antes) para interagir com o dispositivo e observar como ele se comporta
    4. Execute o OpenOCD
      • Primeira janela (servidor OpenOCD): openocd -f $FT232HCONFIGFILE -f $BOARDCONFIGFILE
        • $FT232HCONFIGFILE: referência da placa Focaccia
        • $BOARDCONFIGFILE: arquivo de configuração da placa que você está hackeando (útil, mas talvez você não o tenha; opcional)
          • Notas
            • Os arquivos de configuração estão dentro de /usr/local, talvez aqui você possa encontrar algum $BOARDCONFIGFILE útil
            • Caso contrário, você pode pesquisar na internet
            • Caso contrário, você pode escrevê-lo você mesmo
            • TODO (escrever você mesmo)
      • Segunda janela (cliente OpenOCD):
  9. Obtenha o firmware e o sistema de arquivos
    • Possibilidades (firmware e sistema de arquivos podem estar criptografados)
      • Baixá-lo do site do fabricante
      • Se apenas o dispositivo puder baixar o firmware (por meio de uma atualização), fareje a rede usando o wireshark para coletar informações
      • Ler a EEPROM diretamente usando um programador de chip flash e uma garra de teste
      • Comando de dump do bootloader
        1. Analise o log de boot impresso na interface UART
          • Informações que podem ser impressas e que nos interessam (os valores são exemplos, mas explicam o que estamos procurando)
            • Informações gerais do bootloader
              • Procure pelo nome e versão do bootloader (ex.: U-Boot 1.1.3)
            • Informações do SOC
              • Informações adicionais das placas (wifi, ethernet...), elas podem ter seu próprio bootloader
              • Modelo do SOC (ex.: ASIC MT7621A...)
              • Frequência da CPU
            • Informações de RAM
              • mtd->writesize=2048: tamanho da página (bytes)
              • mtd->oobsize=64: dados usados para correção de erros (bytes)
              • devinfo.iowidth=8: dados gravados/lidos por operação (bytes)
              • Quantidade de RAM
            • Informações da EEPROM
              • mtd->erasesize=131072: gravações restantes da EEPROM? (mais ou menos)
            • Informações do kernel do SO
              • Procure por informações de carregamento do bootloader; aqui você pode encontrar informações sobre o sistema de arquivos
              • Procure pela versão do buildroot; isso nos ajudará a emular o circuito e fazer vários testes

TODO SPI DUMP

TODO GDB ATTACH????

Engenharia reversa

  1. Tipo de processo init e arquivos de configuração
    • Tipos
      • Estilo BSD
        • Começa executando scripts em
          • /etc/rc
          • /etc/rc.local
        • Mais recente
          • Veja em /etc/rc.conf para informações
          • Executa /etc/rc.d/
      • System V (mais popular)
        • BusyBox é iniciado
        • Os arquivos de configuração estão em /etc/inittab
          • runlevel
            • 1: modo usuário único, shell root, sem senha, nenhum daemon em execução
            • 3: modo multiusuário baseado em texto, prompt de login
            • 5: login gráfico
          • Depois há uma lista de ações executadas no init
        • Executa /etc/init.d/
      • Systemd (não usado em embarcados)
    • Como identificar
      • Impresso no boot
      • Analise /sbin/init procurando por informações (acima) que identifiquem os tipos

Ambiente de emulação

  • Requisitos
    • Conhecer a arquitetura da CPU do arquivo binário
      • Trivial usando o comando file
    • O QEMU deve suportar essa arquitetura
  • Emulação QEMU (modos)
    • Modo sistema: emular o sistema inteiro
      • Como fazer
        1. Localize o formato do executável do QEMU: qemu-system-$PROCESSOR$ARCHITECTURE

          • Exemplo: qemu-system-mipsel
        2. Se você conhece a família do processador, pode especificá-la para ajudar o QEMU a emular melhor o ambiente

          • Para obter uma lista de famílias suportadas: $QEMUBIN -cpu help
          • É sempre melhor começar com uma família de CPU genérica; depois, se algo não funcionar, tente se aprofundar e usar famílias de CPU específicas
        3. Precisamos do kernel e do sistema de arquivos raiz

          • Notas
            • O kernel do dispositivo não é bom por falta de drivers
            • Não há padronização no mundo IoT
              • Use a device tree do kernel: arquivo de texto que define os drivers da placa
                • O kernel, ao inicializar, carregará esse arquivo e adaptará os drivers genéricos à placa em uso
                • Não é muito usado
            • Então.. reconstrua o kernel e o sistema de arquivos
          1. Encontre a versão do kernel, a versão da libc e a lista de bibliotecas usadas pelo executável que nos interessa (readelf -d $EXECUTABLE)

            • Formato da versão da biblioteca: ( é a versão)

Fontes, créditos e agradecimentos

  • Agradecimentos a Valerio Di Giampietro (@valerio) pelo seu incrível canal de tutoriais no YouTube sobre hardware hacking; tudo o que está escrito aqui foi, no máximo, retirado desses vídeos.
  • Agradecimentos a Luca Bongiorni (@LucaBongiorni) pelos seus valiosos conselhos e ferramentas de hardware.
  • Agradecimentos a mightyohm.com pelas HQs de soldagem
  • Agradecimentos à comunidade hardwarehacking do Reddit por me ajudar
    • [Noob] Soldagem direta de PCB (talvez?)
  • Agradecimentos a Andrew Paul pelo tutorial de soldagem de vias
  • Manual do Buildroot
  • JTAG explicado
  • OpenOCD - Comandos de Flash
  • Informações sobre OpenOCD + JTAG
  • Hardware hacking cheatheet - Pequeno PDF
  • OpenOCD
Baixar ferramenta
200k
  • Teste a resistência dos pinos UART em relação a VCC (multímetro na medição de resistência, geralmente 200kOhm)
  • Ligue o dispositivo e teste a tensão dos pinos UART em relação a GND (multímetro na medição de tensão, geralmente 20V)
  • Ligue o dispositivo e DURANTE A INICIALIZAÇÃO teste a tensão do pino UART suspeito de ser TX em relação a GND (multímetro na medição de tensão, geralmente 20V); se a tensão estiver oscilando, então este pino é provavelmente TX (porque está enviando dados)
  • Ligue o dispositivo e DURANTE A INICIALIZAÇÃO teste a tensão do pino UART suspeito de ser RX em relação a GND (multímetro na medição de tensão, geralmente 20V); se a tensão estiver presa em 0, então este pino é provavelmente RX (porque está esperando receber dados)
    • Tabela

      PINResistência a GNDResistência a VCCVNotas
      1
      2
      3
      4
      • Exemplo

  • Use o Jtagulator
    1. Conecte-o ao computador (baud rate: 115200)
    2. IMPORTANTE: H é a função que imprime a ajuda, use-a em qualquer lugar
    3. Conecte o GND da placa ao GND do Jtagulator, os pinos 1,2,3 da placa aos canais 1,2,3 do Jtagulator
    4. V: define a tensão de trabalho
    5. U: entra no menu de identificação UART
    6. U: inicia a identificação
    7. Text string to output: default
    8. Starting channel: canal onde colocamos o pino 1 da placa
    9. Ending channel: canal onde colocamos o pino 3 da placa
    10. Ignore non-printable characters: Yes
    11. Pronto!
  • TODO: - Usar BurtleinaBoard + Busside
  • root
    groups $USER
  • screen /dev/ttyUSB0 $BAUDRATE para se conectar ao TTY
    • $BAUDRATE pode ser um dos encontrados aqui
    • $BAUDRATE mais comuns
      • 115200
      • 9600
      • 57600
      • 38400
      • 19200
    • IMPORTANTE: se errarmos o $BAUDRATE, podemos ver caracteres estranhos ou até NADA
    • ctrl + a -> k -> y: fechar o screen
    • Se o pino RX parecer não funcionar (você digita e pressiona enter, mas nada acontece), pode ser que o valor de "return" esteja errado: \r\n ou \n?
      • Para resolver isso, use pyserial, a biblioteca do python para comunicação serial, exemplo:
        root@kitploit:~
        #!/usr/bin/env python3
        
        import serial
        
        ser = serial.Serial('/dev/ttyUSB0', 115200, tmieout = 0.1)
        ser.write(b"HELLO\r\n")
        ser.write(b"HELLO\n")
        
      • Se o problema persistir, use um analisador lógico (aqui um barato)
  • TDI (Test Data-In): o pino que alimenta dados no chip. O padrão JTAG não define protocolos para comunicação por este pino. Isso fica a cargo do fabricante. No que diz respeito ao JTAG, este pino é simplesmente um método de entrada para 1s e 0s entrarem no chip. O que o chip faz com eles é irrelevante para o JTAG.
  • TDO (Test Data-Out): o pino para dados que saem do chip. Assim como o pino Data-In, os protocolos de comunicação não são definidos pelo JTAG.
  • TRST (Test Reset, opcional): este sinal é usado para redefinir o JTAG para um estado bom conhecido.
  • Procure por uma fileira de 5/6 pinos ou uma fileira dupla de 10, 12, 14, 20 pinos na PCB
    1. Encontre uma referência a GND
      • Usando componentes encontrados anteriormente
      • Geralmente placas de metal estão em GND
    2. Encontre uma referência a VCC
      • Usando componentes encontrados anteriormente
      • Procure por capacitores, eles geralmente têm um ponto em VCC
    3. Teste os pinos candidatos a JTAG preenchendo a tabela abaixo (os itens são, respectivamente, cada coluna da tabela)
      1. Teste a resistência dos pinos JTAG em relação a GND (multímetro na medição de resistência, geralmente 200k)
      2. Teste a resistência dos pinos JTAG em relação a VCC (multímetro na medição de resistência, geralmente 200kOhm)
      3. Ligue o dispositivo e teste a tensão dos pinos JTAG em relação a GND (multímetro na medição de tensão, geralmente 20V)
      • Tabela

    4. Compare os valores encontrados com os pinouts JTAG mais usados, disponíveis em jtagtest
  • Use o Jtagulator
    1. Conecte-o ao computador (baud rate: 115200)
    2. IMPORTANTE: H é a função que imprime ajuda, use-a em todo lugar
    3. Conecte o GND da placa ao GND do Jtagulator, os pinos 1,2,3... da placa aos canais 1,2,3... do Jtagulator
    4. V: define a tensão de trabalho
    5. J: entra no menu de identificação JTAG
    6. Lá temos duas opções
      • I: identificar com varredura IDCODE, não encontrará TDI (rápido), melhor se eu tiver muitos pinos para identificar
      • B: identificar com varredura BYPASS, encontrará TDI (lento), melhor se eu tiver menos pinos para identificar
    7. Starting channel: canal onde colocamos o pino 1 da placa
    8. Ending channel: canal onde colocamos o pino n da placa
    9. Already known pins: Não, mas poderia acelerar o processo se já soubermos alguns pinos
    10. Inicie e espere.. Pronto!
  • TODO: - Usar BurtleinaBoard + Busside
  • IMPORTANTE
    • O JTAG pode ter sido desabilitado (hardware, remoção de um resistor), então é possível que o que você encontrar com o multímetro e o Jtagulator não seja consistente; podemos resolver isso colocando um resistor de cerca de 300Ohm ou 1kOhm entre esse pino e o VCC
    • O JTAG pode ter sido desabilitado (hardware, remoção de um resistor); esse problema pode ser resolvido recolocando esse resistor ou fazendo uma conexão direta curto-circuitando os pads do resistor
    • O JTAG pode ter sido desabilitado (software, definindo alguns valores)
    • O JTAG pode ter sido desabilitado (hardware, queimando um fusível... nesse caso não há esperança)
  • telnet localhost 4444
    • Comandos úteis
      • halt: pausa a CPU (como congelar)
        • DEVE SER FEITO ANTES DE CADA OPERAÇÃO DE DEBUG
      • reset: reinicia a CPU
      • reg: lê os registradores da CPU
      • flash info bank $BANKID ou flash info $BANKID: imprime informações sobre o banco de memória flash $BANKID (acho que bancos = pedaço de memória)
      • flash list: recupera uma lista de arrays associativos para cada dispositivo declarado usando flash bank (em $BOARDCONFIGFILE), numerados a partir de zero
      • flash banks: imprime um resumo de uma linha para cada dispositivo declarado usando flash bank (em $BOARDCONFIGFILE), numerados a partir de zero
      • flash write_image erase "$BINTOWRITE" $ADDRTOSTART: grava na memória flash
        • $BINTOWRITE: pode ser bin (binário), ihex (Intel hex), elf (arquivo ELF), s19 (Motorola s19), mem...
        • $ADDRTOSTART: endereço onde começar a escrever (acho que o padrão é 0)
      • flash dump_image $OUTFILE $ADDRTOSTART $SIZETODUMP: despeja a memória
        • $OUTFILE: arquivo binário onde salvar o dump
        • $ADDRTOSTART: endereço onde começar a ler (acho que o padrão é 0)
        • $SIZETODUMP: número de bytes para despejar
    • Mais aqui:
      • OpenOCD PDF
      • OpenOCD HTML
    • TODO
  • Informações do sistema de arquivos
    • Procure por informações de carregamento do bootloader e pelo processo de inicialização do SO; aqui você pode encontrar informações sobre o sistema de arquivos
  • Partições da EEPROM
    • Procure pelo processo de inicialização do SO; aqui você pode encontrar informações sobre as partições da EEPROM, seus nomes, pontos de montagem e tamanho na RAM
    • Se você vir partições duplicadas, provavelmente é para atualizações de firmware; você pode imaginar o porquê
  • Informações do processo init
    • Procure por init started ou algo parecido; isso provavelmente estará perto da string BusyBox ou algo análogo
  • O bootloader tem CLI?
    • Procure pelo menu do bootloader; provavelmente aqui podemos encontrar a resposta para essa pergunta
  • Tente obter um shell do bootloader (automaticamente ou por meio de um menu impresso via UART)
  • Explore o shell do bootloader
    • O comando help é seu amigo
    • Tente encontrar uma maneira de despejar o conteúdo da memória; Python é seu amigo
    • Dados OOB (correção de código de erro) não são tão úteis para despejar
  • Análise dos dados despejados
    • Use binwalk, file e hexdump -C para verificar se o arquivo despejado está ok ou não e se está compactado ou criptografado
      • Com binwalk -E analisamos a entropia do arquivo
        • Entropia PRÓXIMA de 1: arquivo aleatório, compactado ou criptografado
        • Entropia ABAIXO de 1: executável ou arquivo normal
    • Use binwalk -e para extrair segmentos identificáveis do arquivo
  • Se o binwalk não entender completamente a imagem despejada, podemos usar a tabela de partições da EEPROM (se encontrada anteriormente) para dividir manualmente a imagem despejada em várias imagens úteis
    • dd if=$IN_DUMPED_IMAGE of=$OUT_FILE bs=1024 skip=$BYTES_TO_SKIP_FROM_THE_START count=$HOW_MANY_BYTES_TO_WRITE
    • sha1sum, md5sum ou binwalk -W -i para comparar imagens (se, por exemplo, acharmos que podem ser a mesma imagem)
  • A última operação pode ser executada várias vezes, dependendo do que a imagem despejada contém; se, por exemplo, tivermos a imagem do kernel, podemos extrair seus componentes novamente com binwalk (ou dd, se pudermos encontrar online como nossa imagem de kernel específica é estruturada) para ler o sistema de arquivos raiz
  • Extraia o sistema de arquivos
    • Exemplo de comando (baseado no tipo de sistema de arquivos): fakeroot -s fakeroot.dat usquashfs -d squashfs-root u04-sqfs.dat
      • fakeroot: cria um ambiente root falso, útil para emular permissões de arquivo, device files...
        • -s fakeroot.dat: salva o ambiente root falso para restaurar depois com o comando fakeroot -i fakeroot.dat bash
      • usquashfs: extrai o sistema de arquivos squashfs (pode ser diferente no seu caso)
        • -d squashfs-root: pasta de destino
        • u04-sqfs.dat: imagem do sistema de arquivos a extrair
  • Binários e scripts interessantes
    • Procure por arquivos interessantes iniciados pelo processo init e, em geral, não pare nos nomes; analise em profundidade qual binário está sendo executado e analise-os; os mais interessantes são os não padronizados
    • Procure pela string factory mode; se conseguirmos colocar o dispositivo no modo de fábrica (se existir), hackeá-lo fica muito mais fácil
    • Comandos úteis
      • Editor de texto
      • grep
      • find
      • xargs
      • strings
  • libfoo.X.Y.Z
    X.Y.Z
    • X ABI incompatível
    • Y ABI compatível com versões anteriores
    • Z sem mudanças de ABI
  • Então precisamos de X.Y igual ao da biblioteca original
    • Aceitável: mesmo X, Y maior
  • Compile usando um sistema de build (selecione recursos e rastreie dependências automaticamente)

    • Melhores escolhas de sistema de build
      • The Yocto Project
      • Buildroot (melhor)
      • Sistema de build do OpenWRT
  • Comece a emular

    • Script de emulação QEMU
      root@kitploit:~
      #!/bin/bash
      # This script will build an environment without password for the user root
      export QEMU_AUDIO_DRV="none" # ignore audio drivers
      
      qemu-system-${PROCESSOR}${ARCHITECTURE} -M $CPUFAMILY \ # See point 2
                                              -m $RAMSIZE \
                                              -kernel $KERNELPATH \
                                              -nographic \ # No GUI
                                              -hda $FILESYSTEM \
                                              -net nic,model=$NETCARDMODEL \ # Model of net card, driver must be included in kernel
                                              -net user, hostfw=tcp::2222-:22, hostfw=tcp::9000-:9000 \ # 2222 as ssh and 9000 for GDB server
                                              -no-reboot \ # Terminate the machine when is halted
                                              -append "root=/dev/hda console=uart0" # Set root filesystem and console
      
    • Se, ao executar um binário, for impresso um erro sobre bibliotecas ausentes, defina LD_LIBRARY_PATH da seguinte forma (dentro da máquina): export LD_LIBRARY_PATH=/lib:/usr/lib:$PATHTOORIGINALFILESYSTEMLIBFOLDER
    • Também poderíamos emular a EEPROM NAND
      root@kitploit:~
      #!/bin/bash
      
      # Part 1: Identify bytes for kernel module
      modprobe nandsim first_id_byte=$FIRSTBYTE \
                          second_id_byte=$SECONDBYTE \
                          third_id_byte=$THIRDBYTE \
                          fourth_id_byte=$FOURTHBYTE \
                          cache_file=/root/nandsim.bin \
                          parts=x,y,z,... # Define partitons size in number of erase blocks; the number of partitions depends on your device, partitions are usually print on boot
      
      # Part 2: Erase partitions created (analyze EEPROM partitions)
      flash_erase /dev/mtd0 0 8 
      flash_erase /dev/mtd1 0 20
      # ...
      
      # Part 3: Load partitions dumped from device in the ones just created
      nandwrite /dev/mtd0 part0.bin
      nandwrite /dev/mtd1 part1.bin
      # ...
      
      # Part 4: Create mountpoint for filesystem and attach (if UBIFS)
      mkdir /mnt/filesystem
      ubiattach -O $N -m $MTDDVENUM -d $UBIDEVNUM
      ```# Parte 5: Montagem
      mount -tubifs /dev/ubi${UBIDEVNUM}_0 /mnt/filesystem
      
      1. Identifique os bytes para o módulo do kernel
        • Durante o boot, normalmente informações sobre a NAND são exibidas; observe-as (passos acima) e procure por NAND ID; os bytes impressos estão na ordem: primeiro, segundo e quarto byte
        • Também é possível encontrar essas informações pesquisando o datasheet da EEPROM
        • Também podemos usar writesize, oobsize, erasesize, iowidth para encontrar aqui o comando correto
        • Caso contrário, tentativa e erro
      2. Analise as partições da EEPROM exibidas no boot para descobrir seus tamanhos e nomes; o último número no comando flash_erase é o tamanho delas correlacionado ao erasesize (mesmo que parts=x,y,z,...)
      3. Carregue as partições extraídas do dispositivo nas que acabaram de ser criadas
      4. Crie um ponto de montagem para o sistema de arquivos e anexe
        • -O: especifica o offset do cabeçalho do volume id; se estiver errado, o sistema deve informar o valor correto; mesmo assim, você pode tentar valores diferentes como 512, 1024, 2048 (tentativa e erro)
        • -m: número do dispositivo mtd (veja o ponto 3)
        • : número do dispositivo UBI (veja o ponto 5)
  • Modo usuário: como o Wine, executa apenas um binário e o "traduz" para a nossa arquitetura
    • Notas
      • Não é tão estável
      • Pode dar resultados estranhos
    • Como fazer
      1. Localize o formato de executável do QEMU: qemu-$PROCESSOR$ARCHITECTURE
        • Exemplo: qemu-mips64
      2. Se o QEMU reclamar de interpretador ausente, passe o caminho da PASTA QUE CONTÉM esse interpretador com -L (ou veja man)
        • Para saber qual interpretador é usado por um executável, use readelf -l $EXECUTABLE
  • Modo de virtualização: não é interessante para nós
  • Construção do kernel e do sistema de arquivos raiz usando buildroot e docker
    • Nosso kernel compilado deve ter (em relação ao kernel original)
      • Mesma versão do kernel
      • Mesma versão da libc (uClibc, uClibc-ng, musl, dietlibc...)
      • Mesmas versões das bibliotecas (do executável em que estamos interessados)
    1. Procure a versão do buildroot mais próxima das versões do nosso dispositivo
      • Às vezes, durante o boot/exploração da memória extraída, podemos encontrar a versão do buildroot usada (se o dispositivo foi construído com buildroot)
    2. Encontre uma versão do Linux compatível com a versão encontrada do buildroot e crie um contêiner docker; aqui está um exemplo de dockerfile (os pacotes são importantes para executar o buildroot)
    3. Baixe a versão selecionada do buildroot aqui e coloque-a na pasta compartilhada do contêiner docker
    4. Execute e alterne para o contêiner docker
    5. Extraia o buildroot e use make manual para criar o manual do buildroot
    6. Usando make help, o buildroot exibe todos os dispositivos suportados (placas); use make $YOURBOARDNAME para criar um arquivo de configuração do buildroot para a sua placa
    7. Use make menuconfig (baseado em texto) ou make xconfig (GUI) para selecionar os módulos do kernel a serem adicionados à nossa compilação; usaremos make xconfig
      • Aqui está um exemplo/diretriz, mas você precisará descobrir por conta própria quais módulos em particular serão necessários para executar seus aplicativos
      • Dica: Edit->Find para pesquisar módulos
      • Opções
        • Target options
          • Marque Show options and packages that are deprecated or obsolete
          • Marque Build packages with debugging symbols com o maior debug level
          • Defina Strip command for binaries on target para None
          • Defina GCC optimization level para 0
        • Toolchain
          • Defina Toolchain type para Buildroot toolchain
    8. Para salvar permanentemente a configuração recém-definida, use make savedconfig
    9. Configure o kernel com make linux-menuconfig (baseado em texto) ou make linux-xconfig (GUI); aqui usaremos a versão CLI
      • Aqui está um exemplo/diretriz, mas você precisará descobrir por conta própria quais módulos em particular serão necessários para executar seus aplicativos
      • Opções
        • Kernel type -> Preemption model (Preemptible Kernel (Low-Latency Desktop)) -> Preemptible Kernel (Low-Latency Desktop)
        • Kernel type -> Device drivers -> Memory technology device (MTD) support -> NAND device support -> Support for NAND flash simulator
        • Kernel type -> Device drivers -> -> ->
    10. Configure o uClibc (ou sua biblioteca C) usando uclibc-menuconfig (como sempre)
      • Habilite a depuração: Development/Debugging options -> Enable debugging symbols; se isso não funcionar (erros de compilação), então Development/Debugging options -> (Wall) compiler warnings -> adicione -Wall -ggdb -g3
        • -ggdb: fornece informações de depuração para usar com o GDB
        • -g3: fornece informações de depuração adicionais
      • Save
      • Habilite os recursos conforme o nosso dispositivo (tentativa e erro; se ocorrerem erros, investigue e então recompile com os recursos necessários)
    11. Execute make; se houver problemas, volte e itere
      • Possíveis erros de compilação
        • Need to use -fPIC
          • Adicione --enable-shared nos módulos do kernel (ponto 7) em Toolchain -> Additional gcc options ou aplique um patch no buildroot
    • Salvando arquivos de configuração do buildroot com git
      • Configuração de árvore externa (visão em árvore dos arquivos para serem entendidos pelo buildroot) (br2)
        root@kitploit:~
        +-- board/
        |   +-- <company>/ (not always used)
        |       +-- <boardname>/
        |           +-- linux.config
        |           +-- busybox.config
        |           +-- kernel-defconfig (kernel config file)
        |           +-- <other configuration files>
        |           +-- post_build.sh (executed just before building the image, useful to copy root filesystem into the image)
        |           +-- post_image.sh
        |           +-- rootfs_overlay/ (everythin here will be copied in the final image)
        |           |   +-- etc/
        |           |   +-- <some file>
        |           +-- patches/
        |               +-- foo/
        |               |   +-- <some patch>
        |               +-- libbar/
        |                   +-- <some other patches>
        |
        +-- configs/
        |   +-- <boardname>_defconfig (buildroot config for our board)
        |   +-- uClibc.config (optional)
        +-- patches/
        |   +-- (here patches to be applied)
        |
        +-- Config.in (if using a br2-external tree)
        +-- external.mk (if using a br2-external tree)
        +-- external.desc (if using a br2-external tree)
        
      • Para usar uma árvore externa, invoque o buildroot assim: make BR2_EXTERNAL=$PATHTOEXTTREE $COMMAND
      • Para salvar a configuração do buildroot na nossa árvore externa: make BR2_EXTERNAL=$PATHTOEXTTREE savedefconfig
  • PINResistência a GNDResistência a VCCVNotas
    130kOhm0Ohm3.3VVCC
    24.7kOhm34kOhm3.3V1.6-3.3V na inicialização - TX
    3INFOhm (multímetro 1)INFOhm (multímetro 1)3.3V0V na inicialização - RX
    40Ohm30kOhm0VGND
    PINResistência a GNDResistência a VCCVNotas
    1
    ...
    10
    ...
    • Exemplo

      PINResistência a GNDResistência a VCCVNotas
      11kOhm1kOhm0V
      20Ohm90Ohm0VGND
      3INFOhm (multímetro 1)INFOhm (multímetro 1)2.1VAlta impedância, TDO?
      490Ohm0Ohm3.3VVCC
      54.7kOhm4.7kOhm3.3V
      6INFOhm (multímetro 1)INFOhm (multímetro 1)0VNão conectado?
      75.7kOhm5.7kOhm3.3V
      8INFOhm (multímetro 1)INFOhm (multímetro 1)0VNão conectado?
      94.7kOhm4.7kOhm3.3V
      100Ohm90Ohm0VGND
      • Pinout de site de teste JTAG compatível encontrado: Altera Byteblaster
    -d
  • Monte
  • Defina Kernel headers para Manually specified linux version
  • Defina Custom kernel headers series para $DEVICEKERNELVERSION
  • Defina Linux version para $DEVICEKERNELVERSION
  • Defina C library para $DEVICECLIBRARY
  • Defina $DEVICECLIBRARY version para $DEVICECLIBRARY $DEVICELIBRARYVERSION
  • Marque Enable large files
  • Marque Enable IPv6
  • Marque Enable RPC
  • Marque Enable WCHAR
  • Defina Thread library implementation para linuxthreads
  • Marque Thread library debugging
  • Marque Build cross gdb for the host
  • Marque TUI support
  • Marque Python support
  • Defina GDB debugger version para $LATESTGDBVERSION
  • System configuration
    • Defina Passwords encoding para MD5
    • Defina Init system para $DEVICEINITSYSTEM (ou BusyBox)
    • Defina /dev management para Dynamic using devtmpfs only
    • Defina /bin/sh para Busybox default shell
    • Marque Install timezone info
  • Kernel
    • Defina Kernel version para $DEVICEKERNELVERSION
    • Defina Kernel binary format para vmlinux
  • Target packages
    • Compressors and decompressors
      • bzip2 e xz-utils
    • Debugging profiling and benchmark
      • Marque gdb e full debugger
    • Development tools
      • O que você precisar
    • Filesystem and flash utilities
      • mtd, jffs2 and ubi/ubifs tools (ou o que você precisar)
    • Libraries
      • No geral, o que você precisar (sugestões abaixo)
      • Crypto
        • libsha1
        • libssh2
        • openssl
      • JSON/XML
        • expat
        • json-c
  • Networking applications
    • rsync e o que você precisar
  • Shell and utilities
    • file
  • Filesystem images
    • ext2
  • Host utilities (não se trata do dispositivo alvo; aqui estamos falando do host)
    • host mtd, jffs2 and ubi/ubifs tools
    • host util-linux
  • Lembre-se de SALVAR
  • Memory technology device (MTD) support
    UBI - Unsorted block images
    Enable UBI
  • File systems -> Miscellaneous filesystem -> JFFS2 support
  • File systems -> Miscellaneous filesystem -> UBIFS filesystem support
  • Save
  • Para salvar a configuração do kernel na nossa árvore externa: make BR2_EXTERNAL=$PATHTOEXTTREE linux-update-defconfig
  • Para salvar a configuração do uClibc na nossa árvore externa: make BR2_EXTERNAL=$PATHTOEXTTREE BR2_UCLIBC_CONFIG=$PATHWHERETOSAVEUCLIBCCONFIG uclibc-update-defconfig