AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 421556
Accepted
MD XF
MD XF
Asked: 2018-02-03 16:30:06 +0800 CST2018-02-03 16:30:06 +0800 CST 2018-02-03 16:30:06 +0800 CST

Obter saída somente hexadecimal do objdump

  • 772

Digamos, por exemplo, que eu tenha esta função C:

void f(int *x, int *y)
{
    (*x) = (*x) * (*y);
}

Quando salvo em f.c, a compilação com gcc -c f.cproduz f.o. objdump -d f.odá isso:

f.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <f>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   48 89 7d f8             mov    %rdi,-0x8(%rbp)
   8:   48 89 75 f0             mov    %rsi,-0x10(%rbp)
   c:   48 8b 45 f8             mov    -0x8(%rbp),%rax
  10:   8b 10                   mov    (%rax),%edx
  12:   48 8b 45 f0             mov    -0x10(%rbp),%rax
  16:   8b 00                   mov    (%rax),%eax
  18:   0f af d0                imul   %eax,%edx
  1b:   48 8b 45 f8             mov    -0x8(%rbp),%rax
  1f:   89 10                   mov    %edx,(%rax)
  21:   5d                      pop    %rbp
  22:   c3                      retq  

Eu gostaria que produzisse algo mais parecido com isto:

55 48 89 e5 48 89 7d f8 48 89 75 f0 48 8b 45 f8 8b 10 48 8b 45 f0 8b 00 0f af d0 48 8b 45 f8 89 10 5d c3

Ou seja, apenas os valores hexadecimais da função. Existe alguma objdumpbandeira para fazer isso? Caso contrário, quais ferramentas posso usar (por exemplo, awk, sed, cut, etc) para obter a saída desejada?

c gcc
  • 3 3 respostas
  • 10703 Views

3 respostas

  • Voted
  1. Best Answer
    user232326
    2018-02-03T16:54:53+08:002018-02-03T16:54:53+08:00

    Você pode extrair os valores de byte no segmento de texto com:

    $ objcopy -O binary -j .text f.o fo
    

    A opção binária -O:

    objcopy pode ser usado para gerar um arquivo binário bruto usando um destino de saída binário (por exemplo, use -O binary). Quando objcopy gera um arquivo binário bruto, ele essencialmente produz um despejo de memória do conteúdo do arquivo de objeto de entrada. Todos os símbolos e informações de realocação serão descartados. O despejo de memória começará no endereço de carregamento da seção mais baixa copiada no arquivo de saída.

    A -j .textopção:

    -j sectionpattern
    --only-section=sectionpattern
    Copia apenas as seções indicadas do arquivo de entrada para o arquivo de saída. Esta opção pode ser dada mais de uma vez.
    Observe que o uso inadequado dessa opção pode tornar o arquivo de saída inutilizável. Caracteres curinga são aceitos em sectionpattern.

    O resultado final é um arquivo ( fo) com os valores binários apenas da .textseção, ou seja, o código executável sem símbolos ou informações de realocação.

    E então imprima os valores hexadecimais do foarquivo:

    $ od -An -t x1 fo
     55 48 89 e5 48 89 7d f8 48 89 75 f0 48 8b 45 f8
     8b 10 48 8b 45 f0 8b 00 0f af d0 48 8b 45 f8 89
     10 90 5d c3
    
    • 9
  2. steve
    2018-02-03T16:44:19+08:002018-02-03T16:44:19+08:00

    Que tal

    awk '/^....:/{a=substr($0,9,20);sub(/ +$/,"",a);b=b" "a}END{print substr(b,2)}'
    

    Neste caso, retornaria

    55 48 89 e5 48 89 7d f8 48 89 75 f0 48 8b 45 f8 8b 10 48 8b 45 f0 8b 00 0f af d0 48 8b 45 f8 89 10 5d c3
    
    • 2
  3. calandoa
    2022-08-02T05:47:33+08:002022-08-02T05:47:33+08:00

    Outra opção é usar readelf:

    $ readelf -x .text f.o
    
    Hex dump of section '.text':
      0x00070c00 f30f1efa 488d15fd 13100048 8d357606 ....H......H.5v.
      0x00070c10 1100488d 3dc33809 00e902f5 fffff30f ..H.=.8.........
      0x00070c20 1efa5548 8d2d9606 1100be22 00000045 ..UH.-....."...E
      ...
    

    Com alguns arquivos .elf específicos, objdumpe objcopysão perdidos por um motivo desconhecido (talvez uma incompatibilidade de arco específica) e readelfé a única solução funcional que pude encontrar.

    • 0

relate perguntas

  • Leia /proc/pid/maps usando read()

  • Quando o heap é usado para alocação dinâmica de memória?

  • O que exatamente o GNU faz dep faz?

  • Otimização de programas baseados em OpenCV sistema operacional linux incorporado [fechado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve