เป็นไปได้หรือไม่ที่จะคอมไพล์ไฟล์. pyc ที่คอมไพล์แล้วเป็นไฟล์. py?


คำตอบ:


169

Uncompyle6 ใช้งานได้กับ Python 3.x และ 2.7 - ตัวเลือกที่แนะนำเนื่องจากเป็นเครื่องมือล่าสุดโดยมีเป้าหมายที่จะรวมการส้อมก่อนหน้านี้และมุ่งเน้นไปที่การทดสอบหน่วยอัตโนมัติ หน้า GitHubมีรายละเอียดเพิ่มเติม

  • ถ้าคุณใช้ Python 3.7+ คุณสามารถลองdecompile3ซึ่งเป็น Uncompyle6 ที่แยกโฟกัสที่ 3.7 และสูงกว่า
  • ยกประเด็น GitHub ในโครงการเหล่านี้ถ้าจำเป็น - ทั้งชุดทดสอบหน่วยทดสอบในรุ่น Python

Uncompyle2รุ่นเก่ารองรับ Python 2.7 เท่านั้น วิธีนี้ใช้งานได้ดีสำหรับฉันในช่วงเวลาที่ผ่านมาในการถอดรหัส. pyc bytecode ให้เป็น. py ในขณะที่ unpyclib ล้มเหลวโดยมีข้อยกเว้น

ด้วยเครื่องมือเหล่านี้คุณจะได้รับรหัสกลับมาพร้อมชื่อตัวแปร แต่ไม่มีความคิดเห็น


7
ขอบคุณมาก. ฉันลบไฟล์. py ของฉันโดยไม่ตั้งใจแทน. pyc สิ่งนี้ช่วยให้ฉันไม่ต้องเขียนใหม่ตั้งแต่ต้น
avmohan

21
สำหรับพวกคุณที่นี่เพราะคุณเผลอลบไฟล์ผิดฉันขอแนะนำการควบคุมแหล่งที่มา!
Andrew Palmer

30

ใช่คุณจะได้รับมันกับunpyclibที่สามารถพบได้ในpypi

$ pip install unpyclib

คุณสามารถถอดรหัสไฟล์. pyc ของคุณได้

$ python -m unpyclib.application -Dq path/to/file.pyc

20
ฉันลองสิ่งนี้และมันล้มเหลวโดยมีข้อยกเว้นในไฟล์ขนาดเล็กที่ไม่มีรหัสที่ซับซ้อน (Django settings.py) - uncompyle2 ทำงานได้ดีแทน -1 ด้วยเหตุผลนั้น
RichVel

9
มันล้มเหลวใน Python 3.6 ใน lib \ site-packages \ unpyclib \ applcation.py ด้วยprint __copyright- ทำไมมันถึงใช้เวอร์ชั่น Python 2.7 ที่printไม่มีวงเล็บ
David Ching

1
@DavidChing unpyclibเปิดตัวครั้งแรกและครั้งสุดท้ายในปี 2009ปลอดภัยที่จะกล่าวว่าเป็นโปรแกรม Python 2 เท่านั้น
Boris

28

คุณอาจลองง่ายหลาม Decompiler มันขึ้นอยู่กับ Decompyle ++ และ Uncompyle2 มันรองรับ decompiling python เวอร์ชั่น 1.0-3.3

หมายเหตุ: ฉันเป็นผู้เขียนเครื่องมือด้านบน


5
มันทำหน้าที่ของมัน การทำงานที่ดี. BTW คุณเขียนเครื่องมือนี้ด้วยไพ ธ อนไหม?
shinzou

1
ทำงานได้ดีสำหรับฉัน (ลากและวางได้ง่าย) มันเป็นความจริงที่ลินุกซ์ดิสโตรจะดี แต่ไม่ใช่ทั้งหมดที่เปิดกล่อง windows อย่างหนัก
Brian Jackson

รุ่นล่าสุดในปี 2015 และดูเหมือนว่ามันเป็นแหล่งที่มาปิด?
Boris


4

ใช่แล้ว

ฉันใช้decompile uncompyle6 (แม้สนับสนุน Python 3.8.0 ล่าสุด):

uncompyle6 utils.cpython-38.pyc > utils.py

และไพ ธ อนต้นทางและไพ ธ อนที่คอมไพล์แล้วเปรียบเทียบเป็นแบบนี้:

pyc uncompile utils

เพื่อให้คุณสามารถดูเกือบเดียวกันแยกผลดีมาก


3

ใช่มันเป็นไปได้

มีตัวถอดรหัสคอมไพล์โอเพนซอร์ส (.PYC) ที่สมบูรณ์แบบที่เรียกว่า Decompyle ++ https://github.com/zrax/pycdc/

Decompyle ++ มีจุดมุ่งหมายเพื่อแปลไพ ธ อนท์ไพ ธ อนรหัสที่คอมไพล์กลับไปเป็นซอร์สโค้ดไพ ธ อนที่ถูกต้องและมนุษย์อ่านได้ ในขณะที่โครงการอื่น ๆ ประสบความสำเร็จในเรื่องนี้ด้วยความสำเร็จที่แตกต่างกัน Decompyle ++ นั้นมีความพิเศษที่จะสนับสนุนไบต์รหัสจาก Python ทุกรุ่น


2
ในขณะที่ pycdc นั้นดีมันไม่สมบูรณ์แบบ หากคุณดูที่github.com/zrax/pycdc/issuesมีปัญหามากกว่า 50 ประเภทที่แยกออกจากกัน อย่างไรก็ตามเรื่องนี้แพร่กระจายไปทั่วงูไพ ธ อนรุ่นที่ 16 หรือมากกว่านั้นและทั้งภาษาและรหัสก็เปลี่ยนไปอย่างมาก อาจเป็นได้ว่าสิ่งที่คุณลองมานั้นคุณไม่สามารถหาปัญหาได้ อย่างไรก็ตามในความคิดของฉันการจัดบางสิ่งบางอย่างเป็น "สมบูรณ์แบบ" เราจะต้องพูดว่าคลัง Python ทั้งหมดสำหรับแต่ละรุ่นถอดรหัสมันและให้มันผ่านการทดสอบของตัวเองอย่างถูกต้อง Decompiler นั้นยังไม่สามารถทำได้
rocky

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.