web-dev-qa-db-ja.com

.dll / .pydファイルを逆コンパイルしてPythonソースコードを抽出できますか?

Pythonで記述されたソースコードを抽出するために、dllや.pydファイルを逆コンパイルする方法はありますか?

前もって感謝します

11
Youssef Imam

.pyd/.dllファイルはPythonではなくCythonで作成されたと思いますか?

とにかく、ファイルが元々コンパイルされた言語用に特別に設計された逆コンパイラがない限り、一般的には不可能です。 C、C++、Delphi、.NET、およびその他の逆コンパイラについては知っていますが、Cython逆コンパイラについてはまだ聞いていません。

もちろん、Cythonが行うことは、最初にPython [esque]コードをCコードに変換することです。つまり、Cデコンパイラを見つけて、元のPythonコードをデコンパイルしたものに基づいてCコード:少なくとも、この方法では、1つの(比較的)高水準言語から別の言語への翻訳を処理します。

最悪のシナリオでは、逆アセンブラを使用する必要があります。ただし、逆アセンブラーの出力からPythonコードを再作成するのは簡単ではありません(細胞を構成するタンパク質の化学式から脳の生物学的機能を推測するのに非常に似ています)。

さまざまな逆コンパイラや逆アセンブラに関するアイデアや提案について この質問 を見て、そこから調査を進めることができます。

8
Lav

私は受け入れられた答えに同意しません、はい、ソースコードの内容は.pydでもアクセス可能であるようです。

たとえば、エラーが発生した場合にどうなるか見てみましょう。

1)このファイルを作成します:

whathappenswhenerror.pyx

A = 6 
print 'hello'
print A
print 1/0 # this will generate an error

2)python setup.py buildでコンパイルします:

setup.py

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize("whathappenswhenerror.pyx"), include_dirs=[])

3).pydファイルを標準のpythonファイルにインポートします:

testwhathappenswhenerror.py

import whathappenswhenerror

4)python testwhathappenswhenerror.pyで実行してみましょう。出力は次のとおりです。

hello 
6 
Traceback (most recent call last):
  File "D:\testwhathappenswhenerror.py", line 1, in <module>
    import whathappenswhenerror
  File "whathappenswhenerror.pyx", line 4, in init whathappenswhenerror (whathappenswhenerror.c:824)
    print 1/0 # this will generate an error 
ZeroDivisionError: integer division or modulo by zero

ご覧のとおり、print 1/0 # this will generate an errorソースコードに含まれていた.pyxコード行が表示されます!コメントも表示されます!

4 bis)ステップ3)の前に元の.pyxファイルを削除(または他の場所に移動)すると、元のコードprint 1/0 # this will generate an errorは表示されなくなります。

hello
6
Traceback (most recent call last):
  File "D:\testwhathappenswhenerror.py", line 1, in <module>
    import whathappenswhenerror
  File "whathappenswhenerror.pyx", line 4, in init whathappenswhenerror (whathappenswhenerror.c:824)
ZeroDivisionError: integer division or modulo by zero

しかし、これは.pydに含まれていないということですか?よく分かりません。

4
Basj