Engenharia Reversa Primeiro Contato - 第 2 部分

2025-06-07

Engenharia Reversa Primeiro Contato - 第 2 部分

暗黑破坏神 - ORiON_CrackMe1 +18

本教程是关于逆向工程的启动教程,可帮助您了解如何最大程度地利用 Intel x86 的组装和架构处理器,这对您来说是一个很好的解决方案,可以帮助您解决问题,并且您可以轻松地使用它进入操作系统进程。
E aí,quem sabe,você não crie réesse por está área de estudos。

使用 Debugger x64dbg 时,请先简单介绍一下:https://dev.to/ryan_gozlyngg/engenharia-reversa-primeiro-contato-parte-1-2gih

本教程由有关该程序的问题组成。
这是基本的、非常好的、正确的、相反的启动方式。
“Quebra de software” quer dizer: fazer o programa se submeter à sua vontade!

Algumas notas estão 提供了关于 eu julgue que devem ser de conhecimento do leitor 的辅助信息。


内容列表

继续教程的全部要求

教程期间使用的术语

CrackMe 程序链接

Análise Estática
Examinando 作为字符串进行编程

动态分析

Como o 代码(输入)和过程

测试 CL,CL

EFLAGS 注册人

输入处理

Vamos rastrear a origem desse valor no topo da stack/pilha

观察堆栈

函数返回

观察crackme1.46B828的功能

发现价值,无需倾倒

进入crackme1.46B828功能

Entendendo como chegamos ao resultado

Caso o salto não seja executado, as seguintes instruções são usadas

功能逻辑概述

函数的意义和结果的意义

SETNE - 说明结果或结果

最终考虑


继续教程的全部要求

  • 记忆基本分段、查马多分段主​​要部分/pilha
  • 数学基础连贯性
  • C/C++ 编程基础知识

作为一个以教程形式出现的软件,您可以使用一些与算法相关的处理过程来完成一些有趣的事情,但如果是困难的,或者是特殊的算法。
我全身心地投入到工作中。

没有任何问题,无论是解决问题还是解决问题,都可以通过确定活动、行动、外部因素来解决问题。

如果您开始研究反向工程,请使用该软件来进行第一次操作,然后再进行下一步操作。


教程期间使用的术语

  • 代码,代码或代码:输入名称; é o 提示“serial”、“key”、“senha”或输入。 Nesse 软件是一个代码输入区域。
  • 断点:中断断点、帕拉达断点。
  • 设置:例如:“设置断点”含义:应用、定义、介绍断点或确定指令。
  • Binário:裁判一个程序,并执行。

CrackMe 程序链接


统计分析

总结,“分析”和分析结果是作为程序本身的信息而提供的,并且可以独立执行程序

Para saber em qual arquitetura o programa foi compilado, você pode usar o programa DIE - Detect It Easy:

图片描述

O DIE é um programa muito poderoso, por hora, vamo ficar somente com essas informações da interface inicial.建议您不要死亡。

Na caixa de baixo,com grande destaque em vermelho,podemos ver algumas informações interessantes。 “PE32”表示 32 位执行的程序。 Nas caixas menores、marcadas em vermelho、podemos ver também、o modo ea arquitetura


像字符串编程一样检查

Você pode ver as strings contidas dentro do programa, usando o software que Preferred (inclusive com DIE, clicando no botão "Strings", na interface inicial):

图片描述

Não tem como examinarmos as strings, uma por uma, já que 3,750 strings depois, alguma coisa pode acabar passando batido...

作为字符串,我很感兴趣,就像程序员一样。 Vamos dar uma olhada no local em que as variáveis globais e estáticas, inicializadas, são Guardadas:数据段, ou .data

您可以利用IDA程序来访问数据 (.data) 部分。
O IDA程序利用对二进制文件的分析、功能、功能的变化,不建议您这样做,建议您最好进行操作。

