# C Strings

Na linguagem C, foi criado um padrão para saber *programaticamente* o fim de uma *string*: ela precisa ser terminada com um ***byte*** **nulo**, também chamado de *nullbyte*. Este nada mais é que um *byte* zerado. Sendo assim, a *string* ASCII "fernando", se utilizada num programa escrito em C, fica no binário compilado (no .exe gerado pelo processo de compilação, por exemplo) da seguinte forma:

```
66 65 72 6e 61 6e 64 6f 00
```

> É importante não confundir o *nullbyte* com o caractere de nova linha. Este pode ser o *Line Feed* (0x0a), também conhecido por *newline*. Já no DOS/Windows, a nova linha é definida por um par de caracteres: *Carriage Return* (0x0d) seguido de *Line Feed*, sequência conhecida por **CrLf** em linguagens como Visual Basic.

Se a *string* for UTF-16, então dois *bytes* nulos serão adicionados ao fim. Se for UTF-32, quatro.

Talvez você se pergunte qual a razão pela qual este conceito é útil em engenharia reversa. Bem, no caso de busca de *strings* num binário compilado, você pode refinar a busca por sequências de *bytes* na tabela ASCII, usando ou não uma codificação do padrão Unicode (já que os valores ASCII são os mesmos) terminados por um ou mais *nullbytes*. Por exemplo, supondo que você esteja buscado a *string* "Erro" dentro de um programa, o primeiro passo é descobrir quais são os *bytes* equivalentes na tabela ASCII desta *string*. Ao invés de usar a tabela, você pode usar o Python:

```python
>>> 'Erro'.encode().hex(' ')
'45 72 72 6f'
```

Agora sabemos que a sequência de *bytes* a ser procurada vai depender do tipo de *string.* Se for UTF-16-LE (*Little Endian*, que é o padrão no Windows), podemos montar a *string* sem nem precisar do Python, bastando para isso colocar os zeros depois de cada *byte*:

45 00 72 00 72 00 6f 00

Mas para sermos mais assertivos, caso não haja mais nada depois do "o" da palavra "Erro" no programa, podemos adicionar o *nullbyte* na busca:

* Em ASCII:

45 72 72 6f 00

* Em UTF-16-LE:

45 00 72 00 72 00 6f 00 00 00

Claro que os programas feitos para buscarem texto dentro de arquivos já possuem esta inteligência, no entanto, a proposta deste livro é entender a fundo como a engenharia reversa funciona e por isso não poderíamos deixar de cobrir este importante assunto.


---

# 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/03-cadeias-de-texto/c-strings.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.
