Czy można zdekompilować skompilowany plik .pyc do pliku .py?

178

Czy można wyciągnąć pewne informacje z pliku .pyc, który jest generowany z pliku .py?

Howard
źródło

Odpowiedzi:

169

Uncompyle6 działa dla Pythona 3.x i 2.7 - zalecana opcja, ponieważ jest to najnowsze narzędzie, mające na celu ujednolicenie wcześniejszych forków i skupienie się na automatycznym testowaniu jednostkowym. Strona GitHub zawiera więcej szczegółów.

  • jeśli używasz Pythona 3.7+, możesz również spróbować decompile3 , rozwidlenia Uncompyle6 skupiającego się na 3.7 i nowszych.
  • w razie potrzeby zgłaszaj problemy z GitHub w tych projektach - oba uruchamiają zestawy testów jednostkowych w różnych wersjach języka Python

Starszy Uncompyle2 obsługuje tylko Python 2.7. Jakiś czas temu udało mi się to dobrze zdekompilować kod bajtowy .pyc do .py, podczas gdy unpyclib zawiesił się z wyjątkiem.

Dzięki tym wszystkim narzędziom odzyskasz kod, w tym nazwy zmiennych, ale bez komentarzy.

RichVel
źródło
7
Wielkie dzięki. Przypadkowo usunąłem plik .py zamiast .pyc. To uratowało mnie od przepisywania go od zera.
avmohan
21
Dla tych z Was, którzy są tutaj, ponieważ przypadkowo usunęliście niewłaściwy plik, bardzo polecam kontrolę źródła!
Andrew Palmer
30

Tak, możesz to zdobyć, unpyclibktóre można znaleźć na pypi .

$ pip install unpyclib

Następnie możesz zdekompilować swój plik .pyc

$ python -m unpyclib.application -Dq path/to/file.pyc
Pokutnik
źródło
20
Wypróbowałem to i zawiesiło się z wyjątkiem, na dość małym pliku bez złożonego kodu (Django settings.py) - zamiast tego uncompyle2 działał dobrze. -1 z tego powodu.
RichVel
9
Zawiesił się w Pythonie 3.6 w lib \ site-packages \ unpyclib \ applcation.py z print __copyright- dlaczego używa wersji Python 2.7 printbez nawiasów?
David Ching,
1
unpyclibPierwsze i ostatnie wydanie @DavidChing miało miejsce w 2009 roku , można śmiało powiedzieć, że jest to program wyłącznie w Pythonie 2.
Boris
28

Możesz wypróbować Easy Python Decompiler . Opiera się na Decompyle ++ i Uncompyle2. Obsługuje dekompilację wersji Pythona 1.0-3.3

Uwaga: jestem autorem powyższego narzędzia.

Extreme Coders
źródło
5
Wykonuje swoją pracę. Dobra robota. Swoją drogą, czy napisałeś to narzędzie w Pythonie?
shinzou
1
U mnie zadziałało (łatwe przeciąganie i upuszczanie). To prawda, że ​​dystrybucja Linuksa byłaby fajna, ale nie jest to wcale takie trudne, aby otworzyć okno Windows.
Brian Jackson
Ostatnia wersja w 2015 roku i wygląda na to, że jest to zamknięte źródło?
Boris
4

Tak .

Używam uncompyle6 dekompilować (nawet obsługiwać najnowszy Python 3.8.0):

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

a porównanie oryginalnego i zdekompilowanego pythona wygląda następująco:

pyc uncompile utils

więc widać, PRAWIE taki sam, efekt dekompilacji jest BARDZO DOBRY .

crifan
źródło
3

Tak to mozliwe.

Istnieje doskonały dekompilator Pythona (.PYC) typu open source, o nazwie Decompyle ++ https://github.com/zrax/pycdc/

Decompyle ++ ma na celu przetłumaczenie skompilowanego kodu bajtowego Pythona z powrotem na prawidłowy i czytelny dla człowieka kod źródłowy Pythona. Podczas gdy inne projekty osiągnęły to z różnym sukcesem, Decompyle ++ jest wyjątkowy, ponieważ stara się obsługiwać kod bajtowy z dowolnej wersji Pythona.

Andrew Rukin
źródło
2
Chociaż pycdc jest dobry, nie jest doskonały. Jeśli spojrzysz na github.com/zrax/pycdc/issues, zobaczysz ponad 50 różnych typów problemów związanych z dekompilacją. Jest to jednak rozłożone na około 16 wydań języka Python, a zarówno język, jak i kod uległy drastycznej zmianie. Może się zdarzyć, że w przypadku rzeczy, których próbowałeś, nie byłeś w stanie znaleźć problemu. Jednak moim zdaniem, aby zaklasyfikować coś jako „doskonałe”, należałoby wziąć na przykład całą bibliotekę Pythona dla każdej wersji, zdekompilować ją i sprawić, by poprawnie przeszła własne testy. Żaden dekompilator jeszcze tego nie potrafi.
kamienisty
1

Zainstaluj za pomocą pip install pycompyle6

pycompyle6 nazwa_pliku.pyc

Banik Kuntal
źródło