O IDA 可以免费使用:https://hex-rays.com/ida-free/
Caso você nunca tenha usado o IDA, e mesmo assim baixou para testar aí, saiba que ele nosmostra várias mensagens ao carregarmos o binário nele, por hora não se preocupe, dê "ok" em tudo até chegar na tela 校长。深思熟虑,建议您使用 IDA 介绍的播放列表,而不是 Youtube。

  • 无 IDA:SHIFT+F7 -> clique duas vezes em .data -> clique na aba十六进制视图-> váscendo e observando a coluna heaven:

图片描述

提供程序的一系列数据,十六进制,各自代表 ASCII,na coluna da direita(循环)。

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。

Se você fez isso, então já sabe a resposta。

图片描述


动态分析

动态分析由执行过程中的观察和分析组成。

使用x64dbg调试器,可以轻松地与字符串进行比较。
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.
接下来是字符串,您可以在美国的某个时刻,在当地,在公共汽车上插入逻辑或决定,然后输入您想要的信息。

打开 x64dbg 程序(不是 32 位程序,而是 x32dbg.exe)和(打开F9)程序,然后输入声音。
x64dbg 中的断点启动、程序功能和程序、EIP指令指针(指令指针)、指令响应等都没有任何意义(横向设置) mostra ele), estiver parado, continue clicando em F9 para rodar o programa até ele ser completamente carregado, e aí ele estará disponível para você usar (观察 Windows 中的 barra de tarefas)。

图片描述

com o rodando 程序,x64dbg 的目录:

  1. Clique com o botão direito do mouse, no meio do debugger, na janela CPU
  2. Vá em: "Pesquisar por" -> "All User Modules" -> "Referências String"

图片描述
您可以直接拨打电话。前面是 cima、em CPU

Aqui vemos algumas strings que chamam atenção...
Se começamos por esse método, fazemos como anteriormente:

  • Pegamos 作为字符串“diferenciadas”,e 作为 testamos como 输入,uma a uma。

如果您想了解更多有关好奇心的问题,请参阅以下内容:

  • Clique duas vezes 字符串“错误代码!再试一次!

您可以直接使用说明(有关说明)来了解功能(主要),了解CPU 的情况。

  • Sete um Breakpoint nela, clicando em F2
  • Abra a janela do programa e insira um code/input different do esperado, um errado qualquer.
  • 单击“Ok”或在断点处设置程序。
  • 集会决定了我们要解决的问题,除了 palavras 之外,我们还应避免犯错误。

Vamos fazer a engenharia reversa do programa, até descobrirmos or critério de “resposta certa” 和 “resposta errada”.


Como o 代码(输入)和过程

Vamos rever os passos até aqui:*
1. Buscamos 作为用户模块待办事项
中的 字符串参考 2. 更改输入对话框中的字符串 3.
Setamos um Breakpoint nela
4. Rodamos o programa depois de inserir um input qualquer

Subindo um pouco a partir do breakpoint (setado em "Wrong Code! try Again!"), vemos que há uma instrução test cl, cl, um pouco antes das instruções que nosmostram a mensagem de erro.

Se você observar a instrução em [ 004016D7 ], que é um salto condicional JE (Jump if Equal)
pula para crackme1.4016F6 se o resultado de TEST CL, CL for igual a 0, ela nos direciona para a outra mensagem: a mensagem de sucesso.
我们可以通过一些小团体来指导如何重新设计程序je crackme.4016F6
Com isso,sabemos que,se CL为零,quer dizer que colocamos o 输入/代码 certo

Agora nos fazemos uma pergunta:O que leva CL a ter o valor Zero,ou mesmo o valor atual?

图片描述

注意:* Se você não entendeu nada desse trecho, leia aparte seguinte, **TEST CL, CL , com calma...


测试 CL,CL

前面的内容对指令有何意义TEST CL, CL
Caso saiba,pule para“Respondendo à pergunta:O que leva CL a ter o valor Zero?”。

*测试说明: o 程序测试 **CL é Zero ou não(“ou não”字面意义与零、como、por exemplo、-1、1、90000、0xABC、0xFFFF、6 等不同)。

