Dificuldade em ler binário

1. Dificuldade em ler binário

Apprentice X
ApprenticeX

(usa FreeBSD)

Enviado em 16/05/2024 - 12:09h

Bom dia a todos.
Estou com dificuldade para compreender a leitura de um arquivo binário, vou explicar o que está ocorrendo.

1) Criei em C, um Hello World, o mais simples possível, compilei usando o clang. Então tenho agora meu arquivo binário!
2) Criei em C, um programa que leia o arquivo binário, e grave em um arquivo .txt as sequencias binárias lidas, exemplo, se leu test: 01110100011001010111001101110100

Ocorre que ao ler meu binário Hello World, ainda assim fica ilegível, mostrando sequencias como essa por exemplo:
01111111 01000101 01001100 01000110 00000010 00000001 00000001 00001001 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000010 00000000 00111110 00000000 00000001 00000000 00000000 00000000 11100000 00010101 

Que significam isso:
 E L F  	�������  �> ����� 

Ou seja, não consigo identificar do mesmo jeito, exceto o ELF (Executable and Linkable Format)

O que imagino: Se o computador lê em binário, porque não consigo fazer uma conversão para texto legível da ascii para eu entender o que ele está lendo? 90% do arquivo é ilegível.
Como faço para converter/interpretar esses bytes que são parte do arquivo, e obviamente são importantes para compreender o arquivo!
Que texto seria esse: 00000001 ou esse 00000000

Não consigo entender, mas sei que cada sequência tem que ter um propósito e significado, pois o computador lê assim.

Quem puder ajudar! Agradeço




  


2. Re: Dificuldade em ler binário

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 16/05/2024 - 12:09h

Olá! Para conseguir ler e interpretar correctamente um arquivo binário, você pode usar programas como o xxd ou o hexdump para visualizar o conteúdo em hexadecimal e ASCII. Você pode executar o seguinte comando para ver o conteúdo do seu arquivo binário em ASCII:


$ xxd -b <seuarquivo.bin>


Isso irá te mostrar o conteúdo do arquivo binário em formato binário e ASCII, facilitando a leitura e interpretação dos bytes. Espero que isso te ajude a entender melhor o conteúdo do seu arquivo! Caso tenha mais dúvidas, estou à disposição para te ajudar.


3. Re: Dificuldade em ler binário

Apprentice X
ApprenticeX

(usa FreeBSD)

Enviado em 16/05/2024 - 12:14h

alexabolada escreveu:

Olá! Para conseguir ler e interpretar correctamente um arquivo binário, você pode usar programas como o xxd ou o hexdump para visualizar o conteúdo em hexadecimal e ASCII. Você pode executar o seguinte comando para ver o conteúdo do seu arquivo binário em ASCII:


$ xxd -b <seuarquivo.bin>


Isso irá te mostrar o conteúdo do arquivo binário em formato binário e ASCII, facilitando a leitura e interpretação dos bytes. Espero que isso te ajude a entender melhor o conteúdo do seu arquivo! Caso tenha mais dúvidas, estou à disposição para te ajudar.

Esse programa mostra a mesma coisa que o meu, e continua sem fazer sentido, apenas trocou o <?> por um ponto as vezes colorido:
01111111 01000101 01001100 01000110 00000010 00000001  .ELF.. 



4. Re: Dificuldade em ler binário

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 16/05/2024 - 12:14h

Olá! Para conseguir ler e interpretar corretamente um arquivo binário, você pode usar programas como o xxd ou o hexdump para visualizar o conteúdo em hexadecimal e ASCII. Você pode executar o seguinte comando para ver o conteúdo do seu arquivo binário em ASCII:


$ xxd -b <seuarquivo.bin>


Isso irá te mostrar o conteúdo do arquivo binário em formato binário e ASCII, facilitando a leitura e interpretação dos bytes. Espero que isso te ajude a entender melhor o conteúdo do seu arquivo! Caso tenha mais dúvidas, estou à disposição para te ajudar.

O programa xxd é útil para visualizar o conteúdo de arquivos binários em formato binário e ASCII. Se você está vendo apenas um ponto colorido no lugar de caracteres, pode ser que o arquivo esteja codificado de uma forma diferente do esperado. Certifique-se de que está utilizando o comando corretamente e verifique a codificação do arquivo.


5. Re: Dificuldade em ler binário

aguamole
aguamole

(usa KUbuntu)

Enviado em 16/05/2024 - 13:25h

@ApprenticeX Os binários na computação, é uma linguagem de programação camada de linguagem de maquina.
Segue o link da wikipedia sobre a linguagem de maquina:
https://pt.wikipedia.org/wiki/C%C3%B3digo_de_m%C3%A1quina

Para vc compreender o que significa esses valores 0 e 1, você terá que aprender a programar em linguagem de maquina, quando você souber programar linguagem de maquina, vc vai conseguir interpretar esses valores. Apesar de dar para trabalhar em linguagem de maquina ninguém mais programa usando esta linguagem, usasse hexadecimal, e assembly. Para editar valores dentro da RAM eles aparecem em linguagem hexadecimal. Isso porque programar em hexadecimal é muito mais produtivo que a linguagem de maquina, então ninguém mais programa nessa linguagem de maquina.

A por falar nosso, o 0(zero) significa que o transistor foi fechado, e o 1(um) significa que o transistor foi aberto, o CPU faz o processamento dos calculos aritméticos abrindo e fechando os transistores. E são bilhões de transistores em uma CPU.
Veja o que a tecblog diz:
"A primeira versão do processador Pentium 4, lançado pela Intel em 2000, tinha litografia de 180 nm e 42 milhões de transistores. Já o Intel Core i9-13900K, de 2022, tem 10 nm e 14 bilhões de transistores."
https://tecnoblog.net/responde/o-que-significam-os-nanometros-em-processadores-litografia/

Transistor:
https://pt.wikipedia.org/wiki/Trans%C3%ADstor

É isso mesmo, os transistor das CPU fica abrindo e fichando e esses números binários da linguagem de maquina é que define se algum transistor vai abrir ou fechar. o 1 abre o transistor e o 0 fecha o transistor.


6. Re: Dificuldade em ler binário

Apprentice X
ApprenticeX

(usa FreeBSD)

Enviado em 16/05/2024 - 14:23h

aguamole escreveu:
@ApprenticeX Os binários na computação, é uma linguagem de programação camada de linguagem de maquina.
Segue o link da wikipedia sobre a linguagem de maquina:
https://pt.wikipedia.org/wiki/C%C3%B3digo_de_m%C3%A1quina

Esse link ajuda, tem informações que vou estudar

aguamole escreveu: Para vc compreender o que significa esses valores 0 e 1, você terá que aprender a programar em linguagem de maquina, quando você souber programar linguagem de maquina, vc vai conseguir interpretar esses valores.

0 e 1, transistores eu conheço o funcionamento

Sobre hexadecimal, assembly também tenho noção de como funciona.
No momento meu objetivo, seria re-escrever o arquivo binário para linguagem de texto, interpretando os characteres que lá foram escritos, motivo inicial pelo qual, re-escrevi para texto em sequencia binária acreditando que em binário fosse mais fácil converter para texto cada sequência para um texto legível. A não ser que nem tudo escrito em binário conste na ascii.

Outro exemplo: Não acredito que exista no arquivo binário a palavra 0x83EF que isso que se definiria código de máquina ou Opcode, se é um arquivo binário, não terá hexadecimal escrito a não ser que eu converta para hexadecimal.

Como estou convertendo do binário que sem certeza acredito que teria uma letra seja imprimível ou não para texto comum, mesmo não fazendo sentido é isso que eu gostaria de ler no arquivo.

Não encontrei nem os textos escritos por mim no código C, que óbvio que ao compilar são convertidos em linguagem de máquina, mas nem esses consegui encontrar em nenhuma sequência binária, essa é a dificuldade!

Meu código C acima, gera isso:

.text
.file "test.c"
.globl main # -- Begin function main
.p2align 4, 0x90
.type main,@function
main: # @main
.cfi_startproc
# %bb.0:
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
subq $16, %rsp
movl $0, -4(%rbp)
movabsq $.L.str, %rdi
callq puts
xorl %eax, %eax
addq $16, %rsp
popq %rbp
.cfi_def_cfa %rsp, 8
retq
.Lfunc_end0:
.size main, .Lfunc_end0-main
.cfi_endproc
# -- End function
.type .L.str,@object # @.str
.section .rodata.str1.1,"aMS",@progbits,1
.L.str:
.asciz "Hello World"
.size .L.str, 12

.ident "clang version 17.0.6"
.section ".note.GNU-stack","",@progbits
.addrsig
.addrsig_sym puts

Até encontrei no arquivo parte desse código, mas não completamente de forma que eu pudesse lê-lo por completo


7. Re: Dificuldade em ler binário

aguamole
aguamole

(usa KUbuntu)

Enviado em 16/05/2024 - 15:12h

Uai, o que vc quer é desenvolver um software de engenharia reversa do código de maquina para a linguagem de programação C.
Não posso ajudar nisso. Não tenho conhecimento de programação para te ajudar. Eu achei que o seu interesse era saber do que é linguagem de maquina.


8. Re: Dificuldade em ler binário

Apprentice X
ApprenticeX

(usa FreeBSD)

Enviado em 16/05/2024 - 18:46h

aguamole escreveu:
Uai, o que vc quer é desenvolver um software de engenharia reversa do código de maquina para a linguagem de programação C.
Não posso ajudar nisso. Não tenho conhecimento de programação para te ajudar. Eu achei que o seu interesse era saber do que é linguagem de maquina.

Não é engenharia reversa, é entender o que o PC está lendo...

Um exemplo:
Eu falo português e João fala japonês
Sempre que eu falo com joão, eu falo em português, mas o tradutor universal fala com ele em japonês!
O que eu quero é ver as palavras escritas em japonês! Para eu traduzir e ver dar certo essa tradução para o português! Assim aprendo!

Então pense? O Computador lê em binário!
Eu quero ver de verdade esse binário como o computador lê (Lembra do japonês) Então pegarei esse binário para converter na minha linguagem pois o computador também faz isso, quero saber como ele faz!

Engenharia Reversa tem a ver com Software! Linguagem binária abrange tudo! Textos, Banco de Dados, formatações e etc...
A Engenharia Reversa apenas transforma o código em Assembly, eu quero não somente isso, mas ler e ver tudo que está escrito, inclusive o que não é código!

O Problema é que após eu converter para sequencias binárias, elas não são convertidas para texto simples, um exemplo: O character 30 é RS ele não é imprimível, mas posso vê-lo como RS o que é bem diferente de ver <?> ou . não acredito que exista disperdícios de PONTO "." qdo se escreve em binário


9. Re: Dificuldade em ler binário

aguamole
aguamole

(usa KUbuntu)

Enviado em 16/05/2024 - 18:59h

Mas em linguagem de maquina é código, os textos tmb são códigos, a maquina não é humana ela só entende abrir e fechar dos transistores. Agora, para entender a linguagem de maquina, vc precisa estudar também a linguagem binária, se vc não souber como ler a linguagem binária vc não vai conseguir ler a linguagem de maquina.

Eu pergunto para o google sobre linguagem binária ele vem falar de computador, é difícil viu.
A é porque não é linguagem binária, chama sistema binário.
https://pt.wikipedia.org/wiki/Sistema_de_numera%C3%A7%C3%A3o_bin%C3%A1rio

Aprenda a escrever seu nome usando o sistema binário que vc vai entender como ele entende esse bando de 0 e 1.

https://www.locaweb.com.br/blog/temas/codigo-aberto/codigo-binario-como-converter-palavras-e-numeros...
O sistema binário é uma forma de representar números e caracteres de forma matemática e não somente isso, o sistema binário pode representar qualquer informação.


