1. ホーム
  2. パイソン

Python2.6 Pyc デコンパイル

2022-02-25 17:59:46

クラスメイトからいくつかの pyc ファイルをデコンパイルするように頼まれました。

試したツールは以下の通りです。

[1] uncompyle2

github: https://github.com/wibiti/uncompyle2

以前使ったことがありますが、pycはpython2.7以上で生成しなければならないという制約があります

試してみるつもりで、説明書に従って、使用しました。

E:\kkxue documentation\python\decompile\uncompyle2-master\scripts>python uncompyle2 log_error
.pyc
Error: uncompyle2 requires Python 2.7.

じゃあ、次


[2] UnPyc

github: https://github.com/tswr/UnPyc

で実行後、直接。

C:\Users\Administrator\Desktop\zhou\UnPyc-disasm_0.18>python UnPyc -dv log_error
.pyc > result.txt

result.txtを開くと、アセンブリコードであることがわかります。

--== Disasm ==--
00000008 CODE:
             argcount:
00000009 LONG: 0L (00 00 00 00)
             nlocals:
0000000D LONG: 0L (00 00 00 00)
             stacksize:
00000011 LONG: 5L (05 00 00 00)
             flags:
00000015 LONG: 64L (40 00 00 00)
                 (NOFREE)
             code:
00000019 STR: 'd\x00\x00d\x01\x00k\x00\x00\x00Z\x00\x00e\x01\x00e\x00\x00\x00i\x02\x00\x83\x01\x00d\x02\x00j\x01\x00o\x16\x00\x01d...' (94 01 00 00 64 00 00 64 01 00 6B 00...)
                 00000000 64 - LOAD_CONST 0000 = 000001B7 INT: -1 (FF FF FF FF)
                 00000003 64 - LOAD_CONST 0001 = 000001BC None (4E)
                 00000006 6B - IMPORT_NAME 0000 = 000002E0 STR: 'sys' (03 00 00 00 73 79 73)
                 00000009 5A - STORE_NAME 0000 = 000002E0 STR: 'sys' (03 00 00 00 73 79 73)
                 0000000C 65 - LOAD_NAME 0001 = 000002E8 STR: 'len' (03 00 00 00 00 6C 65 6E)
                 0000000F 65 - LOAD_NAME 0000 = 000002E0 STR: 'sys' (03 00 00 00 73 79 73)
                 00000012 69 - LOAD_ATTR 0002 = 000002F0 STR: 'argv' (04 00 00 00 61 72 67 76)
                 00000015 83 - CALL_FUNCTION 0001
                 00000018 64 - LOAD_CONST 0002 = 000001BD INT: 3 (03 00 00 00)
                 0000001B 6A - COMPARE_OP 0001 = "<="
                 0000001E 6F - JUMP_IF_FALSE 0016 = -> 00000037
                 00000021 01 - POP_TOP             
                 00000022 64 - LOAD_CONST 0003 = 000001C2 STR: "Please enter the:\n\t For example:'we... " (29 00 00 00 50 6C 65 61 73 65 20 65...)
                 00000025 47 - PRINT_ITEM          
                 00000026 48 - PRINT_NEWLINE       
                 00000027 65 - LOAD_NAME 0000 = 000002E0 STR: 'sys' (03 00 00 00 73 79 73)
                 0000002A 69 - LOAD_ATTR 0003 = 000002F9 STR: 'exit' (04 00 00 00 65 78 69 74)
                 0000002D 64 - LOAD_CONST 0004 = 000001F0 INT: 2 (02 00 00 00)
                 00000030 83 - CALL_FUNCTION 0001
                 00000033 01 - POP_TOP             
                 00000034 6E - JUMP_FORWARD 0067 = -> 0000009E
                 00000037 01 - POP_TOP             
                 00000038 65 - LOAD_NAME 0000 = 000002E0 STR: 'sys' (03 00 00 00 00 73 79 73)
                 0000003B 69 - LOAD_ATTR 0002 = 000002F0 STR: 'argv' (04 00 00 00 61 72 67 76)
                 0000003E 64 - LOAD_CONST 0005 = 000001F5 INT: 1 (01 00 00 00)
                 00000041 19 - BINARY_SUBSCR       





しかし、直感的に読めないし、読めたとしても、この作者は「デコンパイル機能はまだ実装されていない」とはっきり言っているのです

		if 'D' in sys.argv[1]:
			print "# --== Decompile ==--"
			print ">>> not implemented yet"






まさかの次(でもUnPycは後でアセンブリを学ぶときに便利です)

[3] pyc2py

github:https://github.com/eduble/pyc2py

実行は、以下の場合にエラーを報告します。

[root@netbase3_7road pyc2py-master]# python main.py . /test/log_error.pyc . /test/log_error.py
Traceback (most recent call last):
  File "main.py", line 39, in ?
    mod = __import__(module_name)
ImportError: Bad magic number in . /test/log_error.pyc






この主な理由は、pythonのバージョンが一致しないためです。

つまり、pycの生成に使われたpythonのバージョンとpycのデコンパイルに使われたpythonのバージョンが一致しないのです。

例えば、私の現在のバージョンはpython 2.4です。

[root@netbase3_7road pyc2py-master]# python 
Python 2.4.3 (#1, Jan 9 2013, 06:47:03) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-54)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 







python2.6をインストール(追加インストール、つまりmake altinstall)すると、問題が解決します。

[root@netbase3_7road pyc2py-master]# python2.6 main.py . /test/log_error.pyc > . /test/log_error.py
[root@netbase3_7road pyc2py-master]# cat . /test/log_error.py



[root@netbase3_7road pyc2py-master]# 






しかし、デコンパイルがうまくいかないことがわかりました

この時点でイラッとしませんか?

もう一度探してみてはいかがでしょうか?

[4] 解答: http://depython.com

ここで

http://www.codeproject.com/Messages/3506499/how-to-convert-pyc-files-to-py-files-in-python.aspx

直接利用できる無料のデコンパイラーサイトがあります: http://depython.com/index.php

ただし、python2.0から2.6までしか対応していないことに注意してください。

テスト用のpycをアップロードしたら、OK、出てきた!!!!