CL é aparte mais à direita do registrador ECX (ver imagem adiante)。
处理器设备的注册空间。

测试:比较操作方法的说明,没有任何问题,比较CL和 ele mesmo。
Com“TEST”程序执行一点操作,(按位)chamada AND
一个歌剧一个逻辑歌剧,以二进制形式实现。
Caso não saiba nada sobre operações lógicas,veja: https: //imasters.com.br/desenvolvimento/conheca-os-operadores-bitwise-bit-bit

Vamos tentar enender essa operação bit a bit, or bitwise, utilizada aqui。

**注: * 明确了作为数字基础的重要性:声音是真实的,是数量变化的。 Nós temos razões culturais para usarmos as base decimais para quantificar a maioria das coisas, por isso, ao nosreferirmos, por exemplo, ao número dez, dizendo "temos aqui, dez árvores", sabemos exatamente a Quantidade de um decidado dado da realidade;没有例子,sabemos que temos dez árvores。*

由于文化、市场、计算机的存在,我们以十六进制、八进制和二进制为基础。
Sendo assim,podemos dizer que temos:10 arvores,十进制。 0xA 硬盘为十六进制,012 硬盘为八进制,0b1010 硬盘为二进制。
与现实无关的量化,是一种代表形式。
使用 C 语言的后缀,发送 ZERO (0) 八进制、ZERO XIS (0x) 十六进制、ZERO BE (0b) 二进制、e NADA DE SUFIXO 十进制。

我们的基础是存在的。推荐人:

Primeiro,是按位AND操作的示例,com 或数字7,二进制数0111

    7 AND 7 ou TEST 7, 7

    0b0111
    0b0111
    ------
    0b0111
Enter fullscreen mode Exit fullscreen mode

AND操作: 0b1 AND 0b1 = 0b1
0b1 AND 0b0 = 0b0
Ela só resulta em 0b1 se ambos os operandos forem 0b1。
0b0 的操作数,操作结果为 0b0。
没有窗口:abra sua calculadora,escolha o modo programador,e faça as contas。

注: O zero à esquerda não diz nada,nem precisaria ali estar。 0111 e 111 dão na mesma。
Você precisa saber sobre algumas convenções de tamanhos, chamadas WORD.双字和四字。
观察: 1. 翻译的单词是“palavra”,不是翻译的,不是我们使用的。 Mas você pode ver materiais falando sobre“o tamanho da palavra”。
2.O tamanho real a que cada WORD serefere pode mudar conme o sistema operacional.
莱娅: https://mentebinaria.gitbook.io/engenharia-reversa/numeros/o-byte

最重要的是零:-恢复字节 tem oito 位。一组号码,代表第二个会议,其中的号码最多为 BYTES,代表号码:0000 0111。 Viu? Oito 位(1 BYTE = 8 位),em duas colunas,com quatro valores cada。
对于服装,价值 que usam quattro 位或菜单,eu os 代表“0000”。

EFLAGS 注册人

Nós temos também um registrador especial, chamado EFLAGS , que possui todas as flags usadas pelo sistema, cada uma com um propósito differenterente, que por sua vez, serão emidas em minatedas operações, com o fim de sinalizar alguma coisa (leia o manual da Intel, link)阿拜索)。 Não vou me estender na explicação。
Para saber mayis sobre EFLAGS, confira essaparte do livro gratuito de Assembly: https://mentebinaria.gitbook.io/ assembly/aprofundando-em- assembly/flags-do-processador

集市上的注册商、注册商、标记名是ZeroFlag
Essa 标志与 com 作为比较指令、cmpe 和teste 作为条件条件指令结合使用,用于控制程序执行的流量。
Sobre as instruções de salto condicional, veja: http://unixwiz.net/techtips/x86-jumps.html

注: Baixe o 英特尔手册。列表中的所有内容、执行所需的条件(或 JMP 中的不同条件): https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html

