فك التجميع

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

مقدمة

يُستخدم مصطلح مفكك التجميع عادةً للإشارة إلى برنامج يترجم البرامج القابلة للتنفيذ (الناتج من المجمِّع ) إلى كود مصدر بلغة عالية المستوى (نسبيًا) ، والتي عند تجميعها ستنتج ملفًا قابلًا للتنفيذ يكون سلوكه مماثلًا للبرنامج القابل للتنفيذ الأصلي. وبالمقارنة، يترجم مفكك التجميع برنامجًا قابلًا للتنفيذ إلى لغة التجميع (ويمكن استخدام المجمِّع لتجميعه مرة أخرى إلى برنامج قابل للتنفيذ).

فك التجميع هو فعل استخدام مفكك، على الرغم من أن المصطلح يمكن أن يشير أيضًا إلى مخرجات مفكك التجميع. يمكن استخدامه لاستعادة كود المصدر المفقود، كما أنه مفيد في بعض الحالات لأمان الكمبيوتر والتوافق وتصحيح الأخطاء . [ 1 ] يعتمد نجاح فك التجميع على كمية المعلومات الموجودة في الكود الذي يتم فك تجميعه وتعقيد التحليل الذي يتم إجراؤه عليه. غالبًا ما تتضمن تنسيقات البايت كود المستخدمة بواسطة العديد من الآلات الافتراضية (مثل Java Virtual Machine أو .NET Framework Common Language Runtime ) بيانات وصفية مكثفة وميزات عالية المستوى تجعل فك التجميع ممكنًا تمامًا. قد يتيح تطبيق بيانات التصحيح ، أي رموز التصحيح، إعادة إنتاج الأسماء الأصلية للمتغيرات والهياكل وحتى أرقام الأسطر. يصعب فك تجميع لغة الآلة بدون مثل هذه البيانات الوصفية أو بيانات التصحيح. [2]

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

في حين تُستخدم برامج فك التجميع عادةً لإعادة إنشاء كود المصدر من الملفات القابلة للتنفيذ الثنائية، فهناك أيضًا برامج فك التجميع لتحويل ملفات البيانات الثنائية المحددة إلى مصادر يمكن قراءتها وتحريرها بواسطة الإنسان. [3] [4]

يمكن أن يتأثر مستوى النجاح الذي تحققه برامج فك التجميع بعوامل مختلفة. وتشمل هذه العوامل مستوى التجريد للغة المصدر، فإذا كان كود الكائن يحتوي على معلومات صريحة عن بنية الفئة، فإن ذلك يساعد في عملية فك التجميع. كما تعمل المعلومات الوصفية، وخاصة تلك المتعلقة بتفاصيل التسمية، على تسريع عمل المترجم. وعلاوة على ذلك، فإن الكود الأقل تحسينًا يكون أسرع في فك التجميع لأن التحسين يمكن أن يتسبب في انحراف أكبر عن الكود الأصلي. [5]

تصميم

يمكن اعتبار برامج فك التجميع مكونة من سلسلة من المراحل، حيث تساهم كل منها في جوانب محددة من عملية فك التجميع الشاملة.

محمل

المرحلة الأولى من فك التجميع تقوم بتحميل وتحليل كود الآلة المدخلة أو تنسيق الملف الثنائي لبرنامج اللغة الوسيطة . يجب أن تكون قادرة على اكتشاف الحقائق الأساسية حول برنامج الإدخال، مثل البنية (Pentium، PowerPC، إلخ) ونقطة الدخول. في كثير من الحالات، يجب أن تكون قادرة على العثور على ما يعادل وظيفة برنامج C ، والتي هي بداية الكود المكتوب من قبل المستخدم . هذا يستبعد كود تهيئة وقت التشغيل، والذي لا ينبغي فك تجميعه إذا كان ذلك ممكنًا. إذا كانت متاحة، يتم أيضًا تحميل جداول الرموز وبيانات التصحيح. قد تكون الواجهة الأمامية قادرة على تحديد المكتبات المستخدمة حتى إذا كانت مرتبطة بالكود، وهذا سيوفر واجهات المكتبة. إذا كان بإمكانها تحديد المترجم أو المترجمين المستخدمين، فقد توفر معلومات مفيدة في تحديد تعبيرات الكود. [6]main

التفكيك

المرحلة المنطقية التالية هي تفكيك تعليمات الكود الآلي إلى تمثيل وسيط مستقل عن الآلة (IR). على سبيل المثال، تعليمات الآلة Pentium

نقل eax ، [ ebx + 0x04 ]     

قد يتم ترجمتها إلى IR

eax : = m [ ebx + 4 ] ؛   

العبارات الاصطلاحية

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

    cdq eax ؛ يتم تعيين edx على امتداد الإشارة ≠edi، edi +(tex)push xor eax ، edx sub eax ، edx                 
         
         

يمكن ترجمتها إلى

eax := abs(eax);

بعض التسلسلات الاصطلاحية مستقلة عن الآلة؛ وبعضها يتضمن تعليمة واحدة فقط. على سبيل المثال، مسح السجل (تعيينه إلى الصفر). يمكن تنفيذ ذلك باستخدام قاعدة تبسيط مستقلة عن الآلة، مثل . xor eax, eaxeaxa = 0

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

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

تحليل البرنامج

يمكن تطبيق تحليلات البرامج المختلفة على IR. على وجه الخصوص، يجمع انتشار التعبير بين دلالات العديد من التعليمات في تعبيرات أكثر تعقيدًا. على سبيل المثال،

    نقل eax ،[ ebx + 0x04 ] إضافة eax ،[ ebx + 0x08 ] فرعي [ ebx + 0x0C eax   
       
       

يمكن أن يؤدي ذلك إلى انتشار التعبير التالي بعد الأشعة تحت الحمراء:

م[ebx+12] := م[ebx+12] - (م[ebx+4] + م[ebx+8]);

إن التعبير الناتج يشبه إلى حد كبير لغة المستوى العالي، كما أنه يلغي استخدام سجل الآلة eax. وقد تؤدي التحليلات اللاحقة إلى إلغاء ebxالسجل.

تحليل تدفق البيانات

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

تحليل النوع

سيقوم برنامج فك تجميع الكود الآلي الجيد بإجراء تحليل النوع. هنا، تؤدي الطريقة التي يتم بها استخدام السجلات أو مواقع الذاكرة إلى فرض قيود على النوع المحتمل للموقع. على سبيل المثال، andتشير التعليمات إلى أن المتعامل هو عدد صحيح؛ لا تستخدم البرامج مثل هذه العملية على قيم الفاصلة العائمة (باستثناء التعليمات البرمجية الخاصة بالمكتبات) أو على المؤشرات . addتؤدي التعليمات إلى ثلاثة قيود، حيث قد تكون المتعاملات عددًا صحيحًا، أو عددًا صحيحًا واحدًا ومؤشرًا واحدًا (مع نتائج عدد صحيح ومؤشر على التوالي؛ يأتي القيد الثالث من ترتيب المتعاملين عندما يكون النوعان مختلفين). [7]

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

قد يؤدي المثال من القسم السابق إلى إنشاء الكود عالي المستوى التالي:

هيكل T1 * ebx ؛ هيكل T1 { int v0004 ؛ int v0008 ؛ int v000C ؛ ebx -> v000C -= ebx -> v0004 + ebx -> v0008 ؛  
      
         
         
         
    
    

الهيكلة

تتضمن مرحلة فك التجميع قبل الأخيرة هيكلة IR إلى هياكل ذات مستوى أعلى مثل whileالحلقات if/then/elseوالعبارات الشرطية. على سبيل المثال، الكود الآلي

    xor eax ، eax l0002: أو ebx ، ebx jge l0003 إضافة eax ،[ ebx ] mov ebx ،[ ebx + 0x4 ] jmp l0002 l0003: mov [ 0x10040000 eax  

       
     
     
     
     

     

يمكن ترجمتها إلى:

eax = 0 ؛ بينما ( ebx < 0 ) { eax += ebx -> v0000 ؛ ebx = ebx -> v0004 ؛ } v10040000 = eax ؛  
    
      
      

  

من الصعب ترجمة الكود غير المنظم إلى كود منظم مقارنة بالكود المنظم بالفعل. تتضمن الحلول تكرار بعض الكود أو إضافة متغيرات منطقية. [8]

توليد الكود

المرحلة النهائية هي توليد الكود عالي المستوى في الجزء الخلفي من برنامج فك التجميع. وكما قد يحتوي المترجم على عدة أجزاء خلفية لتوليد الكود الآلي لمختلف البنيات المعمارية، فقد يحتوي برنامج فك التجميع على عدة أجزاء خلفية لتوليد الكود عالي المستوى بلغات مختلفة عالية المستوى.

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

تقنيات أخرى

تم تطوير برامج فك التجميع باستخدام الشبكات العصبية . يمكن تدريب مثل هذه البرامج من خلال التعلم الآلي لتحسين دقتها بمرور الوقت. [9]

الشرعية

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

في الولايات المتحدة، تم الاستعانة بنجاح بدفاع الاستخدام العادل لحقوق الطبع والنشر في قضايا فك التجميع. على سبيل المثال، في قضية Sega v. Accolade ، قضت المحكمة بأن Accolade يمكنها قانونيًا المشاركة في فك التجميع من أجل التحايل على آلية قفل البرنامج المستخدمة بواسطة وحدات تحكم ألعاب Sega. [12] بالإضافة إلى ذلك، فإن قانون الألفية الرقمية لحقوق الطبع والنشر (القانون العام 105-304 [13] ) يحتوي على إعفاءات مناسبة لكل من اختبار الأمان والتقييم في §1201(i)، والهندسة العكسية في §1201(f). [14]

في أوروبا، ينص توجيه البرمجيات لعام 1991 صراحة على الحق في فك التجميع من أجل تحقيق التوافق بين البرامج. ونتيجة لمناقشة محتدمة بين حماة البرمجيات من جهة، والأكاديميين وكذلك مطوري البرمجيات المستقلين من جهة أخرى، فإن المادة 6 تسمح بفك التجميع فقط إذا تم استيفاء عدد من الشروط:

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

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

بشكل عام، يقنن حق فك التجميع المنصوص عليه في المادة 6 ما يُزعم أنه ممارسة شائعة في صناعة البرمجيات. ومن المعروف أن عدداً قليلاً من الدعاوى القضائية الأوروبية نشأت عن حق فك التجميع. ويمكن تفسير هذا على أنه يعني أحد ثلاثة أشياء:

  1. ) لا يتم استخدام حق فك التجميع بشكل متكرر، وبالتالي قد يكون حق فك التجميع غير ضروري،
  2. ) يعمل حق فك التجميع بشكل جيد ويوفر اليقين القانوني الكافي لعدم إثارة النزاعات القانونية أو
  3. ) لا يتم اكتشاف عمليات فك التجميع غير القانونية إلى حد كبير.

وفي تقرير صدر عام 2000 بشأن تنفيذ توجيه البرمجيات من قبل الدول الأعضاء في الاتحاد الأوروبي، بدا أن المفوضية الأوروبية تدعم التفسير الثاني. [16]

انظر أيضا

برامج فك التجميع في جافا

برامج فك التجميع الأخرى


مراجع

  1. ^ فان إيمريك، مايك (2005-04-29). "لماذا التفكيك". Program-transformation.org. مؤرشف من الأصل في 2010-09-22 . تم الاسترجاع في 2010-09-15 .
  2. ^ Miecznikowski, Jerome; Hendren, Laurie (2002). "Decompiling Java Bytecode: Problems, Traps and Pitfalls". في Horspool, R. Nigel (محرر). Compiler Construction: 11th International Conference, actions / CC 2002 . Springer-Verlag . ص 111-127. ISBN 3-540-43369-4.
  3. ^ بول، ماثياس ر. (2001-06-10) [1995]. "وصف تنسيق ملفات DOS وOS/2 وWindows NT .CPI وLinux .CP" (ملف CPI.LST) (الطبعة 1.30). مؤرشف من الأصل في 2016-04-20 . تم الاسترجاع في 2016-08-20 .
  4. ^ بول، ماثياس ر. (2002-05-13). "[fd-dev] mkeyb". freedos-dev . مؤرشف من الأصل في 2018-09-10 . تم الاسترجاع في 2018-09-10 . […] محلل ملفات صفحات أكواد .CPI و.CP، ومحقق ومفكك […] نظرة عامة على معلمات /Style: […] ملفات تضمين مصدر ASM […] ملفات مصدر ASM مستقلة […] ملفات مصدر ASM معيارية […]
  5. ^ إيلو تومي. هاسو، تيرو (2003). “الكشف عن كود مصدر المشتق المشترك – نظرة عامة” (PDF) . يتم ربط التقنيات التقنية ذات الصلة بأنظمة حماية Suomessa و Euroopassa .
  6. ^ Cifuentes, Cristina; Gough, K. John (يوليو 1995). "Decompilation of Binary Programs". Software: Practice and Experience . 25 (7): 811–829. CiteSeerX 10.1.1.14.8073 . doi :10.1002/spe.4380250706. S2CID  8229401. 
  7. ^ مايكروفت، آلان (1999). "التفكيك المستند إلى النوع". في سويرسترا، س. دويتسي (المحرر). لغات البرمجة والأنظمة: الندوة الأوروبية الثامنة حول لغات البرمجة والأنظمة . سبرينغر فيرلاغ . ص 208-223. رقم ISBN 3-540-65699-5.
  8. ^ سيفوينتس، كريستينا (1994). "الفصل 6". تقنيات التجميع العكسي (PDF) (أطروحة دكتوراه). جامعة كوينزلاند للتكنولوجيا . مؤرشف من الأصل (PDF) في 2016-11-22 . تم الاسترجاع في 2019-12-21 .)
  9. ^ تيان، يوان دونج؛ فو، تشنغ (2021-01-27). "مقدمة عن N-Bref: إطار عمل فك التجميع القائم على الأعصاب" . تم الاسترجاع في 2022-12-30 .
  10. ^ رولاند، ديان (2005). قانون تكنولوجيا المعلومات (الطبعة الثالثة). كافنديش. رقم ISBN 1-85941-756-6.
  11. ^ "مكتب حقوق الطبع والنشر الأمريكي - قانون حقوق الطبع والنشر: الفصل الأول". مؤرشف من الأصل في 2017-12-25 . تم استرجاعه في 2014-04-10 .
  12. ^ "شرعية فك التجميع". Program-transformation.org. 2004-12-03. مؤرشف من الأصل في 2010-09-22 . تم استرجاعه في 2010-09-15 .
  13. ^ "قانون الألفية الرقمية لحقوق الطبع والنشر" (PDF) . الكونجرس الأمريكي . 1998-10-28. مؤرشف من الأصل (PDF) في 2013-12-10 . تم استرجاعه في 2013-11-15 .
  14. ^ "السجل الفيدرالي :: طلب الوصول". 2018-10-26. مؤرشف من الأصل في 2022-01-25 . تم الاسترجاع 2021-01-31 .
  15. ^ Czarnota, Bridget; Hart, Robert J. (1991). الحماية القانونية لبرامج الكمبيوتر في أوروبا: دليل لتوجيهات المفوضية الأوروبية . لندن: Butterworths Tolley . ISBN 0-40600542-7.
  16. ^ "تقرير من المفوضية إلى المجلس والبرلمان الأوروبي واللجنة الاقتصادية والاجتماعية بشأن تنفيذ وتأثيرات التوجيه 91/250/EEC بشأن الحماية القانونية لبرامج الكمبيوتر". مؤرشف من الأصل في 2020-12-04 . تم الاسترجاع 2020-12-26 .
  • أجهزة فك التجميع والتفكيك في Curlie
Retrieved from "https://en.wikipedia.org/w/index.php?title=Decompiler&oldid=1246589726"
Original text
Rate this translation
Your feedback will be used to help improve Google Translate