miércoles, 30 de octubre de 2019

Registros principales para procesadores de 64 bits en ensamblador.

La CPU x86 tiene 14 registros internos y básicos. Algunos son realmente de 32 bits pero por ahora se utilizará el modo real que es compatible con el procesador 8086 (igualmente accesibles a la parte alta de éstos registros, inclusive en el modo real). Los registros son los siguientes (estos registros son de 16 bits nombrados de la siguiente manera, a excepción del registro de banderas).
Registros de uso general
  • AX: Acumulador (AL:AH)
  • BX: Registro base (BL:BH)
  • CX: Registro contador (CL:CH)
  • DX: Registro de datos (DL:DH)
Un registro es un espacio de almacenamiento disponible para el CPU. Una de las principales características de estos, es que pueden ser accedidos más rápido que cualquier otro dispositivo de almacenamiento de una computadora. Los procesadores x86 cuentan con una serie de registros disponibles para utilizar como almacenamiento temporal para variables, valores y demás información que utilizan durante la ejecución de instrucciones como así también punteros a secciones de memoria como la pila. Podemos mencionar 4 categorías diferentes:
  • Registros generales
  • Segmentos de registros
  • Flags (banderas de estado)
  • Instruction Pointer (IP), puntero a la próxima instrucción a ejecutar.

Registros generales

Normalmente, los registros generales almacenan datos o direcciones de memoria y son utilizados de manera intercambiable para lograr que se ejecuten las instrucciones del programa.  Algunos de estos registros generales son utilizados para funciones específicas. Por ejemplo, para realizar multiplicaciones o divisiones se utilizan los registros EAX EBX.

Flags

El registro que nombramos como EFLAG es un registro de estado. En esta arquitectura, tiene una longitud de 32 bits y cada uno de sus bits es una bandera. Según el valor de 0 o 1 de cada bit serán utilizados para controlar las operaciones de la CPU luego de la ejecución de una instrucción. Entre los registros más importantes para remarcar en relación al análisis de malware podemos enumerar:
  • ZF (Zero Flag): Este bit se activa cuando el resultado de una operación es igual a cero.
  • CF (Carry Flag): Este bit se activa cuando el resultado de una operación es muy grande o muy pequeño para el operador de destino.
  • SF (Sign Flag): Según si el resultado de una operación es un valor positivo o negativo. Si el valor es positivos se queda en cero y es uno en caso contrario.
  • TF (Trap Flag): Este flag se utiliza para depurar (debugging) un programa. En caso de que esté activo el procesador ejecutará una instrucción a la vez.

Un ejemplo práctico, la instrucción mov

De todas las instrucciones que se pueden ejecutar dentro de un procesador existen algunas de ellas que son las más comunes y habituales como así también las menos complejas. Una instrucción muy común es la instrucción mov cuya función es mover los datos desde una ubicación a otra. Esta instrucción utiliza dos operadores para realizar su trabajo. El primero es el destino al cual se quieren mover los datos y el segundo está relacionado con la dirección u ubicación de destino.

Dentro de los operadores con los que se puede utilizar la instrucción podemos incluir registros o direcciones de memoria directamente. A continuación podemos observar algunas de los usos más comunes de esta instrucción: