سؤال

هل يوجد شيء مثل مُجمّع x86 الذي يمكنني الاتصال به من خلال C#؟أريد أن أكون قادرًا على تمرير تعليمات x86 كسلسلة واستعادة مصفوفة البايت.إذا لم يكن هناك واحد، فكيف يمكنني أن أصنعه بنفسي؟

لأكون واضحا - لا أريد ذلك يتصل رمز التجميع من C# - أريد فقط أن أكون قادرًا على تجميع التعليمات البرمجية من التعليمات والحصول على رمز الجهاز في مصفوفة بايت.سأقوم بإدخال هذا الرمز (الذي سيتم إنشاؤه بسرعة) لإدخاله في عملية أخرى تمامًا.

هل كانت مفيدة؟

المحلول

كجزء من بعض النماذج الأولية التي قمت بها في مشروع شخصي، كتبت قدرًا كبيرًا من التعليمات البرمجية للقيام بشيء مثل هذا.لا يتطلب الأمر سلاسل - أكواد التشغيل x86 هي طرق في فئة X86Writer.إنها غير موثقة على الإطلاق، وليس لديها تغطية كاملة تقريبًا، ولكن إذا كانت ذات أهمية، فسأكون على استعداد لفتحها بموجب ترخيص BSD الجديد.

تحديث:حسنًا، لقد قمت بإنشاء هذا المشروع -- مُدار.X86

نصائح أخرى

شاهد هذا المشروع:

https://github.com/ZenLulz/MemorySharp

يغلف هذا المشروع مجمع FASM، الذي تمت كتابته في التجميع وككائن مجمع ككائن Microsoft coff، ثم تم تغليفه بواسطة مشروع C++، ثم تم تغليفه مرة أخرى في C#.هذا يمكن أن يفعل بالضبط ما تريد:بالنظر إلى سلسلة من التجميع x86/x64، سيؤدي ذلك إلى إنتاج البايتات المطلوبة.

إذا كنت تريد العكس، يوجد منفذ لمفكك Udis86، منقول بالكامل إلى C#، هنا:

https://github.com/spazzarama/SharpDisasm

سيؤدي هذا إلى تحويل مجموعة من البايتات إلى سلاسل التعليمات لـ x86/x64

نلقي نظرة على فينيكس من أبحاث مايكروسوفت.

يتمتع Cosmos أيضًا ببعض الدعم المثير للاهتمام لإنشاء كود x86:

http://www.gocosmos.org/blog/20080428.en.aspx

ليس مباشرة من C# لا يمكنك ذلك.ومع ذلك، من المحتمل أن تكتب فئة مجمّعة خاصة بك تستخدم مجمّعًا خارجيًا لتجميع التعليمات البرمجية.لذلك، من المحتمل أن تقوم بكتابة التجميع في ملف، واستخدام .NET Framework لتشغيل عملية جديدة تنفذ برنامج المجمع، ثم استخدام System.IO لفتح الملف الذي تم إنشاؤه بواسطة المجمع لسحب البايت تدفق.

ومع ذلك، حتى لو فعلت كل ذلك، سأكون مندهشًا جدًا إذا لم تواجه مشكلات أمنية.أصبح إدخال تعليمات برمجية قابلة للتنفيذ في عملية مختلفة تمامًا أقل احتمالًا مع كل نظام تشغيل جديد.مع نظام التشغيل Vista، أعتقد أنه سيتم رفضك بالتأكيد.وحتى في نظام XP، أعتقد أنك ستحصل على استثناء رفض الوصول عند محاولة الكتابة في ذاكرة عملية أخرى.

بالطبع، هذا يثير التساؤل عن سبب حاجتك للقيام بذلك.بالتأكيد يجب أن تكون هناك طريقة أفضل :).

أعتقد أنه سيكون من الأفضل لك كتابة ملف Win32 dll أصلي.يمكنك بعد ذلك كتابة دالة في المجمع الذي يتم تصديره من ملف dll.يمكنك بعد ذلك استخدام C# للارتباط ديناميكيًا بملف dll.

هذا ليس تمامًا مثل تمرير سلسلة وإرجاع مصفوفة بايت.للقيام بذلك، ستحتاج إلى مكون مجمع x86، أو غلاف حول masm.exe.

لا أعرف ما إذا كانت هذه هي الطريقة التي تعمل بها ولكن يمكنك فقط تنفيذ مترجم خارجي ثم تحميل الكائن الذي تم إنشاؤه في صفيف البايت الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top