Process Hacker, PEB et NTDLL : les clés pour des applications natives ultra-minimalistes
🤯 Dans certains cas, on veut maîtriser chaque octet. Pourtant, même un programme basique peut embarquer des DLL dont on pourrait se passer. Plongeons ensemble dans les entrailles de l'exécutable.
Un 'Hello World' basue compilé en C++ pèse environ 11KB, il dépend de Kernel32.dll et VCRuntime140.dll. Avec un lien statique avec le CRT, la taille monte à 136KB ! 😱
Le CRT gère l'appel de `main`, l'exécution des constructeurs d'objets C++, les variables comme `errno`, et les opérateurs `new`/`delete`. Mais cette commodité a un coût en taille et en dépendances.
Pour des binaires ultra-minimalistes, réduire le CRT implique de paramétrer le linker pour réduire les librairies par défaut, de désactiver la vérification de sécurité du tampon (/GS), et de modifier le point d'entrée pour `mainCRTStartup`.
Adieu `printf` ! On le remplace par `WriteConsoleA` de `Kernel32.dll` pour l'affichage. Le résultat : un exécutable de seulement 4KB, avec juste deux imports de `Kernel32.dll`. C'est une belle victoire, non ? 😎
Mais on peut aller encore plus loin: chaque processus Windows charge systématiquement `NTDLL.dll` qui propose de nombreuses fonctions similaires au CRT, comme `sprintf_s`. La subtilité : la `NtDll.lib` standard de Microsoft n'exporte pas toujours toutes ces fonctions. On a alors deux options : soit créer une bibliothèque d'import personnalisée, soit recourir au linking dynamique via `GetModuleHandle` et `GetProcAddress`. ✨
Et pour les arguments de la ligne de commande `argc`/`argv` ? Sans le CRT, le système passe à `mainCRTStartup` un unique argument : le `PPEB` (Process Environment Block) et son membre `ProcessParameters` permettent d'accéder aux informations comme `ImagePathName` ou `CommandLine`. C'est le mode de fonctionnement des applications natives.
Pourquoi s'engager dans cette démarche de "minimisation" ? 🤔 Pour les DevSecOps et Purple Teams:
* Légèreté: Pour des outils offensifs discrets, des charges utiles ou des situations avec des contraintes de taille strictes, un binaire de 4KB est un avantage considérable.
* Les applications natives, dépendant uniquement de `NTDLL`, peuvent s'exécuter très tôt dans le démarrage de Windows (comme `Smss.exe` ou `autochk.exe`). Elles offrent une perspective unique sur le fonctionnement bas niveau du système.
Pour explorer ces concepts, l'article original est une mine d'or : https://scorpiosoftware.net/2023/03/16/minimal-executables/
C'est un sujet passionnant qui conduit vers d'autres sujets de développements passionants dans le domaine de la cybersécurité offensive et du reverse engineering 🤯
Quelle méthode préférez-vous pour remplacer les fonctions CRT par NTDLL ? Débattez dans les commentaires ! 👇
#Cybersécurité #DevSecOps #ReverseEngineering #WindowsInternals #Programmation #MalwareAnalysis #ExploitDevelopment #SecureCoding #ThreatHunting