<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: !Ryan Gozlyngg</title>
    <description>The latest articles on Forem by !Ryan Gozlyngg (@ryan_gozlyngg).</description>
    <link>https://forem.com/ryan_gozlyngg</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1305716%2F7006f6c9-07e5-4d56-8631-dbda03e710ff.jpg</url>
      <title>Forem: !Ryan Gozlyngg</title>
      <link>https://forem.com/ryan_gozlyngg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ryan_gozlyngg"/>
    <language>en</language>
    <item>
      <title>Engenharia Reversa Primeiro Contato - Parte 2</title>
      <dc:creator>!Ryan Gozlyngg</dc:creator>
      <pubDate>Sat, 08 Jun 2024 02:29:20 +0000</pubDate>
      <link>https://forem.com/ryan_gozlyngg/engenharia-reversa-primeiro-contato-parte-2-m2g</link>
      <guid>https://forem.com/ryan_gozlyngg/engenharia-reversa-primeiro-contato-parte-2-m2g</guid>
      <description>&lt;h2&gt;
  
  
  DIABLO - ORiON_CrackMe1 +18
&lt;/h2&gt;

&lt;p&gt;O tutorial é dedicado aos iniciantes em engenharia reversa, mas eu tentarei explicar, o máximo possível, alguns processos do Assembly e da arquitetura Intel x86, para que, até mesmo pessoas que nunca estudaram nada disso, possam acompanhar, e -se eu não falhar na clareza- entender os processos. &lt;br&gt;
E aí, quem sabe, você não crie interesse por está área de estudos.&lt;/p&gt;

&lt;p&gt;Caso não saiba usar o Debugger x64dbg, segue uma breve introdução: &lt;a href="https://dev.to/ryan_gozlyngg/engenharia-reversa-primeiro-contato-parte-1-2gih"&gt;https://dev.to/ryan_gozlyngg/engenharia-reversa-primeiro-contato-parte-1-2gih&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse tutorial consiste na quebra de um programa feito para isso.&lt;br&gt;
É de nível extremamente básico, feito, justamente, para iniciantes na área da engenharia reversa.&lt;br&gt;
"Quebra de software" quer dizer: fazer o programa se submeter à sua vontade!&lt;/p&gt;

&lt;p&gt;Algumas notas estão presentes para auxiliar no entendimento de coisas que eu julgue que devem ser de conhecimento do leitor.&lt;/p&gt;


&lt;h2&gt;
  
  
  Lista de Conteúdo
&lt;/h2&gt;

&lt;p&gt;Requisitos para total entendimento do tutorial a seguir&lt;/p&gt;

&lt;p&gt;Termos utilizados durante o tutorial&lt;/p&gt;

&lt;p&gt;Link para o programa CrackMe&lt;/p&gt;

&lt;p&gt;Análise Estática&lt;br&gt;
    Examinando as strings do programa&lt;/p&gt;

&lt;p&gt;Análise Dinâmica&lt;/p&gt;

&lt;p&gt;Como o Code (input) é processado&lt;/p&gt;

&lt;p&gt;TEST CL, CL&lt;/p&gt;

&lt;p&gt;Registrador EFLAGS&lt;/p&gt;

&lt;p&gt;CL&lt;/p&gt;

&lt;p&gt;O Processo de Tratamento do Input&lt;/p&gt;

&lt;p&gt;Vamos rastrear a origem desse valor no topo da stack/pilha&lt;/p&gt;

&lt;p&gt;Observando a stack&lt;/p&gt;

&lt;p&gt;Retorno de Função&lt;/p&gt;

&lt;p&gt;Observando a Função crackme1.46B828&lt;/p&gt;

&lt;p&gt;Encontrando valores no Dump&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.toEntrando-na-Fun%C3%A7%C3%A3o-crackme1-46B828"&gt;Entrando na Função crackme1.46B828&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Entendendo como chegamos ao resultado&lt;/p&gt;

&lt;p&gt;Caso o salto não seja executado, as seguintes instruções são usadas&lt;/p&gt;

&lt;p&gt;Resumindo a lógica da função&lt;/p&gt;

&lt;p&gt;Saindo da função e obtendo o resultado definitivo&lt;/p&gt;

&lt;p&gt;SETNE - Instrução que gera o resultado&lt;/p&gt;

&lt;p&gt;Considerações Finais&lt;/p&gt;


&lt;h3&gt;
  
  
  Requisitos para total entendimento do tutorial a seguir
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Conhecimento básico sobre segmentos de memória, principalmente sobre o segmento chamado stack/pilha&lt;/li&gt;
&lt;li&gt;Conhecimento sobre bases numéricas&lt;/li&gt;
&lt;li&gt;Conhecimento básico de programação em C/C++&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui eu espero poder mostrar a quebra desse software na forma de tutorial, usando partes do processo para compartilhar alguns conhecimentos úteis com aquele leitor que está iniciando, e ainda tem alguma dúvida, ou dificuldade, em entender algo específico.&lt;br&gt;
Também é dedicado aos que desejam ver como esse tipo de coisa é feita.&lt;/p&gt;

&lt;p&gt;No mais, é sempre bom ver como outras pessoas solucionam problemas, como a mente delas funciona em determinadas atividades, para, talvez, extrairmos alguma coisa para nós mesmos.&lt;/p&gt;
&lt;h4&gt;
  
  
  Se você já iniciou os estudos em engenharia reversa, tente quebrar esse software por sua conta primeiro, depois volte aqui para ler.
&lt;/h4&gt;


&lt;h3&gt;
  
  
  Termos utilizados durante o tutorial
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code, CODE ou code&lt;/strong&gt;: nome da área de input; é o mesmo que "serial", "key", "senha" ou input. Nesse software, os desenvolvedores chamaram a área de input de &lt;strong&gt;Code&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Breakpoint&lt;/strong&gt;: ponto de interrupção, ponto de parada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setar&lt;/strong&gt;: ação de aplicar algo sobre alguma coisa: exemplo: "setar breakpoint" significa: aplicar, definir, introduzir um breakpoint em ou sobre determinada instrução.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Binário&lt;/strong&gt;: refere-se a um programa, um executável.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Link para o programa CrackMe
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Baixe aqui: &lt;a href="https://github.com/ReversingID/Crackmes-Repository/tree/master" rel="noopener noreferrer"&gt;https://github.com/ReversingID/Crackmes-Repository/tree/master&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Encontre ele no path: &lt;strong&gt;&lt;em&gt;Crackmes.DE\1-very_easy_for_newbies\windows\diablo&lt;/em&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Nota: Usar ou não uma máquina virtual dedicada para rodar o software está a seu critério.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Análise Estática
&lt;/h3&gt;

&lt;p&gt;Em resumo, "análise estática" é uma análise feita apenas com as informações contidas no próprio arquivo do programa, também chamado &lt;strong&gt;binário&lt;/strong&gt;, obtidas independentemente da execução do programa.&lt;/p&gt;

&lt;p&gt;Para saber em qual arquitetura o programa foi compilado, você pode usar o programa DIE - Detect It Easy:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fad6wugkvpk7wshpgqjqf.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fad6wugkvpk7wshpgqjqf.PNG" alt="Image description" width="733" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O DIE é um programa muito poderoso, por hora, vamos ficar somente com essas informações da interface inicial. Recomendo que você se aprofunde no uso do DIE.&lt;/p&gt;

&lt;p&gt;Na caixa de baixo, com grande destaque em vermelho, podemos ver algumas informações interessantes. "PE32" indica que o programa é um executável de 32 bits. Nas caixas menores, marcadas em vermelho, podemos ver também, o &lt;strong&gt;modo&lt;/strong&gt; e a &lt;strong&gt;arquitetura&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  Examinando as strings do programa
&lt;/h3&gt;

&lt;p&gt;Você pode ver as strings contidas dentro do programa, usando o software que preferir (inclusive com DIE, clicando no botão "Strings", na interface inicial): &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4myv2j7j01u64dsizd5a.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4myv2j7j01u64dsizd5a.PNG" alt="Image description" width="614" height="24"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Não tem como examinarmos as strings, uma por uma, já que &lt;strong&gt;3,750&lt;/strong&gt; strings depois, alguma coisa pode acabar passando batido...&lt;/p&gt;

&lt;p&gt;As strings mais interessantes são as que o &lt;strong&gt;programador&lt;/strong&gt; criou. Vamos dar uma olhada no local em que as variáveis globais e estáticas, inicializadas, são guardadas: &lt;strong&gt;&lt;em&gt;data segment&lt;/em&gt;&lt;/strong&gt;, ou &lt;strong&gt;&lt;em&gt;.data&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Eu utilizei o programa &lt;strong&gt;&lt;em&gt;IDA&lt;/em&gt;&lt;/strong&gt; para acessar a seção de dados (.data) mencionada.&lt;br&gt;
O &lt;strong&gt;IDA&lt;/strong&gt; é um programa utilizado para análise estática de binários, ele é muito poderoso, possui várias funcionalidades, não vou falar muito sobre ele aqui, recomendo procurar mais sobre.&lt;/p&gt;

&lt;p&gt;O IDA possui uma versão gratuita: &lt;a href="https://hex-rays.com/ida-free/" rel="noopener noreferrer"&gt;https://hex-rays.com/ida-free/&lt;/a&gt;&lt;br&gt;
Caso você nunca tenha usado o IDA, e mesmo assim baixou para testar aí, saiba que ele nos mostra várias mensagens ao carregarmos o binário nele, por hora não se preocupe, dê "ok" em tudo até chegar na tela principal. Caso queira se aprofundar, recomendo começar com alguma das muitas playlists de introdução ao IDA, encontradas no Youtube.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No IDA: &lt;strong&gt;SHIFT+F7&lt;/strong&gt; -&amp;gt; clique duas vezes em &lt;strong&gt;&lt;em&gt;.data&lt;/em&gt;&lt;/strong&gt; -&amp;gt; clique na aba &lt;strong&gt;Hex view&lt;/strong&gt; -&amp;gt; vá descendo e observando a coluna lateral:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff8nu7qyxhkm4lxgxaofc.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff8nu7qyxhkm4lxgxaofc.PNG" alt="Image description" width="779" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Estamos vendo a seção de dados dentro do programa, em hexadecimal, e a sua respectiva representação em ASCII, na coluna da direita (circulada em vermelho).&lt;/p&gt;

&lt;p&gt;Dica: Aqui podemos separar as strings em um bloco de notas, e ir testando uma a uma no input do programa, já que é a coisa mais fácil a se fazer.&lt;/p&gt;

&lt;p&gt;Se você fez isso, então já sabe a resposta.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl8g66ojllfozkw0gd7gj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl8g66ojllfozkw0gd7gj.gif" alt="Image description" width="90" height="30"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Análise Dinâmica
&lt;/h3&gt;

&lt;p&gt;A Análise Dinâmica consiste em observar e analisar o programa durante a execução.&lt;/p&gt;

&lt;p&gt;Eu usei o debugger &lt;strong&gt;x64dbg&lt;/strong&gt; aqui, e como de costume, a primeira coisa que faço é procurar pelas referências às strings.&lt;br&gt;
Encontrando a string correta (nesse caso "Wrong Code! Try Again!") eu consigo observar as instruções que ocorrem antes dela ser usada na caixa de diálogo.&lt;br&gt;
Seguindo essa string, eu chego ao momento em que ela é usada, e a partir desse local, eu posso buscar entender qual a lógica por trás da tomada de decisão, que julga se o nosso Input está correto ou não.&lt;/p&gt;

&lt;p&gt;Abra o programa no x64dbg (não esqueça que o programa é de 32 bits, e precisa ser aberto no x32dbg.exe) e rode (apertando &lt;strong&gt;F9&lt;/strong&gt;) o programa até ele abrir, e a janela com o input aparecer para você.&lt;br&gt;
Geralmente o x64dbg tem alguns breakpoints iniciais, que só funcionam na primeira vez que o programa é rodado, então se o &lt;strong&gt;EIP&lt;/strong&gt; -Instruction Pointer (ponteiro de instrução), responsável por dizer em qual instrução você está no momento (a setinha verde na lateral esquerda te mostra ele), estiver parado, continue clicando em &lt;strong&gt;F9&lt;/strong&gt; para rodar o programa até ele ser completamente carregado, e aí ele estará disponível para você usar (observe a barra de tarefas do Windows).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsjo0q4gz70jveplrwojs.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsjo0q4gz70jveplrwojs.PNG" alt="Image description" width="800" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com o programa já rodando, dentro do x64dbg:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clique com o botão direito do mouse, no meio do debugger, na janela CPU&lt;/li&gt;
&lt;li&gt;Vá em: "Pesquisar por" -&amp;gt; "All User Modules" -&amp;gt; "Referências String"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F10htsj6w5j8pskd35km6.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F10htsj6w5j8pskd35km6.PNG" alt="Image description" width="774" height="305"&gt;&lt;/a&gt;&lt;br&gt;
Você será direcionado para está janela. A anterior está ali em cima, em &lt;strong&gt;CPU&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Aqui vemos algumas strings que chamam atenção...&lt;br&gt;
Se começamos por esse método, fazemos como anteriormente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pegamos as strings "diferenciadas", e as testamos como input, uma a uma.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você já deve saber que isso vai dar certo, mas por questão de curiosidade, se isso não tivesse funcionado, prosseguiríamos da seguinte maneira:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clique duas vezes na string "&lt;strong&gt;Wrong Code! Try Again!&lt;/strong&gt;"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você será direcionado para a instrução (onde ela é referida) que carrega ela na função (provavelmente a &lt;strong&gt;main&lt;/strong&gt;), dentro da janela &lt;strong&gt;CPU&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sete um breakpoint nela, clicando em &lt;strong&gt;F2&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Abra a janela do programa e insira um code/input diferente do esperado, um errado qualquer.&lt;/li&gt;
&lt;li&gt;Clicando em "Ok" o programa irá rodar até parar em seu breakpoint setado.&lt;/li&gt;
&lt;li&gt;Agora vamos procurar pelo que decidiu que nossa resposta está errada, em outras palavras, procuramos entender como viemos parar na mensagem de erro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos fazer a engenharia reversa do programa, até descobrirmos o critério de "resposta certa" e "resposta errada".&lt;/p&gt;