图片描述
最初链接到网站,然后将其设置为图像。

操作TEST CL,CL结果为0,将ZeroFlag设置为 1:ZF=1
这是TESTJE(如果相等则跳转)指令的组合:

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
Enter fullscreen mode Exit fullscreen mode

ECX是 32 位注册器,使用“umaparte dele”、“dividindo-o”:

图片描述

图片描述
(OBS:忽略RCX,但 64 位注册者可以使用该名称,os coloquei ali para que você saiba da exitência dele)。

使用ECX注册器、使用 TODO 元素、使用 4 字节
(4 字节或 32 位)来使用 espaços - 包括 32 位 ECX、16 位 CX、8 位 CH、8 位 CL。

请注意ECX和完整的身体,使用特定的部分,或使用 ler/escrever 部分的计算机,发送 CX、CH 或 CL。

“Curiosidade”:反 16 位存在的处理器,CH ficava com os 8 位主要重要 e CL com os 8 位主要重要,e hoje em dia ainda é assim,所以 os registradores possuem mais espaço;多个空间,多个分区。

Para saber mais sobre bits mais importantes e menos importantes (MSB e LSB),
accesse o link: https://www.morningstar.io/post/2016/12/25/midi-msb-and-lsb#:~:text=MSB%20stands%20for%20most%20significant,4%20bits%20would%20be%200011

CH e CL : o "C" é padrão para Counter (mas o registrador é de propósito geral, então pode ser usado para quase "qualquer coisa"), o H表示“高字节”eo L “低字节”
(o E de ECX é de Extended, lembra queera CX -16 位? Ele foi "extendido" para 32 位)。
更重要的是: https: //en.wikipedia.org/wiki/IA-32


输入处理

打开输入/代码确认器,在指令中设置断点test cl, cl,在相应的输入/代码中设置断点,在程序中运行,然后在测试期间使用CL或 valor 0 ; Inserindo um valor errado,ele vai estar com valor 1 nesse momento。
Assim temos a prova de que é realmente acontece recognizeação Final do input inserido.

在指令中设置断点test cl, cl,输入错误并进行新操作。

图片描述
O registrado EFLAGS (circulado em vermelho, a direita) nosmostra que a ZeroFlag vai ser modificada na próxima operação através do traço vermelho abaixo de ZF .
Circulado em preto, temos o valor contido em CL , bem como vemos sublinhado em verde na coluna dos registradores.
如果输入/代码错误,则 ZeroFlag 设置为 0,则测试结果为 0。 Dê um stepover e veja por si mesmo。


了解当前test cl, cl指令pop ecx

