# Arquivos

Provavelmente você já se deparou com diversos arquivos, mas será que já pensou numa definição para eles? Defino arquivo como uma sequência de *bytes* armazenada numa mídia digital somados a uma entrada, um registro, no sistema de arquivos (*filesystem*) que os referencie. Vou tentar provar minha definição para você. Faça o seguinte teste: abra o Bloco de Notas, escreva "mentebinaria.com.br" (sem aspas) e salve num arquivo chamado `arquivo.txt`.

Se nosso estudo sobre *strings* estiver correto, este arquivo deve possuir 19 *bytes* de tamanho.

Agora vamos verificar o conteúdo deste arquivo. Abra-o num editor hexadecimal. O conteúdo deve consistir apenas dos seguintes *bytes*:

![Conteúdo do arquivo.txt no editor hexadecimal](/files/0jJm77UkDolMZFuMkcET)

O conteúdo exibido é exatamente a *string* "mentebinaria.com.br" em ASCII. Conferindo com Python, temos:

```python
>>> b'mentebinaria.com.br'.hex(' ')
'6d 65 6e 74 65 62 69 6e 61 72 69 61 2e 63 6f 6d 2e 62 72'
```

Ou seja, se o arquivo tem apenas 19 bytes, que são os *codepoints* referentes aos caracteres da string, onde ficam armazenados seu nome, extensão, permissões, data e hora de criação, e todos os outros dados que não são o conteúdo, ou seja, os **metadados** do arquivo? Só pode ser em outro lugar no *filesystem* né?

De fato, nos sistemas de arquivos modernos, os arquivos só possuem seu próprio conteúdo. Na prática, as referências a eles é que definem onde começam e onde terminam um arquivo.

A pergunta mais interessante para nós é, no entanto, em relação ao **tipo** de arquivo. Criamos o `arquivo.txt` com a extensão `.txt`, mas é bom lembrar que uma extensão de arquivo nada mais é que parte de seu nome e não mantém nenhuma relação com seu tipo real. A única forma de saber um tipo de arquivo é **inferindo** este tipo através de seu conteúdo. Ao olhar para o arquivo no editor hexadecimal, vimos que todos os *bytes* do `arquivo.txt` pertencem à faixa de *codepoints* da tabela ASCII, por isso podemos inferir que este é um arquivo de texto ASCII.

Claro que há maneiras mais práticas de se identificar o tipo de arquivo do que inspecionando seus *bytes* um a um. No Windows, podemos utilizar softwares como o Detect It Easy. Ele possui uma base de assinaturas para reconhecer os *bytes* de um arquivo e inferir seu tipo. Outros exemplos incluem o TrID (Windows) e o file/libmagic (GNU/Linux).

![Detect It Easy (DIE) reconhecendo um arquivo de texto puro](/files/0ZSMQKdrpxqi5NWoMvSO)

Veremos agora como trabalhar com arquivos mais complexos que os arquivos de texto.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://mentebinaria.gitbook.io/engenharia-reversa/04-arquivos.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
