Hướng dẫn dịch ngược file python

Python là một ngôn ngữ mạnh, hỗ trợ nhiều, cực kì nhiều thư viện, thường dùng để deploy nhanh ứng dụng.
Sau khi viết xong 1 file python, ta có thể sử dụng lại các class, function của file đó tại nơi khác cực kì đơn giản bằng lệnh:
from current_file_in_dir import ClassName, FunctionName

*Lưu ý: để import thì các file phải nằm cùng thư mục, còn import khác thư mục sẽ hướng dẫn tại các bài sau

Ngay sau khi lệnh trên thực thi, 1 file binary .pyc sẽ được tạo ra. Đó chính là file đã complied.
Câu hỏi đặt ra, làm thế nào để dịch ngược lại file .pyc đó sang file code .py?

Công cụ

Rất may mắn, đối với python 2.7 trở xuống đã có công cụ hỗ trợ việc này, đó là uncompyled2. Sau khi clone hoặc down toàn bộ master code từ github về, chúng ta sẽ tiến hành cài đặt.

Cài đặt

Giải nén file uncompyled2-master.zip (đối với download toàn bộ master), hoặc vào trực tiếp thư mục gốc của uncompyled.

Dùng lệnh python setup.py install để cài đặt.

Đối với một số trường hợp sẽ yêu cầu quyền root/admin của máy thì ta chạy lệnh sudo python setup installvới Linux hoặc run command line quyền Administrator của Windows.

Một cách đơn giản hơn để cài đặt là sử dụng trình quản lý package pip với lệnh sau:

pip install uncompyle2

Sử dụng

Sau khi cài đặt, uncompyle2 sẽ tự động thêm vào biến môi trường nên ta có thể gọi từ bất kì đâu.
Sử dụng uncompyle2 bằng lệnh:

uncompyle2 -o file_output.py file_complied.pyc

File file_output.py đã được dịch ngược lại.
Để tham khảo một số lệnh khác của uncompyle2, có thể dùng trợ giúp

uncompyle2 -h hoặc uncompyle2 --help

Làm thế nào để dịch ngược một tệp exe được biên dịch bởi py2exe?

chỉ một tệp exe, không có bất kỳ tệp zip nào.

làm thế nào để dịch ngược sang tệp pyc hoặc pyo?

  • python
  • py2exe
  • decompiler

22 hữu ích 4 bình luận 80k xem chia sẻ

answer

22

Bạn có thể sử dụng unpy2exe để giải nén .pyc và sau đó sử dụng pyREtic để lấy mã nguồn. Tôi đoán bạn có thể đọc HOWTO và hiểu cách sử dụng các chương trình này, nhưng về cơ bản, bạn đi đến vị trí của unpy2exe.py và chạy:

unpy2exe.py [-h] [-o OUTPUT_DIR] [-p PYTHON_VERSION] tên tệp

bạn đi đến vị trí của REpdb.py và chạy:

REpdb.py

set_project [tên dự án mới]

Chọn phiên bản python

fs_um_decompile [vị trí của tệp pyc]

Nguồn phải ở ... \ Projects [tên dự án mới] \ sourcecode \ fs_um \

22 hữu ích 1 bình luận chia sẻ

answer

8

Một cách tiếp cận khác là lấy mã byte byte kết xuất trực tiếp từ bộ nhớ, Immunity Inc đã xuất bản một bài báo về chủ đề này với bộ công cụ lấy mã bytecode từ bộ nhớ và dịch ngược nó thành mã nguồn .py. pyREtic

8 hữu ích 0 bình luận chia sẻ

answer

7

Tôi đã viết một công cụ nhỏ bằng C ++ để lấy tệp thực thi được tạo py2exe và trích xuất dấu PYTHONSCRIPTLibrary.zip. Phần Library.ziplớn chứa các tệp pyc / pyo, bạn có thể dịch ngược chúng bằng bất kỳ trình dịch ngược nào.

Liên kết:

Py2ExeDumper : https://sourceforge.net/projects/py2exedumper/
Easy Python Decompiler : http://sourceforge.net/projects/easypythondecompiler/

7 hữu ích 0 bình luận chia sẻ

answer

1

Sử dụng tập lệnh được cung cấp tại đây . Nó yêu cầu cài đặt mô-đun Python py2exe gốc. Ngoài ra, bạn phải đảm bảo rằng bạn sử dụng cùng một phiên bản Python được sử dụng ban đầu để tạo tệp thực thi. Nếu không, tập lệnh sẽ tạo ra số ma thuật không hợp lệ cho .pyc. Sau đó, bạn có thể sử dụng uncompyle2 để khôi phục nguồn .py ban đầu.

1 hữu ích 0 bình luận chia sẻ

Đăng nhập để trả lời câu hỏi

Có thể bạn quan tâm

Mick

2013-03-22 19:01:31 UTC

Gần đây, tôi đã xem / đọc bản trình bày do Dave Kennedy đưa ra tại DEF CON 20 [PDF], tôi muốn biết cách dịch ngược một tập lệnh Python được biên dịch bằng PyInstaller.

Trong bài thuyết trình của mình, anh ấy đang tạo một tập lệnh shell ngược cơ bản bằng Python và chuyển đổi nó thành EXE bằng PyInstaller.

Câu hỏi của tôi là làm cách nào để tạo một PyInstaller EXE và hoàn toàn, hoặc nói chung, truy xuất mã nguồn / logic từ (các) tập lệnh Python gốc?

Mục đích của việc làm một tệp exe là gì khi bạn có thể hack chính tệp exe.

Mục đích của việc tạo EXE với PyInstaller là để các hệ thống bạn chạy nó không yêu cầu sự tồn tại của trình thông dịch Python hoặc bất kỳ mô-đun bên thứ 3 nào mà bạn có thể đang sử dụng. Nó làm cho tập lệnh Python của bạn dễ di chuyển hơn, nhưng không ẩn mã / logic khỏi một kỹ sư đảo ngược.

Remko

2013-03-22 20:05:34 UTC

PyInstaller xuất bản nguồn của nó để bạn thấy chính xác cách nó đóng gói mã python trong tệp thực thi ...

Một cách tiếp cận chung hơn là sử dụng một công cụ như binwalk trên exe như một bước đầu tiên.

Tôi không chắc chắn binwalk là công cụ phù hợp cho công việc này. Nó sẽ hiển thị cho bạn các phần được nén của tệp thực thi, nhưng đầu ra cũng có thể có rất nhiều kết quả dương tính giả khác trừ khi bạn chỉ cho nó để chỉ tìm kiếm các phần được nén ... điều này đánh bại mục đích sử dụng nó trên loại tệp, IMHO.

@mrduclaw: kinh nghiệm của tôi với binwalk là đây là một công cụ tốt để thực hiện quét cấp cao trên các tệp nhị phân, không xác định, để xem những gì có thể có trong đó. Đặc biệt nếu chúng ta biết những gì chúng ta đang tìm kiếm nhưng không biết nó nằm trong tệp nào. Tôi không có ý đề xuất đi bộ đường dài như một giải pháp hoàn chỉnh (đã sửa đổi câu trả lời của tôi để cho biết đó là bước đầu tiên)

FYI, liên kết đến binwalk dường như gắn cờ là trang web độc hại kể từ tháng 6 năm 2020.

@Karsun dương tính giả trên một tệp nhị phân trên trang web của tôi, tôi đã báo cáo điều này với google và nó có vẻ ổn trở lại bây giờ (cảm ơn đã cho tôi biết)