&lt;h3&gt;
  
  
  Como o Code (input) é processado
&lt;/h3&gt;

&lt;p&gt;Vamos rever os passos até aqui:*&lt;br&gt;
    1. Buscamos as referências de strings em todos os &lt;strong&gt;User Modules&lt;/strong&gt;&lt;br&gt;
    2. Encontramos a string que aparece na caixa de diálogo ao errar o input&lt;br&gt;
    3. Setamos um breakpoint nela&lt;br&gt;
    4. Rodamos o programa depois de inserir um input qualquer&lt;/p&gt;

&lt;p&gt;Subindo um pouco a partir do breakpoint (setado em "Wrong Code! try Again!"), vemos que há uma instrução &lt;code&gt;test cl, cl&lt;/code&gt;, um pouco antes das instruções que nos mostram a mensagem de erro. &lt;/p&gt;

&lt;p&gt;Se você observar a instrução em [&lt;strong&gt;004016D7&lt;/strong&gt;], que é um salto condicional &lt;strong&gt;JE&lt;/strong&gt; (Jump if Equal), &lt;br&gt;
&lt;code&gt;pula para crackme1.4016F6 se o resultado de TEST CL, CL for igual a 0&lt;/code&gt;, ela nos direciona para a outra mensagem: a mensagem de sucesso.&lt;br&gt;
Basta você dar dois cliques na instrução &lt;code&gt;je crackme.4016F6&lt;/code&gt; que o programa te redireciona para esse endereço.&lt;br&gt;
Com isso, sabemos que, se &lt;strong&gt;CL&lt;/strong&gt; for &lt;strong&gt;zero&lt;/strong&gt;, quer dizer que colocamos o input/code certo.&lt;/p&gt;

&lt;p&gt;Agora nos fazemos uma pergunta: O que leva &lt;strong&gt;CL&lt;/strong&gt; a ter o valor zero, ou mesmo o valor atual?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpl68nt7gpv8b5n19y1va.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpl68nt7gpv8b5n19y1va.PNG" alt="Image description" width="695" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nota: *&lt;em&gt;Se você não entendeu nada desse trecho, leia a parte seguinte, **TEST CL, CL&lt;/em&gt;&lt;em&gt;, com calma...&lt;/em&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  TEST CL, CL
&lt;/h3&gt;

&lt;p&gt;Antes de tudo, o que significa a instrução &lt;code&gt;TEST CL, CL&lt;/code&gt;?&lt;br&gt;
Caso saiba, pule para "Respondendo à pergunta: O que leva &lt;strong&gt;CL&lt;/strong&gt; a ter o valor zero?".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;*Instrução TEST: o programa está testando se **CL&lt;/strong&gt; é zero ou não ("ou não" é literalmente qualquer coisa diferente de zero, como, por exemplo, -1, 1, 90000, 0xABC, 0xFFFF, 6, etc.).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CL&lt;/strong&gt; é a parte mais à direita do registrador &lt;strong&gt;ECX&lt;/strong&gt; (ver imagem adiante).&lt;br&gt;
Registradores são espaços de armazenamento dentro do processador.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TEST&lt;/strong&gt;: instrução que compara dois operandos, no nosso caso, compara &lt;strong&gt;CL&lt;/strong&gt; com ele mesmo.&lt;br&gt;
Com "TEST" o programa performa uma operação bit a bit, (bitwise) chamada &lt;strong&gt;AND&lt;/strong&gt;.&lt;br&gt;
A operação &lt;strong&gt;AND&lt;/strong&gt; é uma operação lógica, efetuada com binários.&lt;br&gt;
Caso não saiba nada sobre operações lógicas, veja: &lt;a href="https://imasters.com.br/desenvolvimento/conheca-os-operadores-bitwise-bit-bit" rel="noopener noreferrer"&gt;https://imasters.com.br/desenvolvimento/conheca-os-operadores-bitwise-bit-bit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos tentar entender essa operação bit a bit, ou bitwise, utilizada aqui.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;**Nota:&lt;/em&gt;* aqui fica claro a importância de saber sobre as bases numéricas: você tem um dado da realidade, e tem várias maneiras de quantificá-lo. Nós temos razões culturais para usarmos as bases decimais para quantificar a maioria das coisas, por isso, ao nos referirmos, por exemplo, ao número dez, dizendo "temos aqui, dez árvores", sabemos exatamente a quantidade de um determinado dado da realidade; no exemplo, sabemos que temos dez árvores.*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Por razões, também culturais, agora, com a existência dos computadores, nós passamos a usar as bases hexadecimal, octal e binária, nessa área.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Sendo assim, podemos dizer que temos: 10 árvores, em decimal. 0xA árvores em Hexadecimal, 012 árvores, em Octal, 0b1010 árvores, em Binário.&lt;br&gt;
A quantidade na realidade não mudou, apenas a forma de representá-la é que foi alterada. &lt;br&gt;
Os sufixos utilizados aqui são uma convenção, utilizada na linguagem C, sendo ZERO (0) para octal, ZERO XIS (0x) para hexadecimal, ZERO BE (0b) para binário, e NADA DE SUFIXO para decimal.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Cada uma das bases têm sua razão de existir. Recomendo ler:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/Why-are-binary-octal-and-hexadecimal-number-systems-popular-in-computing" rel="noopener noreferrer"&gt;https://www.quora.com/Why-are-binary-octal-and-hexadecimal-number-systems-popular-in-computing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.computerengineeringconcepts.org/2.3-Binary-Octal-and-Hexadecimal" rel="noopener noreferrer"&gt;https://www.computerengineeringconcepts.org/2.3-Binary-Octal-and-Hexadecimal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Binary_number" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Binary_number&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Octal" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Octal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Hexadecimal" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Hexadecimal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Primeiro, um exemplo da operação bitwise &lt;strong&gt;AND&lt;/strong&gt;, com o número &lt;strong&gt;7&lt;/strong&gt;, que em binário é &lt;strong&gt;0111&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    7 AND 7 ou TEST 7, 7

    0b0111
    0b0111
    ------
    0b0111
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Operação &lt;strong&gt;AND&lt;/strong&gt;: 0b1 AND 0b1 = 0b1&lt;br&gt;
              0b1 AND 0b0 = 0b0&lt;br&gt;
Ela só resulta em 0b1 se &lt;strong&gt;ambos&lt;/strong&gt; os operandos forem 0b1.&lt;br&gt;
Se um dos operandos for 0b0, a operação resulta em 0b0.&lt;br&gt;
&lt;strong&gt;No windows: abra sua calculadora, escolha o modo programador, e faça as contas.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; &lt;em&gt;O zero à esquerda não diz nada, nem precisaria ali estar. 0111 e 111 dão na mesma.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Você precisa saber sobre algumas convenções de tamanhos, chamadas WORD. DWORD e QWORD.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Observações: 1.essas WORDS são traduzidas como "palavra", eu não gosto dessa tradução, por isso não uso. Mas você pode ver materiais falando sobre "o tamanho da palavra".&lt;/em&gt;&lt;br&gt;
&lt;em&gt;2.O tamanho real a que cada WORD se refere pode mudar conforme o sistema operacional.&lt;/em&gt; &lt;br&gt;
&lt;em&gt;Leia:&lt;/em&gt; &lt;a href="https://mentebinaria.gitbook.io/engenharia-reversa/numeros/o-byte" rel="noopener noreferrer"&gt;https://mentebinaria.gitbook.io/engenharia-reversa/numeros/o-byte&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sobre o zero aqui mostrado: -resumindo- um byte tem oito bits. O número sete, se representado segundo uma convenção, que pede que, todos os números sejam mostrados como BYTES, seria representado assim: 0000 0111. Viu? Oito bits (1 BYTE = 8 bits), em duas colunas, com quatro valores cada.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Por costume, valores que usam quatro bits ou menos, eu os represento como "0000".&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Registrador EFLAGS
&lt;/h4&gt;

&lt;p&gt;Nós temos também um registrador especial, chamado &lt;strong&gt;EFLAGS&lt;/strong&gt;, que possui todas as flags usadas pelo sistema, cada uma com um propósito diferente, que por sua vez, serão emitidas em determinadas operações, com o fim de sinalizar alguma coisa (leia o manual da Intel, link abaixo). Não vou me estender na explicação.&lt;br&gt;
Para saber mais sobre EFLAGS, confira essa parte do livro gratuito de Assembly: &lt;a href="https://mentebinaria.gitbook.io/assembly/aprofundando-em-assembly/flags-do-processador" rel="noopener noreferrer"&gt;https://mentebinaria.gitbook.io/assembly/aprofundando-em-assembly/flags-do-processador&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora nós precisamos saber que, nesse registrador, nós temos uma flag chamada &lt;strong&gt;ZeroFlag&lt;/strong&gt;.&lt;br&gt;
Essa flag, em conjunto com as instruções de comparação, &lt;code&gt;cmp&lt;/code&gt; e &lt;code&gt;test&lt;/code&gt;, e as instruções de salto condicional, serve para controle do fluxo de execução do programa. &lt;br&gt;
Sobre as instruções de salto condicional, veja: &lt;a href="http://unixwiz.net/techtips/x86-jumps.html" rel="noopener noreferrer"&gt;http://unixwiz.net/techtips/x86-jumps.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; &lt;em&gt;Baixe o manual da Intel. Lá tem todas as instruções listadas, com as condições necessárias para a sua execução (o nome é Jcc para todas as condições diferentes de JMP):&lt;/em&gt; &lt;a href="https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html" rel="noopener noreferrer"&gt;https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbuw3qquunfyw97e83c7w.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbuw3qquunfyw97e83c7w.PNG" alt="Image description" width="662" height="310"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;É o primeiro link do site, apontado pela seta vermelha na imagem acima.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A operação &lt;strong&gt;TEST CL, CL&lt;/strong&gt; resultando em &lt;strong&gt;0&lt;/strong&gt;, seta a &lt;strong&gt;ZeroFlag&lt;/strong&gt; para 1: &lt;strong&gt;ZF=1&lt;/strong&gt;.&lt;br&gt;
E é isso que a combinação das instruções &lt;strong&gt;TEST&lt;/strong&gt; e &lt;strong&gt;JE&lt;/strong&gt; (Jump if equal) faz:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;se(ZF==1) então Pule para a localização, se não, se(ZF==0) não pule
if(ZF==1) then Jump to location else if(ZF==0) don't jump
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  CL
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;ECX&lt;/strong&gt; é um registrador de 32 bits, e podemos usar apenas "uma parte dele", "dividindo-o":&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg3eb8ghnxy5bh097fjrw.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg3eb8ghnxy5bh097fjrw.PNG" alt="Image description" width="664" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fghwzxgbadzaowz6jlysw.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fghwzxgbadzaowz6jlysw.PNG" alt="Image description" width="199" height="123"&gt;&lt;/a&gt; &lt;br&gt;
(OBS: ignore o &lt;strong&gt;RCX&lt;/strong&gt;, que é o nome usado para registradores de 64 bits, os coloquei ali para que você saiba da existência dele). &lt;/p&gt;

&lt;p&gt;Quando usamos um registrador como &lt;strong&gt;ECX&lt;/strong&gt;, usamos TODO ele, nossos dados de 4 bytes &lt;br&gt;
(4 bytes são 32 bits) ocupam todos os espaços -incluindo os 32 bits de ECX, os 16 bits de CX, os 8 bits de CH, e os 8 bits de CL.&lt;/p&gt;

&lt;p&gt;Mantenha em mente que &lt;strong&gt;ECX&lt;/strong&gt; é um corpo completo, e podemos usar uma parte específica dele, obrigando o computador a ler/escrever somente na parte desejada, sendo CX, CH ou CL.&lt;/p&gt;

