[ ممـيز ] تحميل وتشغيل CLR باستخدام COM Interop في PowerShell

Ris3r NuL

Ris3r NuL

عـضــو
18 أغسطس 2024
12
6
3
Egypt
بسم الله الرحمن الرحيم

كيف حالكم يا اعضاء الديف بوينت
رجعنا اليوم مع مقال حول [CLR]
مع كود بسيط لتوضيح طريقه عمله


في هذا المقال، سوف نشرح كيفية تحميل وتشغيل CLR (Common Language Runtime) باستخدام COM Interop داخل بيئة PowerShell، وذلك باستخدام كود C# يتم تحويله إلى PowerShell باستخدام الأمر Add-Type. هذا الكود يتضمن العديد من العمليات المهمة مثل تحميل الـ CLR، التحقق من إمكانية تحميله، وتنفيذ تطبيقات مكتوبة بـ .NET Framework.
اولا ما هو ال CLR

CLR هو البيئة التي تدير تطبيقات .NET، وتوفر مجموعة من الخدمات مثل إدارة الذاكرة، والـ garbage collection، والأمان، وإدارة الاستثناءات.

تعريف GUIDs وواجهات COM:

العديد من الواجهات في .NET تتطلب العمل عبر COM Interop للوصول إليها في بيئات غير .NET. لذلك، نحتاج إلى معرفة الـ GUIDs الخاصة بكل واجهة. في هذا الكود، قمنا بتعريف GUIDs للواجهات الرئيسية مثل:
  • ICLRMetaHost: التي تُستخدم لتحميل الـ CLR.​
  • ICLRRuntimeInfo: التي توفر معلومات حول الـ CLR الذي تم تحميله.​
  • ICLRRuntimeHost: التي تُستخدم لتنفيذ التطبيقات داخل الـ CLR.

    [/CENTER] [*]private static Guid CLSID_CLRMetaHost = new Guid("9280188d-0e8e-4867-b30c-7fa83884e8de"); private static Guid IID_ICLRMetaHost = new Guid("d332db9e-b9b3-4125-8207-a14884f53216"); ... [*][CENTER]
  • استخدام DllImport لتحميل مكتبة MSCorEE.dll:

    نستخدم دالة CLRCreateInstance من مكتبة MSCorEE.dll لتحميل الـ CLR. هذه الدالة تستخدم الـ GUIDs التي تم تعريفها للوصول إلى واجهة ICLRMetaHost.

    [/CENTER] [DllImport("MSCorEE.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern int CLRCreateInstance(ref Guid clsid, ref Guid iid, out IntPtr ppv); [CENTER]

    تحميل CLR والتحقق من إمكانية تحميله:

    بعد استدعاء CLRCreateInstance، نتحقق مما إذا كان CLR قد تم تحميله بنجاح باستخدام الـ GUID المحدد. إذا تم تحميله بنجاح، ننتقل إلى التحقق من إمكانية تحميل النسخة المطلوبة باستخدام IsLoadable.

    [/CENTER] IntPtr pClrHost = IntPtr.Zero; int result = CLRCreateInstance(ref CLSID_CLRMetaHost, ref IID_ICLRMetaHost, out pClrHost); if (result == S_OK && pClrHost != IntPtr.Zero) { ICLRMetaHost clrHost = (ICLRMetaHost)Marshal.GetObjectForIUnknown(pClrHost); ... } [CENTER]

    تنفيذ تطبيق .NET في AppDomain الافتراضي:

    إذا كان الـ CLR قابلاً للتحميل، نستخدم واجهة ICLRRuntimeHost لتنفيذ تطبيق مكتوب باستخدام .NET داخل AppDomain الافتراضي. يتم ذلك باستخدام الدالة ExecuteInDefaultAppDomain التي تستدعي طريقة محددة داخل ملف التجميع (Assembly).
  • [/CENTER] runtimeHost.ExecuteInDefaultAppDomain( @"C:\Users\Ris3rNuL\Desktop\M.dll", "M.MyClass", "MyMethod", "Hacked :)", out iRet ); [CENTER]


تحويل الكود إلى PowerShell:

بعد كتابة الكود C#، نقوم بتحويله إلى PowerShell باستخدام Add-Type، حيث يتم إدراج الكود مباشرة في PowerShell ككود C# قابل للتنفيذ.

[/CENTER] $csCode = @" using System; using System.Runtime.InteropServices; ... "@ Add-Type -TypeDefinition $csCode -Language CSharp [CLRLoader]::RunCLR() [CENTER]

في هذه الحالة، يقوم PowerShell بترجمة كود C# على الطاير، ثم ينفذه ككود مُجمع داخل البيئة.

الكود كامل فى المرفقات​
 

المرفقات

  • CLR.rar
    1.5 KB · المشاهدات: 19
التعديل الأخير: