
مستودع لأدوات تشغيل Shellcode لنظام ويندوز والأدوات المساعدة. تقوم التطبيقات بتحميل وتنفيذ Shellcode باستخدام استدعاءات API مختلفة أو تقنيات.
go-shellcode هو مستودع لمشغلات شيلكود (Shellcode runners) لنظام ويندوز وأدوات مساعدة. تقوم التطبيقات بتحميل وتنفيذ الشيلكود باستخدام استدعاءات API أو تقنيات مختلفة.
مشغلات الشيلكود المتاحة تشمل:
يستخدم هذا التطبيق دالة ويندوز CreateFiber من Kernel32.dll لتنفيذ الشيلكود داخل عملية هذا التطبيق. هذا مفيد عندما تريد تجنب الحقن في عملية بعيدة وتجنب استدعاء CreateThread. هذا التطبيق لا يستخدم دوال من حزمة golang.org/x/sys/windows. الفرق الأكثر أهمية هو أن هذا التطبيق يقوم بتحميل جميع ملفات DLL والإجراءات اللازمة بنفسه ويستخدم دالة Call() الخاصة بالإجراء.
ملاحظة: لم أكتشف طريقة لجعل العملية تخرج، وسيتعين عليك إنهاؤها يدويًا.
يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o CreateFiber.exe .\cmd\CreateFiber\main.go
يستخدم هذا التطبيق دالة ويندوز CreateProcess من Kernel32.dll. يتم إنشاء العملية في حالة معلقة (suspended)، ثم يتم تحديث AddressOfEntryPoint في بنية IMAGE_OPTIONAL_HEADER لتنفيذ الشيلكود في العملية الفرعية، ثم يتم استئناف العملية. هذا نوع من تجويف العملية (process hollowing) ولكن ملف PE الموجود لا يتم إلغاء تعيينه (unmapped) وThreadContext لا يتم تحديثه. يجب أن تتطابق بنية الشيلكود المقدمة (مثل x86 أو x64) مع بنية العملية الفرعية.
يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o CreateProcess.exe .\cmd\CreateProcess\main.go
يستخدم هذا التطبيق دالة ويندوز CreateProcess من Kernel32.dll. يتم إنشاء العملية في حالة معلقة (suspended)، ثم يتم تحديث AddressOfEntryPoint في بنية IMAGE_OPTIONAL_HEADER لتنفيذ الشيلكود في العملية الفرعية، ثم يتم استئناف العملية. هذا نوع من تجويف العملية (process hollowing) ولكن ملف PE الموجود لا يتم إلغاء تعيينه (unmapped) وThreadContext لا يتم تحديثه. يجب أن تتطابق بنية الشيلكود المقدمة (مثل x86 أو x64) مع بنية العملية الفرعية.
يختلف هذا التطبيق عن CreateProcess لأنه سيجمع أي بيانات مكتوبة إلى STDOUT أو STDERR في العملية الفرعية ويعيدها إلى العملية الأم. يتم جمع البيانات باستخدام دالة CreatePipe لإنشاء أنبوب مجهول (anonymous pipe) تتواصل من خلاله العمليات الأم والفرعية. هذا مفيد عند استخدام أدوات مثل Donut لتنفيذ تجميع .NET في عملية فرعية كشيلكود واسترجاع مخرجات البرنامج المنفذ. يمكن استخدام الأمر التالي لإنشاء شيلكود مستقل عن الموقع (position-independent) لتشغيل Seatbelt باستخدام Donut v0.9.3:
.\donut.exe -o donut_v0.9.3_Seatbelt.bin -x 2 -c Seatbelt.Program -m Main -p "ARPTable" Seatbelt.exe
يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o CreateProcessWithPipe.exe .\cmd\CreateProcessWithPipe\main.go
يستخدم هذا التطبيق دالة ويندوز CreateRemoteThread من Kernel32.dll لتنفيذ الشيلكود في عملية بعيدة. يتطلب التطبيق أن تكون العملية المستهدفة قيد التشغيل بالفعل. يمكن تقدير (PID) العملية المستهدفة في وقت التشغيل للاختبار باستخدام علامة سطر الأوامر -pid. قم بترميز PID ثابت في سطر الكود التالي للاستخدام العملي عن طريق استبدال 0 بـ PID المستهدف:
pid := flag.Int("pid", 0, "Process ID to inject shellcode into")
يستخدم هذا التطبيق دوال من حزمة golang.org/x/sys/windows، حيثما أمكن، مثل windows.OpenProcess(). يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o CreateRemoteThread.exe .\cmd\CreateRemoteThread\main.go
يستخدم هذا التطبيق دالة ويندوز CreateRemoteThread من Kernel32.dll لتنفيذ الشيلكود في عملية بعيدة. يتطلب التطبيق أن تكون العملية المستهدفة قيد التشغيل بالفعل. يمكن تقدير (PID) العملية المستهدفة في وقت التشغيل للاختبار باستخدام علامة سطر الأوامر -pid. قم بترميز PID ثابت في سطر الكود التالي للاستخدام العملي عن طريق استبدال 0 بـ PID المستهدف:
pid := flag.Int("pid", 0, "Process ID to inject shellcode into")
هذا التطبيق لا يستخدم دوال من حزمة golang.org/x/sys/windows. الفرق الأكثر أهمية هو أن هذا التطبيق يقوم بتحميل جميع ملفات DLL والإجراءات اللازمة بنفسه ويستخدم دالة Call() الخاصة بالإجراء. يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o CreateRemoteThreadNative.exe .\cmd\CreateRemoteThreadNative\main.go
يستخدم هذا التطبيق دالة ويندوز CreateThread من Kernel32.dll لتنفيذ الشيلكود داخل عملية هذا التطبيق. هذا مفيد عندما تريد تجنب حقن العملية البعيدة. يستخدم هذا التطبيق دوال من حزمة golang.org/x/sys/windows، حيثما أمكن، مثل windows.VirtualAlloc(). يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o CreateThread.exe .\cmd\CreateThread\main.go
يستخدم هذا التطبيق دالة ويندوز CreateThread من Kernel32.dll لتنفيذ الشيلكود داخل عملية هذا التطبيق. هذا مفيد عندما تريد تجنب حقن العملية البعيدة. هذا التطبيق لا يستخدم دوال من حزمة golang.org/x/sys/windows. الفرق الأكثر أهمية هو أن هذا التطبيق يقوم بتحميل جميع ملفات DLL والإجراءات اللازمة بنفسه ويستخدم دالة Call() الخاصة بالإجراء. يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o CreateThreadNative.exe .\cmd\CreateThreadNative\main.go