&lt;p&gt;"Curiosidade": antigamente existiam processadores de 16 bits, &lt;strong&gt;CH&lt;/strong&gt; ficava com os 8 bits mais significantes e &lt;strong&gt;CL&lt;/strong&gt; com os 8 bits menos significantes, e hoje em dia ainda é assim, só que os registradores possuem mais espaço; mais espaço, mais divisões.&lt;/p&gt;

&lt;p&gt;Para saber mais sobre &lt;strong&gt;bits mais significantes&lt;/strong&gt; e &lt;strong&gt;menos significantes&lt;/strong&gt; (MSB e LSB),&lt;br&gt;
acesse o link: &lt;a href="https://www.morningstar.io/post/2016/12/25/midi-msb-and-lsb#:%7E:text=MSB%20stands%20for%20most%20significant,4%20bits%20would%20be%200011" rel="noopener noreferrer"&gt;https://www.morningstar.io/post/2016/12/25/midi-msb-and-lsb#:~:text=MSB%20stands%20for%20most%20significant,4%20bits%20would%20be%200011&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CH&lt;/strong&gt; e &lt;strong&gt;CL&lt;/strong&gt;: o "C" é padrão para Counter (mas o registrador é de propósito geral, então pode ser usado para quase "qualquer coisa"), o &lt;strong&gt;H&lt;/strong&gt; significa "High byte" e o &lt;strong&gt;L&lt;/strong&gt; "Low byte"&lt;br&gt;
(o E de ECX é de extended, lembra que era CX -16 bits? Ele foi "extendido" para 32 bits).&lt;br&gt;
Mais sobre: &lt;a href="https://en.wikipedia.org/wiki/IA-32" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/IA-32&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  O Processo de Tratamento do Input
&lt;/h3&gt;

&lt;p&gt;Se você já sabe o input/code certo, coloque um breakpoint na instrução &lt;code&gt;test cl, cl&lt;/code&gt;, depois insira o input/code correto, rode o programa, e perceba como &lt;strong&gt;CL&lt;/strong&gt; vai estar com o valor &lt;strong&gt;0&lt;/strong&gt; durante o teste; inserindo um valor errado, ele vai estar com valor 1 nesse momento.&lt;br&gt;
Assim temos a prova de que é realmente ali que acontece confirmação final do input inserido.&lt;/p&gt;

&lt;p&gt;Mantenha o breakpoint na instrução &lt;code&gt;test cl, cl&lt;/code&gt;, insira um input errado e rode novamente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11q0e7tzjeqzwptkqrbq.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11q0e7tzjeqzwptkqrbq.PNG" alt="Image description" width="676" height="319"&gt;&lt;/a&gt;&lt;br&gt;
O registrado EFLAGS (circulado em vermelho, a direita) nos mostra que a ZeroFlag vai ser modificada na próxima operação através do traço vermelho abaixo de &lt;strong&gt;ZF&lt;/strong&gt;.&lt;br&gt;
Circulado em preto, temos o valor contido em &lt;strong&gt;CL&lt;/strong&gt;, bem como vemos sublinhado em verde na coluna dos registradores.&lt;br&gt;
Foi inserido um input/code errado, e a ZeroFlag será setada para 0, dizendo que não tivemos o resultado 0 na operação TEST. Dê um stepover e veja por si mesmo.&lt;/p&gt;



&lt;p&gt;Perceba que &lt;strong&gt;antes&lt;/strong&gt; de &lt;code&gt;test cl, cl&lt;/code&gt; nós temos a instrução &lt;code&gt;pop ecx&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A instrução &lt;code&gt;pop&lt;/code&gt; pega o valor que está no &lt;strong&gt;topo&lt;/strong&gt; da stack/pilha (visível no registrador &lt;strong&gt;ESP&lt;/strong&gt;), e carrega para dentro do operando, que no nosso caso é o &lt;strong&gt;ECX&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; &lt;em&gt;Não se esqueça de que o registrador **ESP&lt;/em&gt;* contém o endereço do topo da stack/pilha, e dentro desse endereço há um valor, e é ele que o pop "joga" para dentro de &lt;strong&gt;ECX&lt;/strong&gt;.*&lt;/p&gt;

&lt;p&gt;Breakpoint na Instrução &lt;code&gt;pop ecx&lt;/code&gt;, inserimos um input errado, clicamos em "OK":&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08geibku4ooaw04yvnda.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08geibku4ooaw04yvnda.PNG" alt="Image description" width="542" height="37"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse momento, o topo da nossa stack/pilha está assim (o input foi "AAA", que é errado):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl29fvaipv2q37j23uvvh.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl29fvaipv2q37j23uvvh.PNG" alt="Image description" width="295" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como o code/input não é o correto, o topo da stack está com 1.&lt;br&gt;
(Se você já tem o code/input correto, como mencionado anteriormente, insira-o, e veja que, ao chegar nesse ponto, a stack/pilha está com o valor &lt;strong&gt;0&lt;/strong&gt; no topo). Preste atenção no endereço do topo da stack/pilha, é ele que, mais tarde, vai nos levar até a função que dita se o input/code está certo ou errado.&lt;/p&gt;

&lt;p&gt;Apenas o bit menos significativo de &lt;strong&gt;ECX&lt;/strong&gt;, &lt;strong&gt;CL&lt;/strong&gt;, é usado para a operação seguinte.&lt;br&gt;
Com isso, na operação &lt;code&gt;test cl, cl&lt;/code&gt; (é o mesmo que &lt;code&gt;test 1, 1&lt;/code&gt;) temos o resultado 1, a &lt;strong&gt;ZeroFlag&lt;/strong&gt; não é setada (&lt;code&gt;ZF=0&lt;/code&gt;), então o programa &lt;strong&gt;não pula&lt;/strong&gt; para &lt;code&gt;crackme1.4016F6&lt;/code&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  Vamos rastrear a origem desse valor no topo da stack
&lt;/h3&gt;

&lt;p&gt;Como já vimos que é o valor, zero ou um, que está no topo da pilha, no momento do &lt;code&gt;pop ecx&lt;/code&gt;, que determina o nosso sucesso ou erro, a depender do input, vamos agora tentar encontra a origem desse número.&lt;br&gt;
Os valores que se encontram na stack/pilha, durante o breakpoint em &lt;code&gt;pop ecx&lt;/code&gt;, têm origem em alguma operação da função atual.&lt;/p&gt;

&lt;p&gt;As instruções responsáveis por lidar com valores da stack/pilha, são &lt;strong&gt;POP&lt;/strong&gt; e &lt;strong&gt;PUSH&lt;/strong&gt;.&lt;br&gt;
    &lt;strong&gt;POP&lt;/strong&gt;: Carrega o valor do topo da pilha para o local especificado pelo operando de destino (ou opcode explícito) e, em seguida, incrementa o ponteiro da stack/pilha (&lt;strong&gt;ESP&lt;/strong&gt;).&lt;br&gt;
    &lt;strong&gt;PUSH&lt;/strong&gt;: Decrementa o ponteiro da stack/pilha (&lt;strong&gt;ESP&lt;/strong&gt;) e armazena o operando de origem no topo da pilha.&lt;br&gt;
Não deixe de consultar o manual da Intel para saber mais!&lt;/p&gt;

&lt;p&gt;Lembre-se que o valor retornado por uma função é "guardado" no registrador &lt;strong&gt;EAX&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nota: Aqui eu assumo que você já leu o primeiro tutorial, relacionado ao x64dbg, onde eu explico brevemente as funções em Assembly de x86. Novamente colocarei o link aqui:&lt;/em&gt; &lt;a href="https://dev.to/ryan_gozlyngg/engenharia-reversa-primeiro-contato-parte-1-2gih"&gt;https://dev.to/ryan_gozlyngg/engenharia-reversa-primeiro-contato-parte-1-2gih&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Segue o passo a passo efetuado:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Setamos um breakpoint nas três instruções &lt;code&gt;call&lt;/code&gt; mais próximas ao &lt;code&gt;test cl, cl&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Execute o programa novamente, até que ele chegue no breakpoint. Para fazer isso, basta dar um "Run" (atalho: &lt;strong&gt;F9&lt;/strong&gt;), para ele sair dos breakpoints e pedir o input novamente.&lt;/li&gt;
&lt;li&gt;Insira uma mensagem ERRADA no input/code. Clique em "Ok" para continuar.&lt;/li&gt;
&lt;li&gt;Dê um &lt;strong&gt;step over&lt;/strong&gt; com &lt;strong&gt;F8&lt;/strong&gt; até o &lt;strong&gt;EIP&lt;/strong&gt; passar da instrução call, e verifique registrador &lt;strong&gt;EAX&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Verificamos se o valor contido em &lt;strong&gt;EAX&lt;/strong&gt; é colocado no topo da stack/pilha (geralmente com a instrução &lt;code&gt;push eax&lt;/code&gt;). &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;MUITA ATENÇÃO NO 6° PASSO&lt;/strong&gt;: o endereço do topo da stack/pilha, em &lt;strong&gt;ESP&lt;/strong&gt;, precisa ser &lt;code&gt;0x19EFDC&lt;/code&gt; imediatamente depois da instrução &lt;code&gt;call&lt;/code&gt;. Isso porque, no momento do &lt;code&gt;pop ecx&lt;/code&gt; em xxxxx, o endereço (da stack/pilha) &lt;code&gt;0x19EFD8&lt;/code&gt; é que está com o nosso valor (0 ou 1) para o &lt;code&gt;test cl, cl&lt;/code&gt;, e agora estamos assumindo que esse valor foi guardado na stack/pilha via instrução &lt;strong&gt;PUSH&lt;/strong&gt;, a qual decrementa o endereço de &lt;strong&gt;ESP&lt;/strong&gt;, e se você leu a documentação da Intel, sabe que &lt;strong&gt;ESP&lt;/strong&gt; é decrementado por &lt;strong&gt;4&lt;/strong&gt;. Logo &lt;code&gt;0x19EFDC - 4 = 0x19EFD8&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;(O manual nos diz: The operand size (16, 32, or 64 bits) determines the amount by which the stack pointer is decremented (2, 4 or 8). No nosso caso, como veremos logo, o operado é &lt;strong&gt;EAX&lt;/strong&gt;, logo 32 bits, decrementado por 4).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; &lt;em&gt;Setando Breakpoint - alguns detalhes:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Como você já sabe, setamos um breakpoint em uma instrução, dentro do x64dbg, com a tecla **F2&lt;/em&gt;&lt;em&gt;:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Selecione a linha desejada, e aperte **F2&lt;/em&gt;&lt;em&gt;, a "bolinha" no canto esquerdo ficará **vermelha&lt;/em&gt;&lt;em&gt;.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Se você clicar em cima dessa "bolinha", a "bolinha" ficará com verde, desabilitando o breakpoint.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Clicando na "bolinha" uma terceira vez, você removerá o breakpoint.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; &lt;em&gt;Ao clicar duas vezes em uma instrução &lt;code&gt;call&lt;/code&gt;, ou dar um **step in&lt;/em&gt;* com o EIP nela (lembre da "setinha" na esquerda, que aponta para onde está o EIP), você vai entrar, ser direcionado, até o código dessa função.*&lt;br&gt;
&lt;em&gt;Como fazemos para voltar à instrução anterior? Para isso usamos o seguinte atalho:&lt;/em&gt; &lt;code&gt;-&lt;/code&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Observando a stack
&lt;/h3&gt;