10. Re: Dificuldade em ler binário

aguamole
aguamole

(usa KUbuntu)

Enviado em 16/05/2024 - 19:28h

A wikipedia sobre o sistema binário esta mais explicativa como sempre a wiki do idioma inglês é mais completa, la eles mostram exemplo de como fazer calculo matemático usando o sistema binário.
É provável que tenha livros sobre como entender o sistema binário.

Veja a linguagem de maquina é representada usando o sistema binário, mas o sistema binário não é a linguagem de maquina, a linguagem de maquina é uma linguagem de programação que é representada pelo sistema binário.


11. Re: Dificuldade em ler binário

Apprentice X
ApprenticeX

(usa FreeBSD)

Enviado em 16/05/2024 - 20:45h

aguamole escreveu:
Aprenda a escrever seu nome usando o sistema binário que vc vai entender como ele entende esse bando de 0 e 1.


Tentando explicar melhor:
1) Eu sei escrever meu nome em linguagem binária, E sei converter ele para texto
2) Eu sei converter uma variável ou um arquivo de texto de binário para texto, ou ao contrário de texto para binário!

A questão é que não está batendo os characteres quando se trata de um arquivo compilado!
A Imagem em anexo é exatamente o que está escrito no arquivo que compilei o Hello World.
Não existe erros da conversão, a imagem mostra espaços porque EU achei melhor para minha visualização ter espaço entre cada sequencia binária, já que não existem espaços no arquivo. Mas não estou convertendo para textos usando espaços.

Do lado esquerdo está o arquivo convertido para binários, onde para me facilitar eu inclui espaços separando as sequencias binárias, pois o arquivo binário não existe espaços
Do lado direito está o arquivo convertido do código binário que não tem espaços diretamente para textos! A conversão está 100% correta! Não existem erros!
E ainda assim existem characteres não reconhecidos, characteres sem sentido, da mesma forma como é mostrado se usar um programa hexadecimal como xxd. Vai ter várias coisas a toa lá como pontos "."

O que quero entender é que para o computador interpretar o binário segue uma lógica, e o arquivo que o computador Lê não parece seguir uma lógica.
Alguns programas como readelf tiram boas informações desse arquivo! Logo existe uma lógica de interpretação dele!
As informações que readelf lê do arquivo constam no arquivo que eu traduzi, mas obviamente o criador do programa interpreta entradas e alguma coisa para ter lógica!



12. Re: Dificuldade em ler binário

aguamole
aguamole

(usa KUbuntu)

Enviado em 17/05/2024 - 01:35h

Então pó, é como eu expliquei antes, após aprender o sistema binário, ao aplicar em computador você não deve interpretar os binários caractere por caractere isso porque vai ter alguns 0 e 1 que são instrução do processador para o qual o sistema binário a ser lido foi compilado ou se por humano, escrito.
Agora que você sabe interpretar o sistema binário, vc precisa estudar as instruções do CPU que vc quer interpretar o sistema binário, isso porque é uma linguagem de programação, não é somente um sistema binário direto(é direto mais pega a ideia), mas uma linguagem de programação, se você ler o sistema binário sem saber as instruções do CPU vc vai ter este problema que esta tendo, chegando em partes sem sentido, essas partes são todas instruções especificas do processador. E existe vários CPUs com varias instruções diferentes entre si.
Portanto para entender a linguagem de maquina, vc vai precisar tmb entender as instruções do CPU para a qual o código binário que esta sendo lido foi construido.

O que é instruções de computador:
https://pt.wikipedia.org/wiki/Conjunto_de_instru%C3%A7%C3%B5es

Exemplos de instruções de CPU x86 mais especificamente do processador(Velho absurdo, já não existe mais, se existe é só em museu) 8086/8088:
https://en.wikipedia.org/wiki/X86_instruction_listings

Lembrado que os valores de código de operação descrito na pagina de instruções do 8086 estão em hexadecimal, que pode ser transcrito para o sistema binário.



01 02 03



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts