سؤال

أنا وردت لسؤال آخر حول تطوير iPhone في لغات غير موضوعية، وقدمت التأكيد الذي يستخدمه، قل، C # لكتابة iPhone سيقوم بضرب مراجع التفاح خطأ. كنت أتحدث إلى حد كبير عن عناصر واجهة المستخدم المختلفة بين المكتبات OBJC و C # المعنية، لكن المعلق جعل نقطة مثيرة للاهتمام، مما أدى إلى هذا السؤال:

هل من الممكن تحديد اللغة يتم كتابة البرنامج، فقط من ثنائي؟ إذا كان هناك مثل هذه الطرق، ما هي؟

دعنا نفترض لأغراض السؤال:

  • هذا من وجهة نظر التفاعل (سلوك وحدة التحكم، أي مظهر واجهة المستخدم الرسومية، إلخ) اثنين متطابقين.
  • هذا الأداء ليس مؤشرا موثوقا باللغة (لا مقارنة، قل، جافا إلى ج).
  • لا يوجد لديك مترجم أو شيء بينك وبين اللغة - مجرد ثنائي قابل للتنفيذ.

نقاط المكافأة إذا كنت غير ملائم للغة في اللغة.

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

المحلول

أنا لست قراصنة مترجم (يوما ما، آمل)، لكنني الرقم أنه قد تكون قادرا على العثور على علامات LETTALE في ملف ثنائي تشير إلى أن التحويل البرمجي الذي أنشأه وبعض خيارات الترجمة المستخدمة، مثل مستوى التحسين المحدد.

يتحدث بدقة، ومع ذلك، ما تسأل مستحيلا. قد يكون الأمر أن شخصا ما جلس مع القلم والورق وعملت الرموز الثنائية المقابلة للبرنامج الذي أرادوا الكتابة فيه، ثم كتبت تلك الأشياء في محرر عرافة. أساسا، سيكونون برمجة في التجميع دون أداة المجمع. وبالمثل، قد لا تتمكن أبدا من معرفة اليقين ما إذا كانت الثنائية الأصلية مكتوبة في المجمع المستقيم أو في C مع الجمعية المضمنة.

بالنسبة لبيئات الجهاز الافتراضي مثل JVM و .NET، يجب أن تكون قادرا على تحديد رموز VM بواسطة رموز البايت في الملف التنفيذ الثنائي، وأتوقع. ومع ذلك قد لا تكون قادرا على معرفة ما كانت لغة المصدر، مثل C # مقابل Visual Basic، إلا إذا كانت هناك Quirks مترجم معين تلميح لك.

نصائح أخرى

اجابة قصيرة: نعم

اجابة طويلة:

إذا نظرت إلى ثنائي، فيمكنك العثور على أسماء المكتبات المرتبطة بها. افتتاح CMD.EXE في TextPad يجد بسهولة ما يلي في Hex Offset 0x270: msvcrt.dll، kernel32.dll، ntdll.dll، user32. DLL، إلخ. MSVCRT هو وظائف دعم وقت تشغيل Microsoft 'C'. Kernel32، NTDLL، و User32.dll هي مكتبات نظام التشغيل الخاصة بنظام التشغيل تخبرك إما النظام الأساسي المستهدف، أو النظام الأساسي الذي تم بناؤه، اعتمادا على مدى جودة بيئة التنمية عبر المنصات التي تفصل بين الاثنين.

وضع جانبا هذه القرائن، سيتعين على أي مترجم C / C ++ إدراج أسماء الوظائف في الثنائي، وهناك قائمة بجميع الوظائف (أو نقاط الدخول) المخزنة في جدول. C ++ 'Mangsles' أسماء الوظائف لترميز الحجج وأنواعها لدعم الأساليب الزائدة. من الممكن توضيح أسماء الوظائف ولكنها ستظل موجودة. ستشمل تواقيع الوظائف عدد وأنواع الحجج التي يمكن استخدامها لتتبع النظام أو المكالمات الداخلية المستخدمة في البرنامج. عند Offset 0x4190 هو "SetTreaduilanguage" والتي يمكن البحث عنها لمعرفة الكثير عن البيئة التطويرية. وبعد لقد وجدت جدول الدخول عند الإزاحة 0x1ed8a. أنا يمكن أن نرى بسهولة أسماء مثل printf، والخروج، و SCANF؛ جنبا إلى جنب مع __p__fmode، __p__Commode، و __initenv

سيكون لأي قابل لتنفيذ معالج X86 شريحة بيانات سيتضمن أي نص ثابت تم تضمينه في البرنامج. العودة إلى cmd.exe (Offset 0x42c8) هو النص "software.policies.microsoft.windows.system". تأخذ السلسلة ضعف عدد الأحرف كما هو ضروري عادة لأنه تم تخزينه باستخدام أحرف مزدوجة على نطاق واسع، وربما للتدويل. رموز الأخطاء أو الرسائل هي مصدر رئيسي هنا.

في Offset B1B0 هو "دفع" تليها مكيير، RMDIR، ChDIR، MD، RD، و CD؛ تركت الشخصيات غير القابلة للطباعة للحصول على قابلية القراءة. تلك هي جميع حجج الأوامر إلى cmd.exe.

بالنسبة للبرامج الأخرى، تمكنت في بعض الأحيان من العثور على المسار الذي تم تجميعه فيه البرنامج.

لذا، نعم, ، من الممكن تحديد لغة المصدر من الثنائي.

أتوقع أنك يمكن، إذا قمت بتفكيك المصدر، أو على الأقل قد تعرف التحويل البرمجي، كما لا تستخدم جميع المحامصين نفس الرمز printf على سبيل المثال، يجب أن تختلف الهدف - C و GNU C هنا.

لقد استبعدت جميع لغات رمز البايت بحيث ستكون هذه المشكلة أقل شيوعا مما كان متوقعا.

الجولة الأولى what على بعض الثنائيات والنظر في الإخراج. يتم تنشأ معرفات CVS (و SVN) في جميع أنحاء الصورة الثنائية. ومعظم هؤلاء هم من المكتبات.

أيضا، في كثير من الأحيان "خريطة" لموظفي المكتبة المختلفة. هذا تلميح كبير، أيضا.

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

أخيرا، تكون الوحدة الناشئة ل C، C ++ (وأتخيل C #) فريدة من نوعها مجموعة من مكتبات التحويل البرمجي.

ماذا عن هذه الأدوات:

PE المباحث

بيد

كلاهما معرفات PE. حسنا، كلاهما لنظام Windows ولكن هذا ما كان عليه عندما هبطت هنا

حسنا، يتم تحويل C في البداية ASM، حتى تتمكن من كتابة جميع رمز C في ASM.

لا، bytecode هو اللغة الأذرع اللغة. يمكن للمجمعات التحويلية المختلفة أن تأخذ نفس مصدر التعليمات البرمجية وتوليد ثنائيات مختلفة. لهذا السبب أنت لا ترى أكتب المياه العامة التي ستعمل على الثنائيات.

يمكن استخدام الأمر "سلاسل" للحصول على بعض التلميحات فيما يتعلق باللغة التي تم استخدامها (على سبيل المثال، لقد ركضت فقط على الثنائي المحرز للحصول على تطبيق C كتبت والإدخالات الأولى التي يجدها المكتبات المرتبطة بالتنفيذ) وبعد

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