一个指令,说明它pop没有堆栈/皮拉的拓扑(visível no registrador ESP ,e carrega para dentro do operando,que nosso caso é o ECX

注: Não se esqueça de que o registrador **ESP * 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 ECX .*

在指令中设置断点pop ecx,输入错误,点击“OK”:

图片描述

Nesse momento, o topo da nossa stack/pilha está assim(输入“AAA”,que é errado):

图片描述

Como o code/input não é o correto, o topo da stack está com 1.
(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 0 no topo)。预先执行堆栈/堆栈的操作,然后再进行操作,然后就可以使用输入/代码的功能来确认或错误。

请注意ECXCL和后续操作的使用。
Com isso, na operação test cl, cl(é o mesmo que test 1, 1) temos or resultado 1, a ZeroFlag não é setada ( ZF=0), então o programa não pula para crackme1.4016F6.


Vamos rastrear a origem desse valor no topo da stack

如果我的勇气、零或嗯、没有任何时间、没有任何时刻、pop ecx确定了成功或错误、依赖者的输入,您会遇到一个原始的数字。
堆栈/堆栈中的值,在断点期间pop ecx,可以在实际功能中进行运算。

正如激光雷达的响应说明所示,堆栈/pilha 的值包括POPPUSH
POP: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(ESP)。
PUSH:减少堆栈/皮拉 ( ESP ) 和操作或操作到皮拉的拓扑。
请不要参考英特尔的手册!

从注册器EAX 的“guardado”功能中恢复勇气

注意:我们假设了一个 Primeiro 教程,与 x64dbg 相关,并且在 x86 的 Assembly 中作为函数进行了解释。 Novamente colocarei 或链接: https://dev.to/ryan_gozlyngg/engenharia-reversa-primeiro-contato-parte-1-2gih

接下来继续:

  1. Setamos um 断点是最接近call的指令test cl, cl
  2. 执行新程序,不设置断点。执行此操作后,输入“Run”(输入:F9),然后在断点处或输入新位置处执行断点操作。
  3. Insira uma mensagem ERRADA 没有输入/代码。继续“Ok”。
  4. 按下F8通过指令调用EIP并验证注册器EAX
  5. 在EAX和堆栈 / pilha 拓扑上验证是否继续进行验证(通用命令push eax)。

MUITA ATENÇË NO 6° PASSO:o endereço do topo da stack/pilha,em ESP,Precisa Ser 0x19EFDCimediatamente depois da instrução call。 Isso porque, no momento do pop ecxem xxxxx, o endereço (da stack/pilha) 0x19EFD8é que está com o nosso valor (0 ou 1) para o test cl, cl, e agora estamos assumindo que esse valor foiguardado na stack/pilha via instrução PUSH , a qual decrementa o endereço de ESP , e se você这是英特尔的文档,请参阅ESP é decrementado 4。标识0x19EFDC - 4 = 0x19EFD8

(手册说明:操作数大小(16、32 或 64 位)决定堆栈指针递减的量(2、4 或 8)。No nosso caso,como veremos logo,o operado é EAX,标志 32 位,decrementado por 4)。

注意: Setando Breakpoint - alguns 详细信息:

按下命令,在命令中设置断点,在 x64dbg 中设置断点,并与 tecla **F2

  • 选择一个 linha desejada,e aperte **F2 ,一首“bolinha” no canto esquerdo ficará **vermelha
  • 如果您想使用“bolinha”,请单击“bolinha”,然后单击“bolinha”,以取消断点。
  • 单击“bolinha”可以删除断点。

注意: Ao clicar duas vezes em uma instrução call, ou dar um **step in * 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.*
Como fazemos para voltar à前面的指令? Para isso usamos o seguinte atalho: -


观察堆栈

过去的一切都是……

图片描述

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á call, no endereço quebuscamos.
请按照说明进行观察。 Na imagem, paramos antes da função ser executada。
执行步距 ( F8 )。

图片描述

可以通过堆栈/堆栈的拓扑结构来实现,也可以通过指令来push eax减少ESP 的大小,或者通过EAX来实现堆栈/堆栈的值“1” 。

Bem como estávamos procurando!


函数返回

一个关于 x86 程序集的 C 程序的简短示例,对 x86 程序的功能进行了改进,并通过EAX进行了修改(在调用约定方面)。

// 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
}
Enter fullscreen mode Exit fullscreen mode

观察crackme1.46B828的功能

有趣的是,我们之间的争论已经过去了。
您不可以将调用约定解释为函数,但它可以作为函数的参数进行讨论。 Sim 可以通过 Assembly 的功能来进行操作。
如需了解更多信息,请访问链接:https://mentebinaria.gitbook.io/assemble/programando-junto-com-c/convencoes-de-chamada-no-windows
https://en.wikipedia.org/wiki/X86_calling_conventions

总结一下,作为 convenções de chamada(调用约定),我们可以通过以下方式进行讨论。 Aqui nos podemos ver que antes da função ser chamada, or endereço de algo que está em [ebp-10]é carregado em EDX , e também vemos que o que está no topo da stack é colocado dentro de EAX .

图片描述

Vamos ver, brevemente, o que essas funções, leae popestão fazendo:

lea- 加载有效地址:Carrega o endereço de qualquer coisa que está em [ebp-10]e Guarda em EDX。 Para entender [ebp-10],继续链接:https://mentebinaria.gitbook.io/ assembly/ a-base/enderecamento

pop- 如果没有 TOPO da stack/pilha 并保护任何操作,则可以保护EAX,并可以继续增量 o topo da stack/pilha。

注册商EAXEDX 所通过的参数
进入功能是很有趣的。


发现价值,无需倾倒

Vamos 的速度非常快,没有 x64dbg。
(Algo como [ebp-10]é carregado em EDX , basta um step-over para executar a instrução, e aí verificamos oque é que foi carregado em EDX , muito mais simples)...

Vamos ver quais valores se encontram em [ebp-10], e no topo da stack nessa hora:

图片描述
Você já deve saber 巴士车 esse valor no dump。 Botão direito do mouse na instrução desejada 等(basta fazer como na imagem acima)。

遭遇勇敢的事,但没有发生[ebp-10]

Agora vamos ao topo da stack/pilha:

图片描述
Perceba que o topo da stack/pilha (em ESP ) é semper destacado em verde na Janela da Stack.
Vamos ver os valores carregados nos registratores:

图片描述

查看EDX的评论,了解其0x0019F02C对字符串“***vErYeAsY***”的价值。 Sabemos que é um endereço pelo símbolo“&”。
请注意不要转储并确认这一点。

Em EAX temos o valor 0x0019F030, e para sabermos oque tem lá, podemos segui-lo no dump.

图片描述
Perceba o valor que se encontra aqui。 Parece outro endereço。
Podemos tentar seguir ele no dump também。

图片描述
Chegamos nesse lugar。观察 que é aqui que se encontra o nosso 代码/输入。
0x41 é o mesmo que o char 'A'. Cada 0x41 是一个字节,是一个连续的字符串:

 "AAA\0" 
Enter fullscreen mode Exit fullscreen mode

Os três caracteres 'A', mais o null terminator \0, que indica o fim da string。
Confira:https://man7.org/linux/man-pages/man7/ascii.7.html

这是事实,它的作用是接收双弦琴弦的声音。
Nos perguntamos: Será que ela vai comparar nossa string "AAA" com essa string different aí??? E então testamos 字符串“***vErYeAsY***”como 代码/输入。
E então é isso,funcionou!


进入crackme1.46B828功能

使用STEP-INTO ( F7 ) 即可进入该功能。

功能中心:

图片描述

这是一个有趣的争论、渲染和“取消引用”,它是EAXEDX中实际价值的体现。 Portanto、depois dessas operações MOV、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)。

图片描述


观察:一般来说,乐趣是在乐趣之外的,乐趣是在乐趣之外的,但您的想法是:什么是乐趣? Será que estou no caminho certo?

我感觉我没有任何问题,请参阅我们的指示call crackme1.460C48setne alsobre ela mais a frente)。
ALé aparte “mais baixa” de EAX , sabemos que ele contém or retorno da função a execução dela. E a operação que é feita com AL nos dá or retorno "1" quebuscamos.

Por isso achei que valia apena Continuar entrando nas funções.
如果您有计划,请继续努力,我们将继续为您的计划提供动力,以继续您的计划。

Vamos para essa outra função agora。


Entendendo como chegamos ao resultado

线性处理(注意:não vou expor o processo todo devido ao tamanho que o texto ficaria,vou focar nos pontos mais importantes para esse exemplo)。

注意:之前,请注意,与没有输入的字符串数字一致,程序与功能不同,可以比较不同的字符。 Sendo assim,Quanto maior a nossa string,mais testes serão feitos。
没有测试使用以下字符字符串:“AAA”。

附带功能过程0x00460C48、比较结果:

功能简介:

1.cmp eax, edx

比较双弦的渲染。CMP 的
说明如下:。与一次齐射的结果不同,它的操作是永久的。 感知到的结果是比较的,是一个近似的指令,是“pule se for igual”,没有任何说明。eax - edx


2.test esi, esi

验证代码/输入não está vazio,caso esteja,ele pula para o fim da função e termina retornando 1