&lt;p&gt;Ao efetuar os passos acima...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyr0t7btc4n3cz1wexdrq.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyr0t7btc4n3cz1wexdrq.PNG" alt="Image description" width="797" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na imagem, você pode ver que eu inseri "AAA" como code/input, e por estar errado, precisamos ver o "1" no topo da stack/pilha ao passarmos por está &lt;code&gt;call&lt;/code&gt;, no endereço que buscamos.&lt;br&gt;
Observe as instruções. Na imagem, paramos antes da função ser executada.&lt;br&gt;
Executamos um stepover (&lt;strong&gt;F8&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmrwj5ai4xrb52kiain86.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmrwj5ai4xrb52kiain86.PNG" alt="Image description" width="787" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos ver que no topo da stack/pilha temos o endereço desejado, e no campo das instruções temos &lt;code&gt;push eax&lt;/code&gt;, que decrementará o nosso &lt;strong&gt;ESP&lt;/strong&gt;, colocando o valor "1" de &lt;strong&gt;EAX&lt;/strong&gt; no topo da stack/pilha.&lt;/p&gt;

&lt;p&gt;Bem como estávamos procurando!&lt;/p&gt;


&lt;h3&gt;
  
  
  Retorno de Função
&lt;/h3&gt;

&lt;p&gt;Um breve exemplo de um programa em C comentando o comportamento do código quando em Assembly de x86, para reforçar que o valor de retorno de uma função, em programas x86, é passado para &lt;strong&gt;EAX&lt;/strong&gt; (na grande maioria dos casos, lembre-se das calling conventions).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// programa em C

/* Função SOMA: soma dois numeros a + b e retorna resultado */
int soma(int a, int b){
   int resposta_da_soma;

   resposta_da_soma = a + b;

   return resposta_da_soma; // esse valor é retornado em EAX
}

/* Função principal Main */
int main(){
   int a = 2;
   int b = 3;
   int resultado;

   // chama função com soma de dois valores 
   // aqui será uma call: call soma.endereço
   resultado = soma(a, b).

  // Aqui dentro da main, nesse momento teremos em EAX o número 5
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Observando a Função crackme1.46B828
&lt;/h3&gt;

&lt;p&gt;Antes de entrarmos na função, vamos ver os argumentos que são passados para ela.&lt;br&gt;
Eu não vou explicar como as &lt;strong&gt;Calling Conventions&lt;/strong&gt; funcionam, e é esse conhecimento que vai lhe ajudar a entender como os argumentos são passados para funções. Sim, existe mais de uma maneira de passar argumentos para funções em Assembly. &lt;br&gt;
Para entender melhor sobre elas, acesse os links: &lt;a href="https://mentebinaria.gitbook.io/assembly/programando-junto-com-c/convencoes-de-chamada-no-windows" rel="noopener noreferrer"&gt;https://mentebinaria.gitbook.io/assembly/programando-junto-com-c/convencoes-de-chamada-no-windows&lt;/a&gt;&lt;br&gt;
&lt;a href="https://en.wikipedia.org/wiki/X86_calling_conventions" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/X86_calling_conventions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em resumo, as convenções de chamada (calling conventions) ditam como os argumentos de uma função vão ser passados a ela. Aqui nós podemos ver que antes da função ser chamada, o endereço de algo que está em &lt;code&gt;[ebp-10]&lt;/code&gt; é carregado em &lt;strong&gt;EDX&lt;/strong&gt;, e também vemos que o que está no topo da stack é colocado dentro de &lt;strong&gt;EAX&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F18skqq5201jsd78c234f.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F18skqq5201jsd78c234f.PNG" alt="Image description" width="470" height="47"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos ver, brevemente, o que essas funções, &lt;code&gt;lea&lt;/code&gt; e &lt;code&gt;pop&lt;/code&gt; estão fazendo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lea&lt;/code&gt; - Load Efective Address: Carrega o endereço de qualquer coisa que está em &lt;code&gt;[ebp-10]&lt;/code&gt; e guarda em &lt;strong&gt;EDX&lt;/strong&gt;. Para entender &lt;code&gt;[ebp-10]&lt;/code&gt;, segue o link: &lt;a href="https://mentebinaria.gitbook.io/assembly/a-base/enderecamento" rel="noopener noreferrer"&gt;https://mentebinaria.gitbook.io/assembly/a-base/enderecamento&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pop&lt;/code&gt; - Pega oque está no TOPO da stack/pilha e guarda no operando, aqui é guardado em &lt;strong&gt;EAX&lt;/strong&gt;, e em seguida incrementa o topo da stack/pilha.&lt;/p&gt;

&lt;p&gt;Os argumentos foram passados através dos registradores &lt;strong&gt;EAX&lt;/strong&gt; e &lt;strong&gt;EDX&lt;/strong&gt;.&lt;br&gt;
Entrando na função isso vai ficar claro.&lt;/p&gt;




&lt;h3&gt;
  
  
  Encontrando valores no Dump
&lt;/h3&gt;

&lt;p&gt;Vamos ver rapidamente como rastreamos valores no x64dbg.&lt;br&gt;
(Algo como &lt;code&gt;[ebp-10]&lt;/code&gt; é carregado em &lt;strong&gt;EDX&lt;/strong&gt;, basta um &lt;strong&gt;step-over&lt;/strong&gt; para executar a instrução, e aí verificamos oque é que foi carregado em &lt;strong&gt;EDX&lt;/strong&gt;, muito mais simples)...&lt;/p&gt;

&lt;p&gt;Vamos ver quais valores se encontram em &lt;code&gt;[ebp-10]&lt;/code&gt;, e no topo da stack nessa hora:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1rxdu4lnd0nxo7ivehw4.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1rxdu4lnd0nxo7ivehw4.PNG" alt="Image description" width="711" height="116"&gt;&lt;/a&gt;&lt;br&gt;
Você já deve saber buscar esse valor no dump. Botão direito do mouse na instrução desejada, etc.(basta fazer como na imagem acima). &lt;/p&gt;

&lt;p&gt;Encontre o valor desejado, que no caso é &lt;code&gt;[ebp-10]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agora vamos ao topo da stack/pilha:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjfhnf0p9jiqy8ybpj1xt.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjfhnf0p9jiqy8ybpj1xt.PNG" alt="Image description" width="276" height="117"&gt;&lt;/a&gt;&lt;br&gt;
Perceba que o topo da stack/pilha (em &lt;strong&gt;ESP&lt;/strong&gt;) é sempre destacado em verde na Janela da Stack.&lt;br&gt;
Vamos ver os valores carregados nos registradores:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbm7xblca27fk0v06k33w.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbm7xblca27fk0v06k33w.PNG" alt="Image description" width="282" height="90"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perceba que &lt;strong&gt;EDX&lt;/strong&gt; tem um comentário que nos diz que o valor &lt;code&gt;0x0019F02C&lt;/code&gt; é um endereço para a string "***vErYeAsY***". Sabemos que é um endereço pelo símbolo "&amp;amp;".&lt;br&gt;
Você pode segui-lo no dump e confirmar isso.&lt;/p&gt;

&lt;p&gt;Em &lt;strong&gt;EAX&lt;/strong&gt; temos o valor &lt;code&gt;0x0019F030&lt;/code&gt;, e para sabermos oque tem lá, podemos segui-lo no dump.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmkojmy3tyjvh7s5s9kau.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmkojmy3tyjvh7s5s9kau.PNG" alt="Image description" width="479" height="104"&gt;&lt;/a&gt;&lt;br&gt;
Perceba o valor que se encontra aqui. Parece outro endereço.&lt;br&gt;
Podemos tentar seguir ele no dump também.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqsq8pygepicuy5eb3to1.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqsq8pygepicuy5eb3to1.PNG" alt="Image description" width="481" height="106"&gt;&lt;/a&gt;&lt;br&gt;
Chegamos nesse lugar. Observe que é aqui que se encontra o nosso code/input.&lt;br&gt;
0x41 é o mesmo que o char 'A'. Cada 0x41 é um byte, você tem ali a seguinte string:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; "AAA\0" 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Os três caracteres 'A', mais o &lt;code&gt;null terminator&lt;/code&gt; &lt;code&gt;\0&lt;/code&gt;, que indica o fim da string.&lt;br&gt;
 Confira: &lt;a href="https://man7.org/linux/man-pages/man7/ascii.7.html" rel="noopener noreferrer"&gt;https://man7.org/linux/man-pages/man7/ascii.7.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então é isso, essa função está recebendo os endereços das duas strings como argumento.&lt;br&gt;
Nos perguntamos: Será que ela vai comparar a nossa string "AAA" com essa string diferente aí??? E então testamos a string "***vErYeAsY***" como code/input.&lt;br&gt;
E então é isso, funcionou!&lt;/p&gt;




&lt;h3&gt;
  
  
  Entrando na Função crackme1.46B828
&lt;/h3&gt;

&lt;p&gt;Para entrar na função utilize o &lt;strong&gt;STEP-INTO&lt;/strong&gt; (&lt;strong&gt;F7&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Dentro da função:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6s8095yb9t16wo3rrqsx.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6s8095yb9t16wo3rrqsx.PNG" alt="Image description" width="418" height="127"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perceba que aqui dentro, a função pega os argumentos, que são endereços, e os "desreferencía", fazendo com que os valores reais dentro daqueles endereços sejam guardados agora em &lt;strong&gt;EAX&lt;/strong&gt; e &lt;strong&gt;EDX&lt;/strong&gt;. Portanto, depois dessas operações &lt;strong&gt;MOV&lt;/strong&gt;, os nossos registradores conterão os endereços diretos para nossas strings puras (perceba que antes disso nós temos um endereço para um endereço).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frqohitav40kliumkda4f.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frqohitav40kliumkda4f.PNG" alt="Image description" width="265" height="59"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Observação: geralmente as funções chamam outras funções, que chamam outras funções, e chega em um nível em que você deve se perguntar: vale mesmo apena entrar em todas essas funções? Será que estou no caminho certo?&lt;/p&gt;

&lt;p&gt;O que me fez perceber que estava no caminho certo aqui, foi a instrução que vem depois da &lt;code&gt;call crackme1.460C48&lt;/code&gt;, a instrução &lt;code&gt;setne al&lt;/code&gt; (sobre ela mais a frente).&lt;br&gt;
&lt;strong&gt;AL&lt;/strong&gt; é a parte "mais baixa" de &lt;strong&gt;EAX&lt;/strong&gt;, sabemos que ele contém o retorno da função após a execução dela. E a operação que é feita com &lt;strong&gt;AL&lt;/strong&gt; nos dá o retorno "1" que buscamos.&lt;/p&gt;

&lt;p&gt;Por isso achei que valia apena continuar entrando nas funções.&lt;br&gt;
Como aqui o programa já foi quebrado, e o desafio já foi vencido, eu estava motivado apenas por pura curiosidade de entender como o programa funciona, então achei que valia continuar com a busca.&lt;/p&gt;

&lt;p&gt;Vamos para essa outra função agora.&lt;/p&gt;




&lt;h3&gt;
  
  
  Entendendo como chegamos ao resultado
&lt;/h3&gt;

&lt;p&gt;Vou expor o processo de maneira linear (atenção: não vou expor o processo todo devido ao tamanho que o texto ficaria, vou focar nos pontos mais importantes para esse exemplo).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nota: antes de tudo, perceba que, conforme o tamanho da nossa string digitada no input, o programa faz um caminho diferente dentro dessa função, já que ele compara alguns caracteres por vez. Sendo assim, quanto maior a nossa string, mais testes serão feitos.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;No teste abaixo foi utilizado uma string de três caracteres: "AAA".&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Acompanhe parte do processo da função &lt;code&gt;0x00460C48&lt;/code&gt;, começando pela comparação:&lt;/p&gt;

&lt;p&gt;Passando do prólogo da função nós temos:&lt;/p&gt;

&lt;p&gt;1.&lt;code&gt;cmp eax, edx&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Compara os endereços das duas strings.&lt;br&gt;
A instrução &lt;strong&gt;CMP&lt;/strong&gt; faz uma subtração: &lt;code&gt;eax - edx&lt;/code&gt;. A diferença é que aqui o resultado não é salvo, e os operandos permanecem os mesmos.&lt;br&gt;
Perceba que como os endereços estão sendo comparados, a próxima instrução, que é um salto "pule se for igual", não acontece.&lt;/p&gt;




&lt;p&gt;2.&lt;code&gt;test esi, esi&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Verificando se o code/input não está vazio, caso esteja, ele pula para o fim da função e termina retornando &lt;strong&gt;1&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;3.&lt;code&gt;test edi, edi&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Verificando se a string com o code/input correto, passada pelo programador, não está vazia.&lt;/p&gt;




&lt;p&gt;4.&lt;code&gt;mov eax, dword ptr ds:[esi+4]&lt;/code&gt;&lt;br&gt;
   &lt;code&gt;mov edx, dword ptr ds:[edi+4]&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;EAX&lt;/strong&gt; recebe o tamanho da string que passamos para o code/input&lt;br&gt;
&lt;code&gt;edx&lt;/code&gt; recebe o tamanho da string que o programador passou para a função.&lt;br&gt;
O tamanho das strings foi calculado em outra função.&lt;/p&gt;




&lt;p&gt;5.&lt;code&gt;sub eax, edx&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;subtrai &lt;strong&gt;EDX&lt;/strong&gt; de &lt;strong&gt;EAX&lt;/strong&gt;. A string correta tem o tamanho de 14 bytes, em hexa são 0xE.&lt;br&gt;
A conta: &lt;br&gt;
    COM O INPUT "AAA": 3 - 14 = -11 ou 0xFFFFFFF5&lt;br&gt;
    COM O INPUT CORRETO: 14 - 14 = 0    &lt;/p&gt;

&lt;p&gt;O resultado é guardado em &lt;strong&gt;EAX&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Se ambos estiverem com o valor de 14 bytes, sendo a string correta ou não, a operação &lt;code&gt;sub eax, edx&lt;/code&gt; resultaria em ZeroFlag = 1, e CarryFlag = 0.&lt;br&gt;
Lembre-se que se uma operação resultar em zero, a &lt;strong&gt;ZeroFlag&lt;/strong&gt; é setada, recebendo o valor "1".&lt;/p&gt;




&lt;p&gt;6.&lt;code&gt;ja crackme1.460C6B&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JA&lt;/strong&gt; - Jump if above, pula se as flags &lt;strong&gt;CF&lt;/strong&gt; e &lt;strong&gt;ZF&lt;/strong&gt; forem ambas iguais a &lt;strong&gt;0&lt;/strong&gt;.&lt;br&gt;
Em outras palavras, o salto só será executado caso a nossa string seja &lt;strong&gt;==maior==&lt;/strong&gt; que a string do programador. &lt;br&gt;
Com a nossa string sendo maior que a string do programador, a CarryFlag não é setada, porque não temos um resultado negativo, e a ZeroFlag não é setada, porque a operação não resulta em zero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CF ou Carray Flag&lt;/strong&gt;: Caso a operação aritmética precise utilizar o bit mais significante (MSB - que é o bit mais à esquerda) para guardar o resultado, a &lt;strong&gt;CF&lt;/strong&gt; é setada para "1".&lt;/p&gt;

&lt;p&gt;O bit mais a esquerda é usado quando precisamos representar um número com sinal, um número negativo.&lt;/p&gt;

&lt;p&gt;Como o resultado da operação com a string menor "AAA" seta a Carry Flag, o programa não executa o salto. Já com a string correta, ele executa o salto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resumindo:&lt;/strong&gt;&lt;br&gt;
    Com Uma ==String Menor==: [CarryFlag é setada e o salto não é executado]&lt;br&gt;
    Com Uma ==String de 14 bytes==: [ZeroFlag é setada e o salto não é executado]&lt;/p&gt;

&lt;p&gt;Todo esse processo foi para ver se o code/input passado por nós é maior que a string do programador.&lt;/p&gt;




&lt;h4&gt;
  
  
  Caso o salto não seja executado, as seguintes instruções são usadas
&lt;/h4&gt;

&lt;p&gt;7.&lt;code&gt;add edx, eax&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;COM UMA STRING MENOR&lt;/strong&gt;&lt;br&gt;
    Usei a string "AAA".&lt;br&gt;
    &lt;code&gt;eax: 0xFFFFFFF5 - no caso de "AAA" (ou qualquer string de três bytes)&lt;/code&gt;&lt;br&gt;
    &lt;code&gt;edx: 0xE&lt;/code&gt;&lt;br&gt;
    Cálculo: 0xE + 0xFFFFFFF5 = 00000003 (Resultado vem com o MSB setado: 100000003)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;COM UMA STRING DE 14 BYTES&lt;/strong&gt;&lt;br&gt;
    &lt;code&gt;eax: 0 - resultado da subtração de 14 - 14&lt;/code&gt;&lt;br&gt;
    &lt;code&gt;edx: 0xE - tamanho da string em hexadecimal (0xE = 14)&lt;/code&gt;&lt;br&gt;
    Cálculo: 0xE + 0 = 0xE&lt;/p&gt;

&lt;p&gt;Aqui estamos restaurando o número de bytes da nossa string para &lt;strong&gt;EDX&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O resultado é guardado em &lt;strong&gt;EDX&lt;/strong&gt;.&lt;br&gt;
E em seguida o resultado é guardado na stack com &lt;code&gt;push edx&lt;/code&gt;.&lt;/p&gt;




&lt;p&gt;8.&lt;code&gt;shr edx, 2&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Aqui o programa usa a instrução &lt;strong&gt;SHR&lt;/strong&gt;, com &lt;strong&gt;EDX&lt;/strong&gt; e o número &lt;strong&gt;2&lt;/strong&gt;. &lt;br&gt;
&lt;strong&gt;SHR&lt;/strong&gt; é usada para mover os bits de &lt;strong&gt;EDX&lt;/strong&gt; duas casas para a direita.&lt;br&gt;
Para cada bit movido para a direita, um zero é adicionado à esquerda.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EXEMPLO COM UMA STRING DE 14 BYTES&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;EDX está com o valor 0xE ou 14.&lt;br&gt;
  14 em binário é: 1110&lt;br&gt;
  Agora vamos mover os bits para a direita duas vezes:&lt;/p&gt;

&lt;p&gt;1110&lt;br&gt;
  0111 -&amp;gt; 1.movemos um bit para a direita e adicionamos um zero à esquerda&lt;br&gt;
  0011 -&amp;gt; 2.movemos um bit para a direita e adicionamos um zero à esquerda&lt;/p&gt;

&lt;p&gt;Agora nós ficamos com o resultado 0011 que é 3 (três é representado da mesma forma em hexadecimal e em decimal).&lt;/p&gt;

&lt;p&gt;Ao terminar a instrução, aqui temos &lt;strong&gt;EDX&lt;/strong&gt; = 3.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;EXEMPLO COM UMA STRING DE 3 BYTES&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;EDX está com o valor 3.&lt;br&gt;
  3 em binário é: 0011&lt;br&gt;
  Agora vamos mover os bits para a direita duas vezes:&lt;/p&gt;

&lt;p&gt;0011&lt;br&gt;
  0001 -&amp;gt; 1.movemos um bit para a direita e adicionamos um zero à esquerda&lt;br&gt;
  0000 -&amp;gt; 2.movemos um bit para a direita e adicionamos um zero à esquerda&lt;/p&gt;

&lt;p&gt;Agora nós ficamos com o resultado 0000 que é 0 (zero é representado da mesma forma em hexadecimal e em decimal).&lt;/p&gt;

&lt;p&gt;Ao terminar a instrução, aqui temos &lt;strong&gt;EDX&lt;/strong&gt; = 0.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;9.&lt;code&gt;je&lt;/code&gt; &lt;br&gt;
se &lt;code&gt;shr edx, 2 == 0&lt;/code&gt; (Testando para ver se a operação resultou em zero)&lt;br&gt;
a operação serve para o programa decidir qual caminho tomar baseado no tamanho da string que nós passamos para ele.&lt;br&gt;
Se for uma muito pequena, ele vai pular para uma comparação de um único byte, o mais a direita.&lt;br&gt;
Se a nossa string tiver um tamanho parecido com a correta, ele compara os primeiros 4 bytes, &lt;br&gt;
e assim o programa prossegue, sempre se baseando no tamanho da nossa string.&lt;/p&gt;

&lt;p&gt;Aqui segue os resultados para strings de 0 bytes até as de 14 bytes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvjb63rwm9q9tvz9jvwch.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvjb63rwm9q9tvz9jvwch.PNG" alt="Image description" width="92" height="241"&gt;&lt;/a&gt;&lt;br&gt;
Perceba que as strings de 14, 13 e 12 bytes resultam em 3, forçando a função a ir pelo mesmo caminho, até detectar a divergência de tamanho.&lt;/p&gt;




&lt;h3&gt;
  
  
  Resumindo a lógica da função
&lt;/h3&gt;

&lt;p&gt;Em resumo, você pode entender 100% da lógica sendo usada em qualquer função, mas se você não quer gastar todo o seu tempo com isso, pode começar a pegar padrões de comportamento para todos os tipos de dados processadas, no nosso caso, as strings.&lt;/p&gt;

&lt;p&gt;Aqui não vou mostrar o que cada uma das instruções seguintes faz, isso vai deixar esse tutorial mais maçante e longo ainda...&lt;/p&gt;

&lt;p&gt;Mas para quem quer saber oque se passa depois do já mencionado, dentro da função:&lt;br&gt;
Perceba a série de saltos (&lt;code&gt;jmp e jcc&lt;/code&gt;) e comparações (&lt;code&gt;test e cmp&lt;/code&gt;).&lt;br&gt;
A função está percorrendo ambas as strings e comparando os bytes.&lt;br&gt;
A ordem da comparação varia conforme o tamanho da string enviada.&lt;/p&gt;

&lt;p&gt;Bom, sabemos que a função vai retornar um valor dentro de &lt;strong&gt;EAX&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Com nossa string de três caracteres, ao fim da função, perceba que o valor em EAX é quase o mesmo que temos após a instrução &lt;code&gt;sub eax, edx&lt;/code&gt; do passo cinco desse tutorial na parte intitulada "Entendendo como chegamos ao resultado".&lt;/p&gt;

&lt;p&gt;Que tipo de alteração ele sofreu?&lt;/p&gt;

&lt;p&gt;Vamos até a instrução mencionada (&lt;code&gt;sub eax, edx&lt;/code&gt;), e a partir dela, seguimos com a atenção fixada em &lt;strong&gt;EAX&lt;/strong&gt;, uma instrução por vez, com o step-over.&lt;/p&gt;

&lt;p&gt;Se você fez isso, percebeu que o valor se mantém o mesmo em &lt;strong&gt;EAX&lt;/strong&gt; até chegar em uma instrução que soma &lt;strong&gt;EAX&lt;/strong&gt; com ele mesmo desde então.&lt;br&gt;
(Mas lembre-se que o percurso depende do tamanho da string que usamos no code/input).&lt;/p&gt;

&lt;p&gt;Após isso, o programa pula direto para a parte final da função com um salto obrigatório &lt;code&gt;jmp&lt;/code&gt;. &lt;br&gt;
&lt;strong&gt;EAX&lt;/strong&gt; não sofre mais nenhuma alteração, e voltamos a função anterior. &lt;/p&gt;




&lt;h3&gt;
  
  
  Saindo da função e obtendo o resultado definitivo
&lt;/h3&gt;

&lt;p&gt;Agora que você já tem uma noção de como o resultado retornado é formado, vamos ver oque é que nos dá o &lt;strong&gt;resultado definitivo&lt;/strong&gt; para a comparação final.&lt;/p&gt;

&lt;p&gt;Sabemos que a comparação final é, ou com o valor "1" ou com o valor "0".&lt;/p&gt;

&lt;p&gt;A função em que entramos é a seguinte &lt;code&gt;crackme1.46B828&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8c77sdolez2pmfbrgvo.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8c77sdolez2pmfbrgvo.PNG" alt="Image description" width="522" height="123"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Já vimos oque acontece na função chamada em &lt;code&gt;call crackme1.460C48&lt;/code&gt;, e retornamos na instrução &lt;code&gt;setne al&lt;/code&gt;.&lt;/p&gt;




&lt;h4&gt;
  
  
  SETNE - Instrução que gera o resultado
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;setne - Set byte if not equal (ZF=0)&lt;/code&gt;: essa instrução vai mudar o operando (no nosso caso o &lt;strong&gt;AL&lt;/strong&gt;) para &lt;strong&gt;0&lt;/strong&gt; ou &lt;strong&gt;1&lt;/strong&gt;, dependendo do status da &lt;strong&gt;ZeroFlag&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Como vimos antes, o caminho tomado pela instrução anterior, que retorna nosso valor em &lt;strong&gt;EAX&lt;/strong&gt;, depende do tamanho da string enviada. Basta seguir o fluxo da função até ela tomar um salto para o final da instrução, e depois voltar a última instrução de comparação.&lt;/p&gt;

&lt;p&gt;Para voltar para trás, e seguir esse fluxo, basta usar o atalho &lt;code&gt;-&lt;/code&gt; (traço).&lt;br&gt;
Assim vemos onde é que a ZeroFlag é setada.&lt;/p&gt;

&lt;p&gt;Vamos seguir o caso da string "AAA":&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9mxe7mowjbu7rp9a4i1j.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9mxe7mowjbu7rp9a4i1j.PNG" alt="Image description" width="386" height="48"&gt;&lt;/a&gt;&lt;br&gt;
A função nos faz saltar para o final, antes da instrução de retorno &lt;strong&gt;RET&lt;/strong&gt;.&lt;br&gt;
Usamos o atalho até voltarmos ao local com uma instrução de comparação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqcbfmq9nvtjtlpnlzj9h.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqcbfmq9nvtjtlpnlzj9h.PNG" alt="Image description" width="394" height="47"&gt;&lt;/a&gt;&lt;br&gt;
Voltando, vemos o local do salto, e em cima dele, a última instrução de comparação, que está comparando o byte mais à direita da nossa string com a do programador.&lt;br&gt;
Como o resultado é diferente, nós não temos a ZeroFlag setada.&lt;/p&gt;

&lt;p&gt;Sabendo que a ZeroFlag não foi setada, nós também sabemos que a instrução &lt;code&gt;setne al&lt;/code&gt; irá colocar o valor &lt;strong&gt;"1"&lt;/strong&gt; na parte mais baixa (mais a direita) do nosso registrador EAX.&lt;/p&gt;

&lt;p&gt;Após a execução de &lt;code&gt;setne al&lt;/code&gt;, &lt;strong&gt;EAX&lt;/strong&gt; fica com o seguinte valor: &lt;code&gt;0xFFFFFF01&lt;/code&gt;, e para termos apenas o valor setado por &lt;code&gt;setne&lt;/code&gt; em &lt;strong&gt;EAX&lt;/strong&gt;, a instrução &lt;code&gt;and eax, 1&lt;/code&gt; é performada.&lt;/p&gt;

&lt;p&gt;Como "1" é representado como &lt;code&gt;0x00000001&lt;/code&gt; e EAX é &lt;code&gt;0xFFFFFF01&lt;/code&gt;, somente o primeiro byte, mais a direita vai ter o valo "1", caso não seja "0", e qualquer outro byte vai ser mudado para zero. Lembra, operação AND só resulta em "1" se ambos os bits forem "1", e é por isso que, com a string correta, &lt;strong&gt;AL&lt;/strong&gt; é setado para zero, e essa operação AND resulta em zero.&lt;/p&gt;




&lt;h3&gt;
  
  
  Considerações Finais
&lt;/h3&gt;

&lt;p&gt;Espero que você tenha conseguido seguir e entender até aqui.&lt;br&gt;
Espero que tenha pegado o "espirito" da coisa, e se for o caso, que tenha aumentado a sua curiosidade e interesse por esse tipo de conhecimento.&lt;/p&gt;

&lt;p&gt;Para iniciar de verdade na engenharia reversa, eu recomendo começar pela seguinte playlist:&lt;/p&gt;

&lt;h5&gt;
  
  
  CERO - Curso de Engenharia Reversa Online por Mente Binária:
&lt;/h5&gt;

&lt;p&gt;Curso de engenharia reversa em português 100% gratuito.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtube.com/playlist?list=PLIfZMtpPYFP6zLKlnyAeWY1I85VpyshAA&amp;amp;si=3wYZb0E7iHaAFaMm" rel="noopener noreferrer"&gt;https://youtube.com/playlist?list=PLIfZMtpPYFP6zLKlnyAeWY1I85VpyshAA&amp;amp;si=3wYZb0E7iHaAFaMm&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Engenharia Reversa: Primeiro Contato - Parte 1</title>
      <dc:creator>!Ryan Gozlyngg</dc:creator>
      <pubDate>Sun, 17 Mar 2024 15:22:02 +0000</pubDate>
      <link>https://forem.com/ryan_gozlyngg/engenharia-reversa-primeiro-contato-parte-1-2gih</link>
      <guid>https://forem.com/ryan_gozlyngg/engenharia-reversa-primeiro-contato-parte-1-2gih</guid>
      <description>&lt;p&gt;Você vai praticar engenharia reversa pela primeira vez.&lt;br&gt;
"Engenharia reversa", na área de T.I. refere-se à engenharia reversa de software, que, a grosso modo, é a prática de entender o funcionamento de um software alheio, "nos mínimos detalhes".&lt;/p&gt;

&lt;p&gt;Esse tutorial é uma breve introdução ao uso do &lt;strong&gt;debugger x64dbg&lt;/strong&gt;, que é pré-requisito para o próximo tutorial.&lt;/p&gt;

&lt;p&gt;Esse tutorial foi escrito para os iniciantes, o intuito é lhe preparar para o próximo tutorial: Debugando um programa crackme; observe que um é complemento do outro.&lt;br&gt;
Programas "crackme" são softwares com algum tipo de desafio, como, por exemplo, descobrir uma senha de acesso ao próprio crackme.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O maior objetivo disso tudo, é mostrar um pouco desse mundo para pessoas que têm interesse em "baixo nível", mas não sabem se "isso é para elas".&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Quero lhe ajudar a ter o "primeiro gostinho" desse mundo...&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Lista de Conteúdo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;O que é um Debugger&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sobre a Nomenclatura "x64dbg"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Antes de começar&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Baixando o x64dbg&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Abrindo o x64dbg&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mapeando as partes mais usadas da Interface Gráfica&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Botões de controle do Debugger&lt;/li&gt;
&lt;li&gt;Atalhos para Funcionalidades&lt;/li&gt;
&lt;li&gt;Janelas mais usadas&lt;/li&gt;
&lt;li&gt;
Mapeando a janela CPU 

&lt;ul&gt;
&lt;li&gt;Coluna de Endereços&lt;/li&gt;
&lt;li&gt;Coluna de Opcodes&lt;/li&gt;
&lt;li&gt;Coluna de Instruções Assembly&lt;/li&gt;
&lt;li&gt;Coluna de Comentários&lt;/li&gt;
&lt;li&gt;Coluna de Registradores&lt;/li&gt;
&lt;li&gt;Stack&lt;/li&gt;
&lt;li&gt;Dump de memória&lt;/li&gt;
&lt;li&gt;Status do programa Debugado&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rodando Primeiro Programa no x64dbg&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Encontrando Strings&lt;/li&gt;
&lt;li&gt;Noções básicas sobre Funções em Assembly&lt;/li&gt;
&lt;li&gt;Atalhos úteis&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Final: Considerações e Recomendações&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caso esteja procurando obter os fundamentos da computação, eu sugiro que você confira os links desta área&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  O que é um Debugger
&lt;/h3&gt;

&lt;p&gt;Debugger é um software que serve para "debugar" e testar programas.&lt;br&gt;
"Debugar" é o processo de procurar bugs.&lt;br&gt;
Bugs são erros ou problemas em um software.&lt;br&gt;
E "testar", aqui, se define como "fazer oque quisermos com o software".&lt;/p&gt;

&lt;p&gt;O Debugger lhe fornece acesso ao programa compilado. &lt;br&gt;
Em um debugger, você vai ter acesso aos seguintes recursos: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Valores das suas variáveis em memória - Mapa de memória&lt;/li&gt;
&lt;li&gt;Suas linhas de código transformadas em instruções Assembly&lt;/li&gt;
&lt;li&gt;Módulos (dll's e lib's) usados&lt;/li&gt;
&lt;li&gt;Threads e Handles&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Sobre a Nomenclatura "x64dbg"
&lt;/h3&gt;

&lt;p&gt;Não se confunda: o nome do programa como um todo é &lt;strong&gt;x64dbg&lt;/strong&gt;.&lt;br&gt;
Ele possui dois APLICATIVOS que são chamados x64dbg e x32dbg.&lt;/p&gt;

&lt;p&gt;Você sempre deve saber qual dos dois deve usar para debugar um programa em específico, dependendo da plataforma para a qual o programa foi compilado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;o aplicativo chamado &lt;strong&gt;x64dbg&lt;/strong&gt; serve para debugar programas de 64 bits.&lt;/li&gt;
&lt;li&gt;o aplicativo chamado &lt;strong&gt;x32dbg&lt;/strong&gt; serve para debugar programas de 32 bits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Caso você não saiba se o seu programa é de 32-bits ou se é de 64-bits, abra o link:&lt;br&gt;
&lt;a href="https://www.tecwhite.net/2018/09/como-saber-se-um-programa-e-32-ou-64-bits-no-windows.html" rel="noopener noreferrer"&gt;Como saber se um programa é 32 ou 64 bits no windows&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No tutorial a seguir, quando eu disser "x64dbg", eu estarei me referindo ao programa como um todo, e não ao aplicativo específico.&lt;/strong&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Antes de começar
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Vou trabalhar apenas com &lt;strong&gt;Assembly de x86_x64&lt;/strong&gt;:&lt;br&gt;&lt;/p&gt;

&lt;blockquote&gt;
  Assembly não é uma linguagem de programação comum, como &lt;strong&gt;C&lt;/strong&gt;, que
  você aprende e sai criando programas para "qualquer coisa":
  há diversos processadores, e cada um possui uma arquitetura,
  que vai dizer como as instruções são nomeadas e como vão 
  funcionar, que dita o nome e funcionamento dos
  registradores, etc.&lt;br&gt;
Mais sobre: &lt;a href="https://www.arm.com/glossary/isa#:%7E:text=An%20Instruction%20Set%20Architecture%20(ISA,as%20how%20it%20gets%20done)" rel="noopener noreferrer"&gt;ISA-Instruction Set Architecture&lt;/a&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não é esperado nenhum conhecimento prévio sobre debuggers ou Assembly. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;É esperado conhecimento básico em programação, e processo de compilação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Conhecimento sobre fundamentos da computação lhe ajudarão a entender melhor o que se passa aqui. (Nota: Você pode usar um debugger para reforçar os estudos dos fundamentos da computação, já que, dessa forma, irá ver as coisas acontecendo na prática).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O básico sobre sistemas numéricos é esperado.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Espero lhe dar um overview de como é usar um debugger, mas tenha em mente que tópicos extremamente importantes estão sendo deixados de lado para não lhe "inundar" de informações no início. Entenda isso como um "Quick Overview".&lt;/p&gt;

&lt;p&gt;Se estiver procurando obter os fundamentos da computação, confira os links deixados na parte final.&lt;/p&gt;


&lt;h3&gt;
  
  
  Baixando o x64dbg
&lt;/h3&gt;

&lt;blockquote&gt;
   &lt;ul&gt;
      &lt;li&gt;Vá ao site oficial: &lt;a href="https://x64dbg.com/" rel="noopener noreferrer"&gt;x64dbg.com&lt;/a&gt;
&lt;/li&gt;
      &lt;li&gt;Clique em &lt;strong&gt;Download&lt;/strong&gt;
&lt;/li&gt;
      &lt;li&gt;Você será redirecionado ao site da Sourceforge. Clique em &lt;strong&gt;Download Latest Version&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  "Instalando" o x64dbg
&lt;/h3&gt;

&lt;blockquote&gt;
   &lt;ul&gt;
      &lt;li&gt;Extraia o arquivo zip. Você pode criar uma pasta em qualquer lugar para armazená-lo.&lt;/li&gt;
      &lt;li&gt;Abra a pasta extraída&lt;/li&gt;
      &lt;li&gt;Vá em: &lt;strong&gt;release/x32&lt;/strong&gt;, ache o aplicativo &lt;strong&gt;x32dbg&lt;/strong&gt; e crie um atalho na área de trabalho&lt;/li&gt;
      &lt;li&gt;Vá em: &lt;strong&gt;release/x64&lt;/strong&gt;, ache o aplicativo &lt;strong&gt;x64dbg&lt;/strong&gt; e crie um atalho na área de trabalho&lt;/li&gt;
   &lt;/ul&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  Abrindo o x64dbg
&lt;/h3&gt;

&lt;p&gt;Para abrir qualquer programa no x64dbg: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Abra o x64dbg&lt;/li&gt;
&lt;li&gt;Clique em &lt;strong&gt;Arquivo -&amp;gt; Abrir&lt;/strong&gt; (ou clique em &lt;strong&gt;F3&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Alternativa: Arraste o programa para um dos atalhos do x64dbg&lt;/li&gt;
&lt;li&gt;Para abrir um programa que está rodando, abra o debuger, clique em &lt;strong&gt;Arquivo -&amp;gt; Anexar/Attach&lt;/strong&gt; e escolha o programa.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Mapeando as partes mais usadas da Interface Gráfica
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwok6e4zas0brdc3vc7yx.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwok6e4zas0brdc3vc7yx.PNG" alt="Image description" width="800" height="453"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;* Guie-se pelas cores&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Botões de controle do Debugger
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6dbcglt6xkwg2ooqq3h.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6dbcglt6xkwg2ooqq3h.PNG" alt="Image description" width="20" height="18"&gt;&lt;/a&gt;Área com os botões de controle do Debugger. Clique em &lt;strong&gt;Debug&lt;/strong&gt; (ao lado de &lt;strong&gt;Exibir&lt;/strong&gt;) para ver todos os nomes e atalhos dos botões nessa seção. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F71u93hk5luwwtasjx1wz.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F71u93hk5luwwtasjx1wz.PNG" alt="Image description" width="235" height="35"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ícones, da esquerda para a direita:

&lt;ol&gt;
&lt;li&gt;Abrir Arquivo&lt;/li&gt;
&lt;li&gt;Recarregar programa&lt;/li&gt;
&lt;li&gt;Fechar programa que está carregado&lt;/li&gt;
&lt;li&gt;Rodar programa carregado&lt;/li&gt;
&lt;li&gt;Pausar programa carregado&lt;/li&gt;
&lt;li&gt;Step Into: anda, de instrução em instrução, e entra nas instruções &lt;code&gt;call&lt;/code&gt;: instruções &lt;code&gt;call&lt;/code&gt; chamam outras funções. "Entrar nelas" quer dizer ir até a função.&lt;/li&gt;
&lt;li&gt;Step Over: anda, de instrução em instrução, e NÃO entra nas instruções &lt;code&gt;call&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Não vou comentar sobre os outros botões, para saber sobre eles: &lt;br&gt;
    &lt;a href="https://help.x64dbg.com/en/latest/gui/views/Trace.html" rel="noopener noreferrer"&gt;https://help.x64dbg.com/en/latest/gui/views/Trace.html&lt;/a&gt;&lt;br&gt;
    &lt;a href="https://help.x64dbg.com/en/latest/introduction/ConditionalTracing.html" rel="noopener noreferrer"&gt;https://help.x64dbg.com/en/latest/introduction/ConditionalTracing.html&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Atalhos para Funcionalidades
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgisze7uuod0u5xrercy2.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgisze7uuod0u5xrercy2.PNG" alt="Image description" width="20" height="18"&gt;&lt;/a&gt;Atalhos para algumas funcionalidades do x64dbg (não entrarei em detalhes).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx6eblrafe900zk8630zb.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx6eblrafe900zk8630zb.PNG" alt="Image description" width="364" height="29"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vou mencionar apenas o quinto, da esquerda para a direita, que é o ícone de favoritos.&lt;br&gt;
Quando você quiser salvar alguma localização de instrução, use &lt;strong&gt;CTRL+D&lt;/strong&gt;, que a instrução selecionada será salva nos favoritos. Clique no atalho mencionado para ser direcionado aos favoritos.&lt;/p&gt;


&lt;h3&gt;
  
  
  Janelas mais usadas
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foj4hrbt2qgzh65mezp9h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foj4hrbt2qgzh65mezp9h.png" alt="Image description" width="20" height="18"&gt;&lt;/a&gt;Nessa parte do x64dbg, você tem todas as janelas de funcionalidades do programa.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02whk8xmuo1373kovgg6.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02whk8xmuo1373kovgg6.PNG" alt="Image description" width="527" height="32"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Só marquei na caixa amarela as que eu vou estar comentando. Para você começar a usar o programa, acredito que só precisa dessas janelas. Mas não deixe de aprender todas, caso queira prosseguir nos estudos.&lt;/p&gt;

&lt;p&gt;Clicando em &lt;strong&gt;exibir&lt;/strong&gt; (ao lado de Arquivo, canto superior esquerdo) você pode habilitar as janelas que não estiverem aparecendo, e também pode ver os atalhos para cada uma delas.&lt;br&gt;
Na imagem acima, se encontra a janela &lt;strong&gt;CPU&lt;/strong&gt;, que será comentada no final desta parte sobre janelas.&lt;/p&gt;

&lt;blockquote&gt;
   &lt;ul&gt;
      &lt;li&gt;
&lt;strong&gt;Janela Breakpoints&lt;/strong&gt;: breakpoints são 
          pontos de parada, locais em que o programa vai parar 
          obrigatoriamente. Logo falaremos mais sobre breakpoints. 
          E nessa janela você tem acesso aos breakpoints que estão 
          setados no programa todo. Aqui você pode manipular 
          breakpoints, habilitando-os, desabilitando-os, ou mesmo 
          removendo-os, e é até possível editá-los. Clicando em um 
          deles, você será direcionado até o local em que ele está 
          setado, na janela CPU.
  &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Janela de Símbolos (Modules)&lt;/strong&gt;: essa é 
          uma janela de extrema importância para algumas 
          atividades, já que ela nos mostra os módulos importados 
          pelo programa, inclusive o módulo do próprio programa.  
     

      &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Janela Referências&lt;/strong&gt;: Aqui temos as 
          referências, que procuramos da seguinte maneira: Dentro 
          da janela CPU, clique com o botão direito do mouse, bem 
          no final você vai encontrar "Pesquisar por" e "Encontrar 
          referência aos":  
          
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabgzv6pirlgpdbhybqlb.PNG" alt="Descrição da imagem" width="453" height="143"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fntq6rheu41z1fc6gg3p4.PNG" alt="Descrição da imagem" width="540" height="91"&gt;
Os resultados das pesquisas feitas por essas opções serão mostrados na janela **Referências**.

      &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Janela Mapa de Memória&lt;/strong&gt;: Como o nome 
          diz, é um mapa da memória do programa todo. 
          Você pode ver onde um determinado endereço se  
          encontra da seguinte maneira:
          &lt;ul&gt;
             &lt;li&gt;Dentro da janela CPU, selecione um endereço 
                 desejado (sobre endereços, comentarei mais a  
                 frente)
             &lt;/li&gt;
&lt;li&gt;Dentro da janela CPU, clique com o botão direito  
                 do mouse em cima do endereço desejado
             &lt;/li&gt;
&lt;li&gt;Clique em "Seguir no Mapa da Memória":

             &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5a2wjcof5shlspd3r5fd.PNG" alt="Descrição da imagem" width="302" height="29"&gt;
             &lt;p&gt;Você verá as informações a respeito do endereço  
                selecionado no mapa de memória.&lt;/p&gt;
          &lt;/li&gt;
&lt;/ul&gt;

      &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Janela CPU&lt;/strong&gt;: Nos mostra tudo o que  
          estamos vendo na imagem "mapeada" acima, e por essa ser  
          a janela principal, todos os comentários às marcações  
          com cores a seguir, serão sobre ela.
   &lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Mapeando a janela CPU
&lt;/h2&gt;

&lt;p&gt;Vamos passar a maior parte do tempo nessa janela, ela é a janela principal do x64dbg.&lt;/p&gt;
&lt;h3&gt;
  
  
  Coluna de Endereços
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbw2jeh9hwpeb7bfpxwix.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbw2jeh9hwpeb7bfpxwix.png" alt="Image description" width="20" height="18"&gt;&lt;/a&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp6uwircwtamzdam80nof.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp6uwircwtamzdam80nof.PNG" alt="Image description" width="128" height="85"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na primeira coluna da grande área, nós temos os endereços de memória (endereços de memória virtual, &lt;strong&gt;Virtual Address - VA&lt;/strong&gt;).&lt;br&gt;
A marcação verde nos mostra qual a próxima instrução a ser executada. O destaque em dourado é uma instrução marcada como "favoritos" usando CTRL+D.&lt;br&gt;
Para saber mais sobre endereços de memória: &lt;a href="https://learn.microsoft.com/pt-br/windows/win32/memory/virtual-address-space" rel="noopener noreferrer"&gt;https://learn.microsoft.com/pt-br/windows/win32/memory/virtual-address-space&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Coluna de Opcodes
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdrx3k3xqaydebqgha4i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdrx3k3xqaydebqgha4i.png" alt="Image description" width="20" height="18"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe29d25yatmesm1jqzecp.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe29d25yatmesm1jqzecp.PNG" alt="Image description" width="174" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na segunda coluna da grande área, nós temos os Opcodes, que são códigos de operação, eles ditam uma operação a ser executada pelo processador (por isso do nome &lt;strong&gt;OPeration Code&lt;/strong&gt;);&lt;br&gt;
Aqui estão em hexadecimal. Cada opcode é usado para formar uma &lt;strong&gt;instrução&lt;/strong&gt; Assembly. Os opcodes também são chamados de Código de Máquina, e isso é oque chamamos de Assembly. &lt;/p&gt;

&lt;p&gt;Por exemplo, temos a instrução chamada &lt;code&gt;add&lt;/code&gt;, que soma dois operandos. &lt;br&gt;
Em Opcode ela é equivalente a um dos seguintes, dependendo do contexto (na imagem, coluna Opcode, lado esquerdo):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpiwfyezess685vb2uj8d.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpiwfyezess685vb2uj8d.PNG" alt="Image description" width="698" height="547"&gt;&lt;/a&gt;Isso é a tabela que nos mostra como a instrução &lt;code&gt;add&lt;/code&gt; é montada em arquitetura Intel x86_x64.&lt;br&gt;
Repare as colunas &lt;strong&gt;64-bit Mode&lt;/strong&gt;, para programas de 64 bits e &lt;strong&gt;Compat/Leg Mode&lt;/strong&gt; para programas de 32 bits. Para saber mais, clique no link: &lt;br&gt;
&lt;a href="https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html" rel="noopener noreferrer"&gt;Manual da Intel para desenvolvedores.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos ver qual opcode obtemos compilando um programa para um sistema de 64 bits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Programa em C
int main(){
   int primeiro_numero = 3;
   int segundo_numero = 2;
   int resultado_da_soma;

   resultado_da_soma = primeiro_numero + segundo_numero;

   return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgobgya5sd705d4fao1m0.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgobgya5sd705d4fao1m0.PNG" alt="Image description" width="763" height="127"&gt;&lt;/a&gt;Repare na linha selecionada: o programa está com o opcode &lt;code&gt;03 /r&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Coluna de Instruções Assembly
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzvrl96zwmnt3skr1p3r9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzvrl96zwmnt3skr1p3r9.png" alt="Image description" width="20" height="18"&gt;&lt;/a&gt;Na terceira coluna da grande área, nós vemos as instruções Assembly. Falamos sobre elas anteriormente, na coluna dos Opcodes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv844ewkms9vnu0ne6s1y.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv844ewkms9vnu0ne6s1y.PNG" alt="Image description" width="281" height="104"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Coluna de Comentários
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fka82lc94oa38d1os9f8o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fka82lc94oa38d1os9f8o.png" alt="Image description" width="20" height="18"&gt;&lt;/a&gt;Na quarta coluna da grande área, temos a seção de comentários.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl36eankrops1azoj7zp2.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl36eankrops1azoj7zp2.PNG" alt="Image description" width="241" height="127"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos ter comentários automáticos, por exemplo, no caso de instruções que estão carregando uma string, vamos ter a própria string como comentário. Também podemos adicionar nossos comentários, basta clicar na tecla &lt;code&gt;;&lt;/code&gt; e escrever algo, ao terminar é só dar &lt;code&gt;enter&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Coluna de Registradores
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fny8b53ktc2hkhrl79ih4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fny8b53ktc2hkhrl79ih4.png" alt="Image description" width="20" height="18"&gt;&lt;/a&gt; Aqui, no lado extremo direito, temos os registradores e seus conteúdos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88kuzd60rk1vlwc1zmqd.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88kuzd60rk1vlwc1zmqd.PNG" alt="Image description" width="464" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Os registradores são espaços de memória dentro do processador, e funcionam como variáveis temporárias.&lt;/p&gt;

&lt;p&gt;Há &lt;strong&gt;registradores de propósito geral&lt;/strong&gt;, que sempre vão ser usados para coisas diversas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Registradores de Propósito Geral x64:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RAX&lt;/li&gt;
&lt;li&gt;RBX&lt;/li&gt;
&lt;li&gt;RCX&lt;/li&gt;
&lt;li&gt;RDX&lt;/li&gt;
&lt;li&gt;RSI&lt;/li&gt;
&lt;li&gt;RDI&lt;/li&gt;
&lt;li&gt;R8, R9, R10, R11, R12, R13, R14 e R15. Em x64 temos esses oito registradores a mais.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Registradores de Propósito Geral x86:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EAX&lt;/li&gt;
&lt;li&gt;EBX&lt;/li&gt;
&lt;li&gt;ECX&lt;/li&gt;
&lt;li&gt;EDX&lt;/li&gt;
&lt;li&gt;ESI&lt;/li&gt;
&lt;li&gt;EDI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em teoria esses registradores podem ser usados para qualquer coisa, mas há situações em que RDI/EDI e RSI/ESI são usados de forma exclusiva por certas instruções.&lt;/p&gt;

&lt;p&gt;Também há registradores que servem para armazenar coisas específicas.&lt;br&gt;
Vou mencionar apenas os que considero mais importantes para o momento. &lt;br&gt;
Para saber mais, não deixe de ler: &lt;br&gt;
&lt;a href="https://blog.yossarian.net/2020/11/30/How-many-registers-does-an-x86-64-cpu-have" rel="noopener noreferrer"&gt;How many registers does an x86-64 cpu have&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://asm.lucasteske.dev/registers/x86" rel="noopener noreferrer"&gt;Registradores x86 (32 e 64)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alguns Registradores de uso específico (na ordem: x64/x86):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RSP/ESP - Ponteiro para o &lt;strong&gt;topo&lt;/strong&gt; da stack/pilha&lt;/li&gt;
&lt;li&gt;RBP/EBP - Ponteiro para a &lt;strong&gt;base&lt;/strong&gt; da stack/pilha&lt;/li&gt;
&lt;li&gt;RIP - Ponteiro para a próxima instrução a ser executada. &lt;strong&gt;IP&lt;/strong&gt; - Instruction Pointer (vai ser mostrado como &lt;strong&gt;RIP&lt;/strong&gt; em x64, e &lt;strong&gt;EIP&lt;/strong&gt; em x86). É por esse registrador que nós sabemos onde estamos dentro do programa, durante o fluxo de execução.
Como ele tem o valor da próxima instrução a ser executada, estamos exatamente "um passo" atrás dele.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;*Também deixei de mencionar os registradores que lidam com float's.&lt;/em&gt; Mais sobre: &lt;a href="https://my.eng.utah.edu/%7Ecs4400/sse-fp.pdf" rel="noopener noreferrer"&gt;https://my.eng.utah.edu/~cs4400/sse-fp.pdf&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Stack
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7zxh0mk3fb61wuhyn2h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7zxh0mk3fb61wuhyn2h.png" alt="Image description" width="20" height="18"&gt;&lt;/a&gt;Abaixo dos registradores, nós temos a Stack, também chamada de pilha (em pt-br).&lt;br&gt;
A stack/pilha é um segmento de memória que opera com uma estrutura de dados de pilha (stack), por isso do nome. &lt;br&gt;
Aqui nós temos os valores de nossas variáveis locais. Enquanto você estiver dentro de uma função, seus dados locais vão estar ali.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyw5ul9f130nnbc4ii90j.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyw5ul9f130nnbc4ii90j.PNG" alt="Image description" width="426" height="169"&gt;&lt;/a&gt;A coluna da esquerda representa o endereço da stack/pilha, e a coluna da direita nos mostra o valor armazenado naquele endereço.&lt;/p&gt;

&lt;p&gt;A stack/pilha é uma estrutura de dados do tipo &lt;strong&gt;LIFO&lt;/strong&gt; - Last In First Out, ou último a entrar, primeiro a sair. Todo mundo costuma usar o exemplo de uma pilha de pratos para explicar a stack: em uma pilha de pratos, qual prato você tira PRIMEIRO? O último empilhado, ou o primeiro, que deu início a pilha?&lt;br&gt;
É lógico que, primeiro, você tira o que está no topo, &lt;strong&gt;LIFO&lt;/strong&gt;...&lt;/p&gt;

&lt;p&gt;Lembra dos registradores RSP e RBP? Então, é aqui que eles entram: RSP aponta para o topo da pilha, e RBP aponta para a base da pilha.&lt;br&gt;
É assim que o layout de memória de uma função é delimitado e manipulado, através desses registradores.&lt;/p&gt;

&lt;p&gt;E isso é que é chamado "stackframe", é o espaço de memória reservado para uma função.&lt;br&gt;
Veremos um pouco mais sobre isso em "Noções básicas sobre funções em Assembly".&lt;/p&gt;




&lt;h3&gt;
  
  
  Dump de Memória
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ferafzbmmr0cyomfj4yvs.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ferafzbmmr0cyomfj4yvs.PNG" alt="Image description" width="603" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fax80rbv4jn0himx3on91.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fax80rbv4jn0himx3on91.png" alt="Image description" width="20" height="18"&gt;&lt;/a&gt;Ao lado esquerdo dos registradores, nós encontramos um dump da memória em hexadecimal.&lt;br&gt;
Você pode clicar com o botão direito do mouse em qualquer instrução, e seguir tanto o endereço dela, quanto algum endereço que ela esteja operando. Também é possível fazer o mesmo nos registradores.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6zgehgc8jglqu1rzgg5p.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6zgehgc8jglqu1rzgg5p.PNG" alt="Image description" width="800" height="111"&gt;&lt;/a&gt;Voltando a imagem do Dump, a coluna mais a esquerda mostra o endereço respectivo aos dados hexadecimais nas quatro colunas seguintes (quatro colunas na configuração padrão).&lt;br&gt;
Na última coluna, mais a direita, temos a representação ASCII dos dados em memória.&lt;/p&gt;

&lt;p&gt;Também podemos alterar a visualização dos dados do dump: além de hexadecimal, ele nos mostra os dados como Inteiros e Floats. Basta clicar com o botão direito do mouse na área de dump e clicar em "Integers" ou em "Floats".&lt;/p&gt;

&lt;p&gt;Na parte de cima nós temos vários dumps, para os quais você pode direcionar a visualização de algo que lhe interessar. Também temos outras funções, mas não vou mencioná-las aqui. Para saber mais, leia: &lt;a href="https://help.x64dbg.com/en/latest/commands/watch-control/index.html" rel="noopener noreferrer"&gt;Watch Control&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Status do programa debugado
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffktp9e6r3vq49jmsa9ih.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffktp9e6r3vq49jmsa9ih.png" alt="Image description" width="20" height="18"&gt;&lt;/a&gt;Aqui, no canto inferior esquerdo, nos é mostrado em que situação o programa debugado se encontra, como, por exemplo, se ele está em execução, ou pausado, e se estiver pausado, o motivo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj8uwbdiac4r8it6ybowt.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj8uwbdiac4r8it6ybowt.PNG" alt="Image description" width="57" height="20"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frd1ihcytdtfn1gmqme93.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frd1ihcytdtfn1gmqme93.PNG" alt="Image description" width="73" height="27"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Rodando primeiro programa no x64dbg
&lt;/h3&gt;

&lt;p&gt;Bom, agora que você já sabe como abrir o seu programa no x64dbg, vamos aprender mais algumas coisas antes de seguirmos para o próximo tutorial.&lt;br&gt;
Abra qualquer programa com o x64dbg, de preferência um feito por você mesmo.&lt;/p&gt;

&lt;p&gt;Em seguida, abra a janela (em vermelho) da seguinte maneira: Clique em &lt;strong&gt;Options -&amp;gt; Preferências&lt;/strong&gt;&lt;br&gt;
E aí desmarque a caixinha apontada pela seta, &lt;strong&gt;System Breakpoint&lt;/strong&gt;. Assim você desativa alguns breakpoints "desnecessários" para nós agora (para saber mais sobre System Breakpoints: &lt;a href="https://www.youtube.com/watch?v=vdyyg72tc2w" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=vdyyg72tc2w&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vffr716nsrhyla7bezr.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vffr716nsrhyla7bezr.PNG" alt="Image description" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao abrir o programa, ele vai ser mostrado na barra de tarefas somente quando for carregado. Eu estou abrindo um programa simples, ele já carrega a janela de primeira. &lt;/p&gt;

&lt;p&gt;Se for um programa mais complexo, ele vai carregar outras coisas antes de poder desenhar a janela. Basta clicar em &lt;strong&gt;RUN&lt;/strong&gt; (&lt;strong&gt;F9&lt;/strong&gt;) até parar em um breakpoint: entry breakpoint, que você vê ao lado do status do programa:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dj8y368cbr7nrz3pe7j.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dj8y368cbr7nrz3pe7j.PNG" alt="Image description" width="600" height="30"&gt;&lt;/a&gt;&lt;br&gt;
Sempre acompanhe o status do programa na barra inferior, ao lado do &lt;strong&gt;PAUSE&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Vamos tentar encontrar nossas funções. Se o programa não foi "cuidadosamente estripado", achar a função principal, &lt;strong&gt;main&lt;/strong&gt;, não é tão difícil. &lt;/p&gt;

&lt;p&gt;Vá até a janela &lt;strong&gt;Símbolos&lt;/strong&gt;, que possui nossos módulos, encontre o módulo principal (que possui o nome do próprio programa rodando), clique nela e seja direcionado para o início desse módulo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9pr4g4chw7cn83jcob8m.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9pr4g4chw7cn83jcob8m.PNG" alt="Image description" width="258" height="96"&gt;&lt;/a&gt;Assim , se o programa não for extremamente complexo, você vai encontrar a main.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dica&lt;/strong&gt;: os programas compilados para x86, geralmente mantêm a função &lt;strong&gt;main&lt;/strong&gt; no topo, então assim que o programa parar no entry breakpoint, vá ao topo das instruções que você encontrará a &lt;strong&gt;main&lt;/strong&gt;.&lt;/p&gt;




&lt;h4&gt;
  
  
  Encontrando Strings
&lt;/h4&gt;

&lt;p&gt;Outro modo de encontrar a main, é quando ela chama alguma string.&lt;br&gt;
Para encontrar as strings dentro do programa é fácil:&lt;/p&gt;

&lt;p&gt;na janela CPU, clique com o botão direito do mouse no meio da janela, vá até&lt;br&gt;
    &lt;strong&gt;Pesquisar Por -&amp;gt; All User Modules -&amp;gt; Referências String&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Carregando as strings na janela de referências, procure pela que você sabe que é usada na main, e aí clique nela. Você será redirecionado para o local em que ela aparece no programa, na janela CPU. O início da função, é o início da main, a nossa função principal, que o programador escreveu.&lt;/p&gt;




&lt;h3&gt;
  
  
  Noções básicas sobre funções em Assembly
&lt;/h3&gt;

&lt;p&gt;Toda função em Assembly possui um &lt;strong&gt;prólogo&lt;/strong&gt; e um &lt;strong&gt;epílogo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Normalmente as funções possuem as seguintes instruções no início (o prólogo):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;push ebp
mov ebp, esp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;E a seguinte instrução no final (o epílogo):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ret 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Lembre-se que as instruções em x64 utilizam os registradores &lt;code&gt;rsp&lt;/code&gt; e &lt;code&gt;rbp&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;No início, o programa salva o valor que está no registrador &lt;strong&gt;EBP/RBP&lt;/strong&gt; com &lt;code&gt;push ebp&lt;/code&gt;. Esse valor é o endereço da base da stack/pilha da função anterior; lembre-se que a stack/pilha possui os valores das variáveis locais, e que as variáveis locais são variáveis declaradas e/ou definidas dentro das funções (somente as variáveis definidas, isto é, variáveis com valores, vão ser colocadas na stack/pilha).&lt;/p&gt;

&lt;p&gt;Após salvar o valor de &lt;strong&gt;EBP&lt;/strong&gt;, um novo stackframe é iniciado; em outras palavras, um novo local ("local" se refere a um bloco de memória na stack) para guardar as variáveis dessa nova função é "delimitado". Isso é feito com &lt;code&gt;mov ebp, esp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tenha em mente que, para cada nova função, um novo stackframe é mapeado e alocado para ela, assim, cada função lida somente com os valores das suas próprias variáveis.&lt;/p&gt;

&lt;p&gt;Você vai precisar saber sobre calling conventions para entender como os argumentos são passados para as funções, eu não irei explicar isso aqui, então se quiser saber mais, não deixe de ler:&lt;br&gt;
&lt;a href="https://en.wikipedia.org/wiki/X86_calling_conventions" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/X86_calling_conventions&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.ired.team/miscellaneous-reversing-forensics/windows-kernel-internals/linux-x64-calling-convention-stack-frame" rel="noopener noreferrer"&gt;Calling Convention Stack Frame&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Atalhos úteis
&lt;/h3&gt;

&lt;p&gt;Clicando com o botão direito do mouse no meio da janela CPU, vá até "&lt;strong&gt;Ir Para&lt;/strong&gt;", lá você terá acesso as seguintes funcionalidades (decore os atalhos):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7dw7kj4d4xwv6egrshdi.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7dw7kj4d4xwv6egrshdi.PNG" alt="Image description" width="252" height="169"&gt;&lt;/a&gt;Os atalho mais úteis de todos são o primeiro e o segundo: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;RIP &lt;code&gt;*&lt;/code&gt;: ele te direciona para onde o seu programa está no momento, seguindo o &lt;strong&gt;RIP&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Anterior &lt;code&gt;-&lt;/code&gt;: Volta para a instrução executada anteriormente.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Final: Considerações e Recomendações
&lt;/h3&gt;

&lt;p&gt;Não deixe de fazer o tutorial prático com o x64dbg [COLOCAR LINK QUANDO PRONTO].&lt;/p&gt;

&lt;p&gt;Os debuggers são poderosos e úteis para as mais diversas atividades na área da computação. O x64dbg faz muitas coisas, várias delas eu deixei de mencionar aqui, como, por exemplo, alterar as instruções de um programa, para modificar sua funcionalidade.&lt;br&gt;
Quanto mais você for estudando sobre tópicos de engenharia reversa, mais os debuggers se mostrarão úteis. Você irá se aprofundar nas diversas funcionalidades conforme a sua necessidade.&lt;/p&gt;

&lt;p&gt;Um site muito bom para continuar praticando a leitura de Assembly é o seguinte: &lt;a href="https://godbolt.org/" rel="noopener noreferrer"&gt;godbolt.org&lt;/a&gt; Selecione uma linguagem, como C ou C++, escolha um compilador, e comece os testes.&lt;/p&gt;

&lt;h4&gt;
  
  
  Caso esteja procurando obter os fundamentos da computação, eu sugiro que você confira os links desta área:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Guia de estudos:&lt;/strong&gt; &lt;a href="https://www.mentebinaria.com.br/studying-materials/basico-para-computacao/" rel="noopener noreferrer"&gt;https://www.mentebinaria.com.br/studying-materials/basico-para-computacao/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tutorial Gratuito de Assembly pt-br:&lt;/strong&gt; &lt;a href="https://github.com/andreluispy/assembly4noobs" rel="noopener noreferrer"&gt;https://github.com/andreluispy/assembly4noobs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Livro Gratuito de Assembly em pt-br&lt;/strong&gt;: &lt;a href="https://mentebinaria.gitbook.io/assembly/" rel="noopener noreferrer"&gt;https://mentebinaria.gitbook.io/assembly/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fundamentos da Engenharia Reversa pt-br:&lt;/strong&gt; &lt;a href="https://mentebinaria.gitbook.io/engenharia-reversa/" rel="noopener noreferrer"&gt;https://mentebinaria.gitbook.io/engenharia-reversa/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Curso de Engenharia Reversa Online (vídeo pt-br)&lt;/strong&gt;: &lt;a href="https://www.youtube.com/playlist?list=PLIfZMtpPYFP6zLKlnyAeWY1I85VpyshAA" rel="noopener noreferrer"&gt;https://www.youtube.com/playlist?list=PLIfZMtpPYFP6zLKlnyAeWY1I85VpyshAA&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Livro Em Inglês para iniciantes em Engenharia Reversa en&lt;/strong&gt;: &lt;a href="https://beginners.re/" rel="noopener noreferrer"&gt;https://beginners.re/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>debugging</category>
    </item>
  </channel>
</rss>
