Le Cast de Pointeurs en C

1. Définition : Qu'est-ce qu'un Cast ?

Le Cast est une instruction qui force le compilateur à changer sa vision d'une donnée ou d'une adresse mémoire. C'est comme changer de "lunettes" pour interpréter différemment les mêmes octets.

Syntaxe : (nouveau_type) variable


2. Le problème du pointeur vide (void* ou LPVOID)

En C, un pointeur void* est une adresse pure. Il dit OÙ est la donnée, mais il ne dit pas CE QUE c'est.

  • Le problème : Le compilateur ne connaît pas la taille de la cible.

  • La conséquence : Il est impossible de faire des mathématiques (+ i) ou d'accéder aux données ([]) avec un void*.


3. Pourquoi caster en unsigned char* ?

C'est le cast le plus utilisé pour manipuler des payloads ou du shellcode.

A. La taille de l'unité

Un unsigned char pèse exactement 1 octet (8 bits). En castant vers ce type, on dit au compilateur : "Chaque case de mémoire fait 1 octet".

B. L'arithmétique de pointeur

Quand tu fais pointeur[i] ou *(pointeur + i) :

  1. Le CPU prend l'adresse de base.

  2. Il ajoute i * (taille du type).

  3. Si c'est un unsigned char : Il avance de i * 1 octet. C'est précis !


4. Analyse d'une instruction complexe

Prenons la ligne de ton loader : ((unsigned char*)exec)[i]

  1. exec : L'adresse de base (ex: 0x100).

  2. (unsigned char*) : Le Cast. On dit au C : "Regarde 0x100 comme le début d'un tableau d'octets".

  3. [i] : L'index. On demande d'aller à la i-ème case.

    • Si i = 2, le CPU va chercher l'octet à 0x100 + 2 = 0x102.

Last updated