3.test edi, edi

验证字符串 com 或代码/输入相关信息,通过编程器,而不是任何东西。


4. mov eax, dword ptr ds:[esi+4]
mov edx, dword ptr ds:[edi+4]
EAX接收到字符串,然后输入代码/输入
edx接收到字符串,然后输入函数。
O tamanho das strings foi Calculado em outra função。


5.sub eax, edx

EDXEAX子集。一个 14 字节的字符串,十六进制为 0xE。
内容:
COM O 输入“AAA”:3 - 14 = -11 ou 0xFFFFFFF5
COM O 输入对应:14 - 14 = 0

O resultado é Guardado em EAX

如果使用 14 个字节,则发送一个字符串或不存在,sub eax, edx操作结果为 ZeroFlag = 1,CarryFlag = 0。
操作结果为 0,ZeroFlag设置为“1”。


6.ja crackme1.460C6B

JA - 如果以上则跳转,脉冲为标志CF e ZF forem ambas iguais a 0
Em outras palavras, o salto so será executado caso nossa string seja ==maior== que a string do programador.
发送一个字符串,发送一个程序字符串,一个没有设置的进位标志,没有结果的负值,没有设置的零标志,没有设置的操作结果为零。

CF 或 Cray Flag:使用精确的操作来保护结果,CF é setada para “1”。

O bit mais a esquerda é usado quando precisamosrepresentar um número com sinal, um numero negativo.

操作的结果是字符串菜单“AAA”设置了进位标志,程序不执行或跳转。 Já com a string correta, ele executa o salto.

Resumindo:
Com Uma ==String Menor==: [CarryFlag é setada eo salto não é executado]
Com Uma ==String de 14 bytes==: [ZeroFlag é setada eo salto não é executado]

Todo esse processo para ver se o code/input passado por nós é maior que a string do Programador.


Caso o salto não seja executado, as seguintes instruções são usadas

7.add edx, eax

COM UMA STRING MENOR
使用字符串“AAA”。
eax: 0xFFFFFFF5 - no caso de "AAA" (ou qualquer string de três bytes)
edx: 0xE
计算:0xE + 0xFFFFFFF5 = 00000003(结果 vem com o MSB setado:100000003)

COM UMA 字符串 DE 14 字节
eax: 0 - resultado da subtração de 14 - 14
edx: 0xE - tamanho da string em hexadecimal (0xE = 14)
计算:0xE + 0 = 0xE

您可以恢复EDX字符串中的字节数

O resultado é Guardado em EDX
E em seguida o resultado é Guardado na stack com push edx.


8.shr edx, 2

Aqui o 程序使用SHR指令,com EDX和编号2
SHR é usada para mover os bit de EDX duas casas para a direita。
Paracada bit movido para a direita, um Zero é adicionado à esquerda.

14 字节 COM UMA 字符串示例

EDX 的值是 0xE 或 14.
14 二进制代码:1110
Agora vamos mover os bits para a direita duas vezes:

1110
0111 -> 1.movemos um bit para a direita e adicionamos um Zero à esquerda
0011 -> 2.movemos um bit para a direita e adicionamos um Zero à esquerda

Agora nós ficamos com o resultado 0011 que é 3(três é 代表十六进制和十进制的消息格式)。

指令的终点是EDX = 3。

3 字节 COM UMA 字符串示例

EDX 是 3.
3 二进制文件:0011
Agora vamos mover os bits para a direita duas vezes:

0011
0001 -> 1.movemos um bit para a direita e adicionamos um Zero à esquerda
0000 -> 2.movemos um bit para a direita e adicionamos um Zero à esquerda

Agora nós ficamos com o resultado 0000 que é 0(零和代表十六进制和十进制的消息形式)。

当指令结束时,EDX = 0。


