Técnicas Anti-Reversão (Parte 2)
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 3
instruçã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 3
instruçã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:

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:


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.