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) :
Le CPU prend l'adresse de base.
Il ajoute i * (taille du type).
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]
exec : L'adresse de base (ex: 0x100).
(unsigned char*) : Le Cast. On dit au C : "Regarde 0x100 comme le début d'un tableau d'octets".
[i] : L'index. On demande d'aller à la i-ème case.
Si i = 2, le CPU va chercher l'octet à 0x100 + 2 = 0x102.