9. je
se shr edx, 2 == 0(Testando para ver se a operação resultou em Zero)
a operaçãoserve para o programa decidir qual caminho tomar baseado no tamanho da string que nós passamos para ele.
Se for uma muito pequena, ele vai pular para uma comparação de um único byte, o mais a direita。
我们将一个字符串与一个相关的字符串进行比较,比较 4 个字节,
然后将其作为一个程序,始终将其作为字符串的基础。

将结果从 0 字节字符串转换为 14 字节字符串:

图片描述
将 14、13 和 12 字节结果视为 3 的字符串,以便在本机中实现功能,并检测到差异。


功能逻辑概述

在简历中,您可以 100% 地使用逻辑,并以相同的方式进行操作,并且可以以任何节奏来完成所有任务,并以字符串的方式来完成所有操作,而不是像字符串一样。

Aqui não voumostrar o que cada uma das instruções seguintes faz, isso vai deixar esse Tutorial mais maçante e longo ainda...

如果您想使用军刀,请注意以下几点:
了解一系列盐 ( jmp e jcc) 和比较 ( test e cmp)。
其功能是作为字符串和字节进行比较。
比较变量与字符串环境的比较顺序。

Bom,sabemos que a função vai retornar um valor dentro de EAX

通过这些特征字符串,您可以了解 EAX 的功能,并了解 EAX 的价值,并了解有关本sub eax, edx教程的说明,即“最终实现结果”。

这是什么变化?

使用说明 ( sub eax, edx) 后,将在EAX中修复,然后按说明进行步过。

您可以通过EAX指令来了解EAX 的价值和意义。
(Mas lembre-se que o percurso dependente do tamanho da string que usamos no code/input)。

在此,我们将直接执行最后一项功能的程序jmp
EAX不可以改变,e voltamos 是前面的功能。


函数的意义和结果的意义

大家都知道,比赛结果已经恢复到正常状态,但最终的结果却是确定的。

最后比较一下,或者是“1”,或者是“0”。

一个有趣的过程crackme1.46B828

图片描述

请注意以下功能和call crackme1.460C48说明setne al


SETNE - 说明结果或结果

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

前面的情况下,前部指令会在EAX中恢复,并依赖于弦乐。请继续阅读最终说明的最新功能,并获取最后的比较说明。

Para voltar para trás, e seguir esse Fluxo, basta usar o atalho -(traço)。
Assim vemos onde que a ZeroFlag é setada.

Vamos seguir o caso da 字符串“AAA”:

图片描述
尾音的一个功能是RET指令的前奏。
您可以使用当地的电压来进行比较。

图片描述
Voltando,vemos 或 local do salto,e em cima dele,一个比较工具,可以与程序员直接比较字节。
但结果不同,但没有 ZeroFlag 设置。

请使用 ZeroFlag 来设置,然后使用“1”指令来注册setne alEAX

执行EAX后,将执行以下setne al操作: 执行EAX操作,执行指令0xFFFFFF01setneand eax, 1

“1”代表0x00000001EAX 和 EAX,是0xFFFFFF01第一个字节的一部分,可能是“1”的直接含义,“0”的含义是“0”,字节的结尾是零。 Lembra,操作与结果为“1”,将“1”作为位,然后与字符串相关,AL é setado para 0,然后操作与结果为 0。


最终考虑

Espero que você tenha conseguido seguir e entender até aqui.
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.

Para iniciar de verdade na engenharia reversa, eu recomendo começar pela seguinte playlist:

CERO - Curso de Engenharia Reversa Online 由 Mente Binária 提供:

Curso de engenharia reversa em português 100% 免费。

https://youtube.com/playlist?list=PLIfZMtpPYFP6zLKlnyAeWY1I85VpyshAA&si=3wYZb0E7iHaAFaMm

文章来源:https://dev.to/ryan_gozlyngg/engenharia-reversa-primeiro-contato-parte-2-m2g
PREV
🏆 在你的 readme 中添加动态生成的 GitHub 奖杯快速入门关于排名关于显示详细信息
NEXT
如何在 Linux Mint 21.3 上设置 Microsoft Office:综合指南