Pular para conteúdo

Arquitetura de Hardware e Software para Análise de Malware

Já foi estudado anteriormente a estrutura de executáveis Windows e vimos como esse conteúdo foi importante para entender mais profundamente algumas técnicas de análise estática de malware simples, como a análise de bytes mágicos. Agora para a análise estática avançada, ainda mais conhecimento técnico é exigido do analista para entender o que está fazendo e como prosseguir. Um dos conhecimentos necessários para a análise estática avançada é justamente sobre a arquitetura de software e hardware.

Arquitetura de Neumann

A arquitetura de Neumann é um modelo baseado fortemente na Máquina Universal de Turing e é considerado atualmente como a arquitetura universal dos computadores. Sua arquitetura é simples de entender, ela prevê o computador como uma interação entre 3 componentes:

  • Memória: componente de armazenamento de dados.
  • Unidade Lógica Aritmética (ULA): responsável por realizar operações matemáticas típicas de um sistema computacional, como soma, subtração, etc.
  • Unidade de Controle: unidade responsável por ler as instruções de comando e realizar chamadas para os outros componentes realizarem suas devidas operações. Logo também é o responsável por lidar com as entradas e saídas do sistema.

As unidades de controle e lógica aritiméticas juntas formam a Unidade Central de Processamento (CPU) ou Processador.

Arquitetura de Neumann

Memória RAM

Um programa normalmente fica armazenado na memória secundária (HD, SSD) até que a máquina queira executá-lo. Quando em execução, o programa é levado da memória secundária para a memória primária (RAM, Cache).

A memória RAM é com quem a CPU mais se comunica durante a execução de um programa e pela sua velocidade extremamente mais veloz do que a memória secundária, ela guarda diveras informações essenciais. Por isso é importante entender como a memória RAM funciona.

Características

  • RAM = Random Access Memory
  • Memória Volátil, ou seja, ao desligar a máquina, as informações se perdem.

Estrutura e Segmentação da Memória RAM

A segmentação da memória é quando separamos parte ou toda a memória RAM em seções, intervalos de endereços da memória restritos para usos específicos.

Vimos anteriormente que um executável Windows segmenta sua memória para ser compreeendida em várias seções e cabeçalhos, como .text, DOS HEADER, .data. Outros formatos de arquivos fazem estruturas parecidas e nisso não há segredo.

Entretanto, até agora falamos somente dos dados estáticos ocupados pelo executável. Quando ele for executado, ou seja, quando estiver em runtime, muitos mais dados podem ser gerados e para lidar com isso, a memória RAM precisa liberar mais espaço. A fim de lidar com isso, programas reservam mais dois espaços na RAM:

  • Stack / Pilha: é um espaço reservado na memória RAM que funciona como uma LIFO (Last In, First Out - o último dado adicionado é o primeiro a ser retirado). Seu comportamento é igual a de uma pilha e por isso os programadores acham-na perfeita para armazenar dados de funções. Entre suas vantagens estão:
    • Possibilita "funções que chamam funções".
    • Possibilita funções recursivas.
    • Possui tamanho limtado, podendo gerar Stack Overflow ao exceder o tamanho esperado.
    • Possibilita a criação de escopos de memória existentes em linguagens de programação de alto nível.
  • Heap: espaço de memória que oferece endereços aleatórios da sua memória para armazenar seus dados. Você pede um endereço da Heap e ela reserva esse espaço, não deixando que outro programa a utilize. Normalmente é utilizado para alocação dinâmica de memória pelos programas.

Ambos os espaços são afastados do local de armazenamento dos dados dos executáveis e costumam ser usados por vários programas ao mesmo tempo.

CPU

A CPU, quando for executar o programa, fará as seguintes etapas para cada uma de suas instruções:

  1. resgatar a instrução da memória RAM.
  2. decodificar a instrução em código de máquina.
  3. executar cada instrução, uma por uma.

Para realizar todas essas funções, a CPU também dispõe de memória, uma memória muito mais rápida e cara do que as anteriores, os registradores. Registradores são estruturas eletrônicas de hardware implementados na CPU com a capacidade de armazenar dados. Eles funcionam da mesma forma que variáveis, mas com um número finito e bem mais limitado. Registradores serão importantes na análise estática avançada porque:

  • É comum que um programa utilize registradores na linguagem de baixo nível (Assembly, executável) ao implementar variáveis na linguagem de alto nível (Python, C, Java, etc).
  • Considere a memória RAM e os registradores como os verdadeiros métodos de armazenamento de um programa em execução. Dificilmente uma informação a ser executada não passará por um deles.
  • Registradores de uso geral podem guardam valores e endereços de memória importantes para o entendimento de um malware.
  • Registradores reservados para uso do computador podem guardar informações importantes sobre a situação atual da máquina ou de um processo que está utilizando.