A partir daqui eu já não tenho mais conhecimento para te ajudar, bom estudo lendo absurdo de paginas e manuais de instruções de CPU. É por isso que foi inventado as linguagens de programação de alto nível, para abstrair essas complexidades e tornar o programador mais produtivo. Abraço.
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.
O que acontece é que o valor lido pode não ter um correspondente legível ascii, além de que nem todo caractere sairá bonitinho como caracteres deste texto.
Vc pode tentar converter um arquivo binário, no caso um arquivo executável elf usando libs específicas pra ler arquivos elf.
Esse tipo de lib ajuda diminuir o trabalho de ter de fazer na mão toda a leitura do arquivo executável.
Com uma lib para ler elf, vc pode facilmente extrair todas as seções do executável e ai imprimir na saída um código tipo assembly usando cada instrução.
Inclusive, é possível sim converter um arquivo elf para C porém, ele seria ilegível por humanos, digo, muito extensoo e muito complexo.
Uma vez eu tava planejando estudar assembly 6502 pra justamente converter um programa binário em cóidigo C, mesmo que fosse ilegível.
Com o código C do binário 6502 dá pra recompilar em qualquer máquina mais nova e potente e entã teria um código multiplataforma.
Esse projeto ainda não fiz por conta de esquecimento, mas pretendo criá-lo ainda.
@SamL bem lembrado não é tudo que poderá ser entendido por meio de caracteres ASCII, mas tudo pode ser entendido fazendo a leitura binária e sendo interpretado transcrito para assembly ao invés de ASCII, isso porque a linguagem de maquina não é uma linguagem humana e o ASCII é da linguagem humana o que torna incompatível esta leitura em 100% caractere ASCII.
Para sair da linguagem de maquina você terá que passar para o assembly, o assembly usa caractere ASCII. Ai quando vc não estiver entendendo você esta lendo instruções do processador. Lembre-se de que os CPUs tem ou não as mesma instruções entre si, isso vai depender da fabricante. Ou seja você terá que cair de cara em algum livro ou dar um jeito de encontrar essas instruções em algum lugar da internet.
Quero te assustar com a linguagem de maquina não, só estou te mostrando os fatos.
No entanto para aprender assembly também é preciso estudar as instruções, mas a diferença é que não é linguagem de maquina.
17. Re: Dificuldade em ler binário
aguamoleusa KUbuntu
Post recolhido
Enviado em 17/05/2024 - 12:32h
A e tem mais, os primeiros bytes, não sei da onde ate aonde é na verdade informações em bytes para o sistema operacional saber de qual tipo de dados aquele arquivo é, cada tipo de arquivo tem informações em bytes para se auto descrever. Eu esqueci o nome disso, corra atrás.
Quero te assustar com a linguagem de maquina não, só estou te mostrando os fatos.
No entanto para aprender assembly também é preciso estudar as instruções, mas a diferença é que não é linguagem de maquina.
Esse livro parece massa! Eu gosto desse tipo de assunto, principalmente do teórico.
Além pc de uma instrução, tem também a arquitetura zisc (zero instruction set), mas essa é voltada pra um pc com IA.
Pense num sistema completo que só está ali na memória e só faz sentido pra uma IA, isso ai é o zisc.
Uma coisa divertida de se fazer é emuladores, aprende-se bastante sobre operações bit a bit. eu fiz um emulador de chip8 em C com sdl2, tinha feito outro de nes mas perdi o código fonte.
Quanto a instrução em si, dava pra fazer assim aguamole: traduzir as intrusções para funções e ai fazer um mapa de memória, adicionar os registradores etc.
Basicamente é um emulador só que tu compila pra C. era assim que eu tava tentando criar isso outro dia, pena que requer muita leitura mas o assunto é bacana.
Fiz uma “leitura diagonal” do tópico, porque vou ter de sair daqui a pouco.
Não reparei se algum mencionou o programa objdump, com a opção de disassemble, para que o OP consiga ter uma representação clara de tudo (ou pelo menos do mais importante) que está no código dele.
O ELF (Executable and Linking Format) tem muitas informações para além do código executável puro e simples. Existe uma estruturação de seções, segmentação e uso de memória, cada uma delas com um cabeçalho que segue um formato padrão. Desse modo, o conteúdo de um executável terá muito mais “coisas ilegíveis” do que simplesmente os opcodes das instruções em Assembly que correspondem ao código fonte em C.
Não sei qual a intenção do OP ao fazer um dump binário do seu código. Contudo se a intenção for entender quais as partes do executável, e quiçá eliminar redundâncias, eis um artigo muito interessante que eu li anos atrás, que, ao descrever a jornada para chegar ao menor executável (binário) possível usando Linux, passa pelos tópicos de estrutura do ELF e algumas das seções que o compõem: https://www.muppetlabs.com/~breadbox/software/tiny/teensy.html.
Abaixo segue uma sessão de compilação e dump de um programa que só faz retornar o valor 42 na saída (como no artigo acima indicado), sem me dar o trabalho de tentar reduzir o tamanho do executável, e possivelmente usando de forma inadequada a opção --disassemble-all, pois há coisas ali que seguramente não correspondem a código de máquina (todas as seções que aparecem como “DATA”, em vez de “CODE”, por exemplo), mas que estão sendo exibidas como se o fossem.
$ echo "int main(void){ return 42; }" > x.c
$ gcc -O0 x.c -o x
$ ls -l x
-rwxr-xr-x 1 user group 15776 May 19 12:58 x
$ strip x
$ ls -l x
-rwxr-xr-x 1 user group 14328 May 19 12:59 x
$ objdump --file-headers --section-headers --disassemble-all x
0000000000000000 <.comment>:
0: 47 rex.RXB
1: 43 rex.XB
2: 43 3a 20 rex.XB cmp (%r8),%spl
5: 28 55 62 sub %dl,0x62(%rbp)
8: 75 6e jne 78 <__cxa_finalize@plt-0xfb8>
a: 74 75 je 81 <__cxa_finalize@plt-0xfaf>
c: 20 31 and %dh,(%rcx)
e: 31 2e xor %ebp,(%rsi)
10: 34 2e xor $0x2e,%al
12: 30 2d 31 75 62 75 xor %ch,0x75627531(%rip) # 75627549 <__cxa_finalize@plt+0x75626519>
18: 6e outsb %ds:(%rsi),(%dx)
19: 74 75 je 90 <__cxa_finalize@plt-0xfa0>
1b: 31 7e 32 xor %edi,0x32(%rsi)
1e: 32 2e xor (%rsi),%ch
20: 30 34 29 xor %dh,(%rcx,%rbp,1)
23: 20 31 and %dh,(%rcx)
25: 31 2e xor %ebp,(%rsi)
27: 34 2e xor $0x2e,%al
29: 30 00 xor %al,(%rax)
... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)
20. Re: Dificuldade em ler binário
ApprenticeXusa FreeBSD
Post recolhido
Enviado em 22/05/2024 - 01:44h
paulo1205 escreveu:
Não sei qual a intenção do OP ao fazer um dump binário do seu código.
O Objetivo não é um disassemble. O Objetivo é entender o que está escrito e porque. Citando um exemplo, se leio no arquivo um "RS" que trata-se de um caracter ilegível, eu sei o que significa e faz esse character, sei o porque ele está ali escrito.
Programas que leem um binário para fazer um disassemble, ou mesmo dar informações do binário, quem cria esses programas sabe o que está escrito em binário, até para localizar as seções onde estão as informações.
Citando outro exemplo mais fácil do que eu quero:
Quando olhamos um arquivo HTML no Browser: Veremos algo assim: Bom Dia!
Mas se lermos o arquivo HTML de verdade, veremos algo assim: <div><p>Bom Dia!</p></div>
Então cada tag html que existe escrita eu sei para que serve e o que ela faz, e o porque ela está lá, inclusive o porque o programador usou TABS, ou SPACES.
Eu consigo ler o binário da mesma forma como um html. Algumas coisas escritas eu consigo entender. Mas ao converter o binário como mostro na imagem que postei anteriormente, não está fazendo sentido porque cada sequencia binária obviamente esta lá porque é necessária para o computador entender, mas quando olho vários PONTOS "." ou espaços vazios aparentemente sem significado algum, eu gostaria de saber o que significa, porque não são comandos assembly, não são hexadecimais, como mostro na imagem posteriormente postada!
Teclas que estão escritas com letras eu compreendo.
Não compreendo as que não foram identificadas <?>
Não compreendo os espaços
Não entendo characteres soltos e espalhados no meio de enormes espaços
Characteres que constam na tabela ASCII são fáceis de identificar
Mas imagino que espaços possam siginifcar algum tipo de marcação, ou tabela...
Eu quero poder ler o binário convertido para sequencias binárias que foi convertido para texto para entender o padrão
Em como é escrito esse binário para que o PC compreenda o que está escrito, e para isso, eu tenho que saber ler o arquivo exatamente como o PC lê
Esse é meu objetivo!
21. Re: Dificuldade em ler binário
aguamoleusa KUbuntu
Post recolhido
Enviado em 22/05/2024 - 12:57h
ApprenticeX escreveu: https://www.vivaolinux.com.br/comunidades/imagens/anexos/1715903110.A.png
Teclas que estão escritas com letras eu compreendo.
Não compreendo as que não foram identificadas <?>
Não compreendo os espaços
Não entendo characteres soltos e espalhados no meio de enormes espaços
Characteres que constam na tabela ASCII são fáceis de identificar
Rapais, esse tempo todo vc estava perguntando dos espaços da imagem? Pó velho, é uma coisa tão lógica, que nem passo isso na minha cabeça que vc queria saber, o computador ele entende apenas ligado e desligado(1 bit ou 0 bit) que é se o transistor vai abrir ou vai fechar, esses 1 bit ou 0 bit se agrupam em grupo de 8 bit que ai forma o byte que é 8 bits, é por isso que vc vê esses espaços, o espaço aparece quando forma 1 byte que é a unidade de medida de grupo de 8bit, não tem significado na linguagem de maquina, isso só aparece apenas para facilitar a você fazer a sua leitura. Pode contar os bits ai, eu te garanto que o espaço só aparece após a contagem de 8 bits.
Meu 6 dias para eu entender o que vc esta falando. Analfabetismo funcional pego agora.
23. Re: Dificuldade em ler binário
ApprenticeXusa FreeBSD
Post recolhido
Enviado em 23/05/2024 - 00:58h
aguamole escreveu:
Rapais, esse tempo todo vc estava perguntando dos espaços da imagem? Pó velho, é uma coisa tão lógica, que nem passo isso na minha cabeça que vc queria saber, o computador ele entende apenas ligado e desligado(1 bit ou 0 bit) que é se o transistor vai abrir ou vai fechar, esses 1 bit ou 0 bit se agrupam em grupo de 8 bit que ai forma o byte que é 8 bits, é por isso que vc vê esses espaços, o espaço aparece quando forma 1 byte que é a unidade de medida de grupo de 8bit, não tem significado na linguagem de maquina, isso só aparece apenas para facilitar a você fazer a sua leitura. Pode contar os bits ai, eu te garanto que o espaço só aparece após a contagem de 8 bits. https://pt.wikipedia.org/wiki/Bit
Não compreendi bem sua resposta. Conforme eu disse e você mesmo repetiu: "espaços não tem signifcado na linguagem de máquina"
Logo não eram para existir no arquivo! Porque um arquivo binário seria disperdiçado com vários bytes de cada espaço se não servem pra nada?
Pense 100 espaços = 100 Bytes
Se esses espaços para O PC não são lidos, ou não tem nenhuma serventia, a lógica seria eles não estarem lá, isso diminuiria bastante o tamano do arquivo binário.
aguamole escreveu: garanto que o espaço só aparece após a contagem de 8 bits
Isso não ocorre! Exemplo, se eu escrevo um texto em binário por exemplo: test
Só existirá no arquivo: 01110100011001010111001101110100
Não existe espaço em lugar algum, somente as sequências binárias!
Porque um código compilado iria colocar espaços? se dizem que o compilador remove tanto os espaços e até comentários da linguagem ao gravar? Justamente para não inchar o arquivo binário. Até mesmo muda determinado comandos escritos errados pelo programador para comandos mais simples que fazem a mesma coisa, como substituição de printf("\n"); ou puts(""); para putchar('\n');
24. Re: Dificuldade em ler binário
ApprenticeXusa FreeBSD
Post recolhido
Enviado em 23/05/2024 - 00:59h
aguamole escreveu: Meu 6 dias para eu entender o que vc esta falando. Analfabetismo funcional pego agora.
Acho que trata-se apenas de falta de atenção, talvez por ansiedade!