محتويات
أداة فك التحويل البرمجي الأصلية لإصدار Python وأداة فك التحويل البرمجي للأجزاء. خليفة decompyle وuncompyle وuncompyle2.
يقوم uncompyle6 بترجمة كود Python الثانوي مرة أخرى إلى كود مصدر Python المكافئ. وهو يقبل الرموز الثانوية من إصدار Python 1.0 إلى الإصدار 3.8، ويمتد على مدى 24 عامًا من إصدارات Python. نقوم بتضمين كود Python 2.5 الثانوي الخاص بـ Dropbox وبعض أكواد PyPy الثانوية.
حسنًا، سأقولها: هذا البرنامج رائع. إنه أكثر من برنامج فك التشفير العادي الخاص بك. باستخدام تقنية المترجم، يقوم البرنامج بإنشاء شجرة تحليل للبرنامج من التعليمات؛ العقد في المستويات العليا التي تبدو مشابهة قليلاً لما قد يأتي من Python AST. حتى نتمكن حقًا من تصنيف وفهم ما يحدث في أقسام كود بايثون الثانوي.
بناءً على ذلك، فإن الشيء الآخر الذي يجعل هذا مختلفًا عن برامج فك تشفير كود البايت CPython الأخرى هو القدرة على تقسيم أجزاء فقط من كود المصدر وإعطاء معلومات كود المصدر حول إزاحة كود بايت معين.
أستخدم أجزاء الشجرة لتقسيم أجزاء من التعليمات البرمجية في وقت التشغيل داخل مصححات أخطاء trepan الخاصة بي. ولهذا السبب، يتم تسجيل إزاحات الكود الثانوي وربطها بأجزاء من الكود المصدري. هذا الغرض، على الرغم من توافقه مع الهدف الأصلي، إلا أنه مختلف قليلاً. انظر هذا لمزيد من المعلومات.
يعد تحليل جزء بايثون مع إزاحة التعليمات مفيدًا في إظهار آثار المكدس ويمكن دمجه في أي برنامج يريد إظهار موقع بتفاصيل أكثر من مجرد رقم سطر في وقت التشغيل. يمكن استخدام هذا الرمز أيضًا في حالة عدم وجود معلومات التعليمات البرمجية المصدر ويوجد فقط كود ثانوي. مرة أخرى، يستفيد مصححو الأخطاء من هذا.
كان هناك (ولا يزال) عدد من شوكات decompyle وuncompyle وuncompyle2 وuncompyle3. يأتي الكثير منها بشكل أساسي من نفس قاعدة التعليمات البرمجية، ولم تعد تتم صيانتها جميعًا (تقريبًا؟) بشكل نشط. كان أحدهم جيدًا حقًا في تفكيك Python 1.5-2.3، والآخر كان جيدًا حقًا في Python 2.7، ولكن هذا فقط. آخر يتعامل مع بايثون 3.2 فقط؛ آخر مصحح ذلك والتعامل مع 3.3 فقط. لقد فهمت الفكرة. يجمع هذا الكود كل هذه الشوكات معًا ويتحرك للأمام . هناك بعض عمليات إعادة البناء والتنظيف الجادة في قاعدة التعليمات البرمجية هذه فوق تلك الشوكات القديمة. تجري المزيد من عمليات إعادة الهيكلة التجريبية في decompyle3.
من الواضح أن هذا هو الأفضل في فك ترجمة Python عبر جميع إصدارات Python. وحتى عندما يكون هناك مشروع آخر يوفر فقط تفكيكًا لمجموعة فرعية من إصدارات Python، فإننا بشكل عام نقوم بعمل أفضل بشكل واضح بالنسبة لهذه الإصدارات أيضًا.
كيف يمكننا أن نقول؟ من خلال أخذ رمز Python الثانوي الذي يتم توزيعه مع هذا الإصدار من Python وتفكيكه. ومن بين البرامج التي تم فك ترجمتها بنجاح، يمكننا بعد ذلك التأكد من أن البرامج الناتجة صحيحة من الناحية النحوية عن طريق تشغيل مترجم Python لإصدار الرمز الثانوي هذا. أخيرًا، في الحالات التي يكون فيها البرنامج لديه اختبار لنفسه، يمكننا إجراء فحص على الكود الذي تم فك ترجمته.
نحن نستخدم العمليات الآلية للعثور على الأخطاء. في أدوات تعقب المشكلات الخاصة ببرامج فك التشفير الأخرى، ستجد عددًا من الأخطاء التي وجدناها على طول الطريق. عدد قليل جدًا منهم أو لا يتم إصلاح أي منهم في برامج فك التشفير الأخرى.
يمكن تشغيل التعليمات البرمجية الموجودة في مستودع git من Python 2.4 إلى أحدث إصدار من Python، باستثناء Python 3.0 إلى 3.2. نرحب بالمتطوعين لمعالجة أوجه القصور هذه إذا كانت هناك رغبة في القيام بذلك.
الطريقة التي يتم بها ذلك هي عن طريق فصل إصدارات بايثون المتتالية إلى فروع git:
يعمل PyPy 3-2.4 والإصدارات الأحدث أيضًا.
تم اختبار ملفات البايت كود التي يمكن قراءتها على أكواد بايثون الثانوية من الإصدارات 1.4 و2.1-2.7 و3.0-3.8 والإصدارات الأحدث من PyPy.
يمكنك التثبيت من PyPI باستخدام الاسم uncompyle6
:
تثبيت النقطة غير المترجم6
للتثبيت من التعليمات البرمجية المصدر، يستخدم هذا المشروع setup.py، لذلك يتبع روتين بايثون القياسي:
تثبيت النقطة $ -e . # تم إعداده للتشغيل من شجرة المصدر
أو:
$ python setup.py install # قد يحتاج إلى sudo
يتم توفير ملف GNU Makefile أيضًا، لذا make install
(ربما كجذر أو Sudo) سيقوم بالخطوات المذكورة أعلاه.
جعل الاختيار
تمت إضافة ملف GNU makefile لتسهيل عملية ضبط تشغيل الأمر الصحيح، وإجراء الاختبارات من الأسرع إلى الأبطأ.
إذا قمت بتثبيت remake، يمكنك رؤية قائمة بجميع المهام بما في ذلك الاختبارات عبر remake --tasks
يجري
$ uncompyle6 * ملف python المترجم pyc أو pyo *
للمساعدة في الاستخدام:
$ uncompyle6 -h
في الإصدارات الأقدم من بايثون، كان من الممكن التحقق من الكود الثانوي عن طريق فك كود البايت كود، ومن ثم التجميع باستخدام مترجم بايثون لإصدار البايت كود هذا. بعد القيام بذلك، يمكن مقارنة الكود الثانوي الناتج مع الكود الثانوي الأصلي. ولكن مع تحسن عملية إنشاء الأكواد البرمجية في بايثون، لم يعد هذا ممكنًا.
إذا كنت تريد التحقق من بناء جملة Python من صحة عملية إلغاء الترجمة، أضف خيار --syntax-verify
. ومع ذلك، نظرًا لأن بناء جملة Python يتغير، فيجب عليك استخدام هذا الخيار إذا كان الرمز الثانوي هو الرمز الثانوي الصحيح لمترجم Python الذي سيتحقق من بناء الجملة.
يمكنك أيضًا مقارنة النتائج مع إصدار آخر من uncompyle6 نظرًا لوجود تراجعات في بعض الأحيان في فك رموز بايت محددة مع تحسن الجودة الإجمالية.
بالنسبة لـ Python 3.7 و3.8، فإن الكود الموجود في decompyle3 أفضل بشكل عام.
أو جرّب برنامج فك تشفير python آخر مثل uncompyle2 أو unpyc37 أو pycdc. نظرًا لأن الاثنين الأخيرين يعملان بشكل مختلف، فغالبًا ما لا توجد أخطاء هنا، والعكس صحيح.
هناك فئة مثيرة للاهتمام من هذه البرامج المتوفرة بسهولة والتي توفر تحققًا أقوى: تلك البرامج التي عند تشغيلها تختبر نفسها. تتضمن مجموعة الاختبار لدينا هذه.
وتأتي بايثون مع مجموعة أخرى من البرامج مثل هذه: مجموعة الاختبار الخاصة بالمكتبة القياسية. لدينا بعض التعليمات البرمجية في test/stdlib
لتسهيل هذا النوع من التحقق أيضًا.
أكبر مشكلة معروفة وربما قابلة للإصلاح (ولكنها صعبة) تتعلق بمعالجة تدفق التحكم. (من المحتمل أن تمتلك بايثون المجموعة الأكثر تنوعًا وإرباكًا من العبارات المركبة التي رأيتها على الإطلاق؛ هناك عبارات "آخر" في الحلقات وجرب الكتل التي أظن أن العديد من المبرمجين لا يعرفون عنها.)
تواجه جميع برامج فك ترجمات بايثون التي نظرت إليها مشاكل في فك تدفق التحكم في بايثون. في بعض الحالات يمكننا اكتشاف عملية تفكيك خاطئة والإبلاغ عنها.
يعد دعم Python جيدًا جدًا لـ Python 2
في الطرف الأدنى من إصدارات بايثون، يبدو فك الترجمة جيدًا جدًا على الرغم من عدم وجود أي اختبار آلي لاختبارات بايثون الموزعة. أيضًا، ليس لدينا مترجم Python للإصدارات 1.6 و2.0.
في سلسلة Python 3، يكون دعم Python أقوى عند الإصدار 3.4 أو 3.3 وينخفض كلما ابتعدت عن تلك الإصدارات. يعد Python 3.0 غريبًا لأنه يشبه في بعض النواحي 2.6 أكثر مما يشبه 3.1 أو 2.7. يقوم Python 3.6 بتغيير الأشياء بشكل جذري باستخدام رموز الكلمات بدلاً من رموز البايت. ونتيجة لذلك، تم تقليل حقل إزاحة الانتقال في وسيطة تعليمات الانتقال. وهذا يجعل تعليمات EXTENDED_ARG
أصبحت الآن أكثر انتشارًا في تعليمات القفز؛ في السابق كانت نادرة. ربما للتعويض عن تعليمات EXTENDED_ARG
الإضافية، تمت إضافة تحسين إضافي للقفز. لذا، فإن التعامل مع تدفق التحكم بوسائل مخصصة كما هو الحال حاليًا هو أمر أسوأ.
بين إصدارات Python 3.5 و3.6 و3.7، حدثت تغييرات كبيرة في تعليمات MAKE_FUNCTION
و CALL_FUNCTION
.
يقوم Python 3.8 بإزالة تعليمات SETUP_LOOP
و SETUP_EXCEPT
BREAK_LOOP
و CONTINUE_LOOP
، والتي قد تجعل اكتشاف تدفق التحكم أكثر صعوبة، حيث تفتقر إلى تحليل تدفق التحكم الأكثر تعقيدًا المخطط له. سنرى.
حاليًا، ليست كل أرقام Python السحرية مدعومة. على وجه التحديد في بعض إصدارات بايثون، ولا سيما بايثون 3.6، يتغير الرقم السحري عدة مرات داخل الإصدار.
نحن ندعم الإصدارات التي تم إصدارها فقط، وليس الإصدارات المرشحة. ومع ذلك، لاحظ أن سحر الإصدار الذي تم إصداره يكون عادةً نفس الإصدار المرشح الأخير قبل الإصدار.
هناك أيضًا مترجمون فوريون مخصصون لـ Python، ولا سيما Dropbox، الذين يستخدمون السحر الخاص بهم ويقومون بتشفير الرمز الثانوي. باستثناء مترجم Python 2.5 القديم الخاص بـ Dropbox، لم يتم التعامل مع هذا النوع من الأشياء.
نحن أيضًا لا نتعامل مع PJOrion أو التعليمات البرمجية المبهمة. بالنسبة إلى PJOrion، حاول: PJOrion Deobfuscator لتفكيك الرمز الثانوي للحصول على رمز ثانوي صالح قبل تجربة هذه الأداة؛ قد يساعد pydecipher في ذلك.
لا يمكن لهذا البرنامج فك ملفات Microsoft Windows EXE التي تم إنشاؤها بواسطة Py2EXE، على الرغم من أنه من المحتمل أن نتمكن من فك التعليمات البرمجية بعد استخراج الرمز الثانوي بشكل صحيح. قد يساعد Pydeinstaller في تفريغ حزم Pyinstaller.
التعامل مع قوائم طويلة من التعبيرات أو العبارات بشكل مرضي يكون بطيئًا. نحن لا نتعامل مع Cython أو MicroPython التي لا تستخدم الرمز الثانوي.
هناك العديد من الأخطاء في فك الترجمة. وهذا ينطبق على كل برامج فك ترجمات CPython الأخرى التي واجهتها، حتى تلك التي ادعت أنها "مثالية" في بعض الإصدارات المحددة مثل 2.4.
مع تقدم بايثون، يصبح فك التجميع أكثر صعوبة أيضًا لأن التجميع أكثر تعقيدًا واللغة نفسها أكثر تعقيدًا. أظن أنه سيكون هناك عدد أقل من المحاولات المخصصة مثل unpyc37 (الذي يعتمد على برنامج فك التحويل البرمجي 3.3) وذلك ببساطة لأنه من الصعب القيام بذلك. والخبر السار، على الأقل من وجهة نظري، هو أنني أعتقد أنني أفهم المطلوب لمعالجة المشاكل بطريقة أكثر قوة. لكن في الوقت الحالي، وحتى يتم تمويل المشروع بشكل أفضل، لا أنوي بذل أي جهد جاد لدعم إصدارات بايثون 3.8 أو 3.9، بما في ذلك الأخطاء التي قد تظهر. وأتصور أنني قد أكون مهتمًا بها في مرحلة ما.
يمكنك العثور على الأخطاء بسهولة عن طريق إجراء الاختبارات مقابل مجموعة الاختبار القياسية التي تستخدمها Python للتحقق من نفسها. في أي وقت من الأوقات، هناك العشرات من المشاكل المعروفة التي يتم عزلها جيدًا والتي يمكن حلها إذا خصصنا الوقت الكافي للقيام بذلك. المشكلة هي أنه لا يوجد الكثير من الأشخاص الذين يعملون على إصلاح الأخطاء.
بعض الأخطاء في الإصدارين 3.7 و3.8 هي ببساطة مسألة إعادة الإصلاحات في decompyle3 . هل من متطوعين؟
قد تواجه خطأً تريد الإبلاغ عنه. الرجاء القيام بذلك بعد قراءة كيفية الإبلاغ عن خطأ واتباع التعليمات عند فتح أي مشكلة.
كن على علم أنه قد لا يلفت انتباهي لفترة من الوقت. إذا قمت برعاية المشروع أو دعمه بطريقة ما، فسوف أعطي الأولوية لمشاكلك فوق قائمة الانتظار للأشياء الأخرى التي قد أقوم بها بدلاً من ذلك. في حالات نادرة، يمكنني القيام بتفكيك الكود الثانوي يدويًا مقابل رسوم. ومع ذلك، فإن هذا المبلغ موسع، وعادةً ما يتجاوز ما يرغب معظم الناس في إنفاقه.
uncompyle6
decompyle3
- BlackHat 2024 Asia (فيديو). شكرًا جزيلاً للمنظمين والمراجعين على السماح لي بالتحدث. هذا النوع من الأشياء يشجعني على العمل في مثل هذه المشاريع.uncompyle6
غير صحيحة في حين أن نتائج uncompyle2
ليست كذلك، ولكن في أغلب الأحيان تكون نتائج uncompyle6 صحيحة عندما لا تكون uncompyle2 كذلك. نظرًا لأن uncompyle6
يلتزم بالدقة مقارنة بـ Python الاصطلاحية، يمكن أن ينتج uncompyle2
تعليمات برمجية ذات مظهر طبيعي أكثر عندما تكون صحيحة. تتم حاليًا صيانة uncompyle2
بشكل طفيف. راجع أداة تعقب المشكلات للحصول على مزيد من التفاصيل.