Técnicas Anti-Reversão (Parte 2)

Dec 05 2022
Na primeira parte, discutimos algumas técnicas comuns usadas por autores de malware para proteger seus aplicativos da engenharia reversa. Nesta segunda parte, veremos mais métodos e técnicas usadas para detectar e prevenir a engenharia reversa.

Na primeira parte, discutimos algumas técnicas comuns usadas por autores de malware para proteger seus aplicativos da engenharia reversa. Nesta segunda parte, veremos mais métodos e técnicas usadas para detectar e prevenir a engenharia reversa.

Detecção do depurador:

Técnica de tempo de execução de código:

Ao usar um depurador para analisar um executável as vezes usamos uma única etapa de execução para passar por algumas instruções de montagem, o tempo de execução será muito maior que a execução normal, vamos pegar esse código como exemplo:

No início do código temos uma chamada para a função “ GetTickCount ” que retorna a quantidade de milissegundos decorridos desde que o sistema foi inicializado. O código até a execução da função “ ShellExecuteW ” levará de 30 a 47 milissegundos conforme medi em minha máquina. Depois disso chamamos a função “ GetTickCount ” novamente para obter o tempo e depois obter a diferença entre os valores das duas chamadas, e se for maior que 70 milissegundos, saia do processo, caso contrário imprima a mensagem.

Existem outras APIs do Windows que podem ser usadas para obter tempo, como:

  • GetLocalTime().
  • GetSystemTime().
  • QueryPerformanceCounter().

Pontos de interrupção de software são uma técnica comum de antidepuração usada por agentes mal-intencionados para dificultar a engenharia reversa de seus malwares. Essa técnica envolve a inserção de uma instrução de código específica, conhecida como ponto de interrupção, no programa em um local específico. Quando o programa é executado, o ponto de interrupção fará com que o programa pare de executar, tornando difícil para um depurador analisar o comportamento do programa.

Uma maneira de implementar um ponto de interrupção usando a linguagem assembly é usar a int 3instrução. Esta instrução é uma interrupção de software que faz com que o programa pare de executar e transfira o controle para o depurador. Aqui está um exemplo de como usar a int 3instrução em C++:

Pontos de interrupção de hardware:

Pontos de interrupção de hardware são um tipo de técnica antidepuração que usa recursos de hardware especializados da CPU para detectar e impedir a depuração de um programa. Essa técnica envolve definir um ponto de interrupção em um endereço ou registro de memória específico e, em seguida, instruir a CPU a disparar uma interrupção sempre que o programa acessar ou modificar o endereço ou registro especificado.

Abaixo está um exemplo de como verificar se um ponto de interrupção de hardware está definido:

“Verificando ponto de interrupção de hardware”

Um valor diferente de zero em qualquer um dos registros de depuração pode sugerir que o processo está sendo executado em um depurador com um ponto de interrupção de hardware definido.

Autodepuração:

É uma técnica usada por autores de malware para impedir que um depurador se conecte ao processo ou verifique se o processo está em um depurador. Envolve o uso de um depurador para depurar o próprio programa, a fim de detectar e impedir que outros depuradores sejam anexados ao programa.

Abaixo está um exemplo de uma instância que cria uma segunda instância do processo e cria um evento nomeado com o nome “debugger_present”. A segunda instância do processo tentará anexar um depurador ao processo pai e, se falhar, definirá o evento que indicará ao processo pai que outro depurador está anexado a ele:

processo pai
Processo filho

UnhandledExceptionFilter()

Se um programa encontrar uma exceção que não seja manipulada por nenhum manipulador de exceção registrado, a função kernel32!UnhandledExceptionFilter() será chamada. É possível registrar um filtro de exceção não tratado personalizado usando o kernel32!SetUnhandledExceptionFilter(). No entanto, se o programa estiver sendo depurado, o filtro personalizado não será chamado e a exceção será passada para o depurador. Portanto, se o controle for passado para o filtro de exceção não tratada, pode-se inferir que o programa não está sendo executado em um depurador:

obrigado por reservar um tempo para ler isso até a próxima vez.

Dos relatórios da Infosec: Muito está surgindo na Infosec todos os dias, o que é difícil de acompanhar. Junte-se ao nosso boletim semanal para obter todas as últimas tendências da Infosec na forma de 5 artigos, 4 tópicos, 3 vídeos, 2 repositórios e ferramentas do GitHub e 1 alerta de trabalho GRATUITAMENTE!