
مولّد شيلكود متعدّد الأشكال للتنفيذ في الذاكرة لملفات EXE وDLL و.NET وVBScript وJScript مع توزيع عشوائي لكل مخرَج ولكل بناء، لتجنّب الاكتشاف ومقاومة التوقيعات.
ابن العم المراوغ لـ Donut.
Fritter هو نسخة مشتقّة (fork) معدّلة بشكل كبير من مولّد شيلكود Donut الخاص بـ TheWover و Odzhan. يولّد شيلكودًا مستقلًا عن الموضع (position-independent shellcode) للتنفيذ في الذاكرة لنصوص VBScript و JScript وملفات EXE و DLL وتجميعات .NET، مع التركيز على المراوغة ومقاومة التوقيعات. قاعدة الشيفرة مقتصرة على x64 فقط.
الكثير. يزيل Fritter الميزات غير المطلوبة بشكل شائع ويستبدل المكونات الداخلية التي أصبحت ذات توقيعات معروفة على مر السنين. أُعيدت صياغة طبقات التشفير والضغط والهاش وحلّ واجهات برمجة التطبيقات (API) ضمن مجالات أخرى عديدة.
تعدد الأشكال (Polymorphism) والمراوغة هما هدف التصميم. كل مخرَج فريد، وكل بناء (build) للأداة فريد بحد ذاته. هناك طبقتان متميزتان:
عشوائية لكل مخرَج (Per-output randomization): تُطبَّق في كل مرة يُستدعى فيها fritter. يُعاد توليد كعب الدخول (entry stub)، وفكّ الترميز متعدد الأشكال (polymorphic decoder)، ومفاتيح التشفير، والعديد من العناصر البنيوية داخل الشيلكود المولَّد من إنتروبيا جديدة في كل بناء PIC.
عشوائية لكل بناء (Per-build randomization): تُطبَّق في كل مرة يُترجَم فيها fritter نفسه. ثوابت دوران التشفير والهاش، وتخطيط جدول حلّ API، وتشويش السلاسل في جانب الشيم (shim)، واتجاهات اجتياز PEB، وأنماط المسح بعد التنفيذ، والعديد من المحاور البنيوية داخل المُحمِّل والشيم تُثبَّت وقت الترجمة.
في وقت التشغيل، يقلل Fritter من البصمة التنفيذية للمُحمِّل. يُقسَّم المُحمِّل إلى دوال مشفّرة بشكل فردي، لكل منها قسم PE خاص بها، ومفتاح XOR خاص بها، وموزّع (dispatcher) خاص بها. بايتات دالة واحدة فقط تكون بنص واضح في أي لحظة معينة. أُوقف نموذج النافذة المنزلقة VEH السابق لصالح نموذج التوزيع (dispatch) هذا.
هذا مهم. الملفات الثنائية المبنية مسبقًا والمتاحة للاختبار في releases تتشارك ثوابت البناء الخاصة بها بين جميع مستخدمي الملف الثنائي.
ابنِ نسختك الخاصة. تتم إعادة عشوائية المحاور الخاصة بالبناء عند كل استدعاء لـ make:
# Linux, static-musl ELF, no runtime libc dependency
# Requires: build-essential, mingw-w64, musl-tools
make -f Makefile.linux release
# Windows (MSVC), recommended on Windows
nmake -f Makefile.msvc
على Windows، سلسلة الأدوات (toolchain) الموصى بها هي MSVC. فهو يضع كل دالة من دوال المُحمِّل في قسم PE خاص بها ومحاذٍ للصفحة، وهو ما يحتاجه نموذج التوزيع لكل دالة N>1. يُخرِج mingw حاليًا كل شيء في .text واحد، وبالتالي يشغّل نقطة دخول واحدة تغطي المُحمِّل بالكامل بمفتاح XOR واحد (مطابق وظيفيًا لمخرجات MSVC، لكن مع موزّع واحد فقط من تعدد الأشكال بدلًا من عدة موزّعين). إذا لم يكن لديك Visual Studio، ابنِ ضمن WSL باستخدام Makefile.linux؛ فهو يترجم المُحمِّل الخاص بـ Windows بشكل متقاطع عبر mingw-w64.
كل make يشغّل tools/gen_poly لإصدار ثوابت جديدة خاصة بالبناء وtools/gen_api_shuffle لتبديل جدول حلّ API. الملف الثنائي fritter الناتج فريد بحد ذاته، بثوابت تشفير مختلفة، وثوابت هاش مختلفة، وتخطيط جدول API مختلف، وتشويش سلاسل مختلف في جانب الشيم، وهكذا. كل شيلكود يولّده ذلك الملف الثنائي سيتشارك تلك الثوابت الخاصة بالبناء لكنه يختلف على المحاور الخاصة بالمخرجات.
مجلد /test مرفق مع calc.exe وinject_local64.exe لاختبار Fritter. لإعادة بناء المضيفات الاختبارية بنفسك: nmake -f Makefile.msvc harness، أو make -f Makefile.linux harness ضمن WSL.
fritter [options] -i <EXE/DLL/VBS/JS>
INPUT
-i, --input <path> Input file to execute in-memory
-p, --args <args> Parameters / command line for target
-c, --class <name> Class name (required for .NET DLL)
-m, --method <name> Method or function for DLL
-r, --runtime <ver> CLR runtime version
-w, --unicode Pass command line as UNICODE
-t, --thread Run unmanaged EXE entrypoint as thread
OUTPUT
-o, --output <path> Output file (default: loader.bin)
-f, --format <1-8> 1=Bin 2=B64 3=C 4=Ruby 5=Py 6=PS 7=C# 8=Hex
-x, --exit <1-3> 1=Thread (default) 2=Process 3=Block
-y, --fork <offset> Fork thread, continue at RVA offset
LOADER
-e, --entropy <1-3> 1=None 2=Random names 3=Names+Crypto (default)
-k, --headers <1-2> 1=Overwrite (default) 2=Keep all
-g, --chunked <0-1> (deprecated; dispatch shim is always used)
-d, --domain <name> AppDomain name for .NET
-j, --decoy <path> Decoy module for Module Overloading
STAGING
-n, --modname <name> Module name for HTTP staging
-s, --server <url> Server URL (supports basic auth)
fritter -i payload.exe
fritter -i implant.dll -m RunMain -p "arg1 arg2"
fritter -i payload.exe -g 0 -k 2 -o out.bin
تُنظَّم حمولة شيلكود Fritter في طبقات متداخلة، كل واحدة منها تفكّ تشفير التالية أو تجهّزها (staging):
كعب الدخول (Entry stub). بادئة حشو عشوائية بطول متغير، وروتين محاذاة RSP يُولَّد لكل مخرَج، وجسر انتقال (trampoline) توليدي. يستند إلى نهج Shikata Ga Nai.
فكّ ترميز XOR متعدد الأشكال. يُجمَّع بمرحلتين (two-pass). توزيع السجلات يُسحب من مجموعة عبر خلط Fisher-Yates. طول المفتاح يُختار لكل مخرَج. يُدخَل الحشو بين كل تعليمة حقيقية. تُعاد ترتيب مجموعات التعليمات القابلة للتحريك في الحلقة الساخنة ضمن قيود الصحة.
شيم التوزيع (Dispatch shim). يستبدل شيم النافذة المنزلقة VEH السابق. يقلب منطقة المُحمِّل من RW إلى RWX، ثم يسلم التحكم إلى نقطة دخول المُحمِّل. في نموذج التوزيع N>1، يُوجَّه كل استدعاء عبر thunk خاص بالدالة إلى موزّع خاص بالدالة يفكّ التشفير ويشغّل ويمسح عند العودة. يختلف تخطيط opcode لكل موزّع حسب كل بناء (انظر CHANGELOG v1.3).
المُحمِّل (Loader). مُعيّن (mapper) PE في الذاكرة. يحلّ APIs بالهاش، ويعيّن الـ PE المضمّن عبر واجهات الأقسام، ويطبّق الواردات / عمليات إعادة التوطين / استدعاءات TLS، ويستدعي نقطة الدخول، ثم يمسح. اتجاه اجتياز PEB، وبايت المسح بعد التنفيذ، ومواضع الملح (salt) البنيوية في MainProc، كلها تُعيَّن عشوائيًا حسب كل بناء.
التنظيف (Cleanup). يمسح صفحات المُحمِّل بنمط بايت خاص بكل بناء، ويمحو المثيل، ويخرج عبر إنهاء الخيط أو العملية وفقًا لـ -x. لا يوجد معالج VEH أو بنية سياق (context struct) لمسحها.
البصمة المتبقية بعد التنفيذ هي صفحة RWX صغيرة واحدة حيث عمل شيم التوزيع. في وضع الخيط، يُترك قسم الـ PE المُعيّن سليمًا عمدًا بحيث تمتلك استدعاءات CRT استمرارية.
Fritter مبني على أعمال TheWover و Odzhan، اللذين جعل مشروعهما الأصلي Donut توليد الشيلكود المستقل عن الموضع عمليًا ومتاحًا. إن بنيتهما وتصميم المُحمِّل وإطار PIC هي الأساس الذي يُبنى عليه كل شيء هنا. إن تعيين PE واستضافة .NET ومسارات تنفيذ السكربتات هي في معظمها من عملهما، وقد أُبقيت كما هي مع الاحترام.
BSD 3-Clause. انظر LICENSE.