Hướng dẫn python setup_loop

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

Những thứ tôi biết về cách xử lý Python 3.5 [và các phiên bản Python khác] là:

  1. uncompyle6
  2. pycdc

[Disclamer: Tôi phát triển 1]

uncompyle6 [được viết bằng Python] xử lý các mã opcodes được giới thiệu trong Python 3.5, trong khi pycdc [được viết bằng C ++] vẫn còn thiếu một chút ở đây. Nhưng những mã opcodes này chỉ xuất hiện khi các tính năng ngôn ngữ Python 3.5 mới được sử dụng. Vì vậy, khả năng xảy ra sự cố này trong pycdc có thể nhỏ nếu chương trình cơ bản hoạt động trên các phiên bản Python trước đó.

Tuy nhiên, tình hình có một chút khác biệt đối với Python 3.6 trở lên. Python 3.6 thêm một số mã lệnh gọi hàm và thay đổi ngữ nghĩa của các mã lệnh khác . Vì vậy, trái ngược với 3.5, các mã opcodes mới xuất hiện ngay cả với mã không sử dụng bất kỳ tính năng mới nào được sử dụng trong Python 3.5 hoặc 3.6. Python 3.7, một lần nữa, thêm các mã opcodes của phương thức và thay đổi ngữ nghĩa của các phương thức khác; và hiện tại pycdc không hỗ trợ điều đó. 3.8 thay đổi việc tạo mã nhiều hơn một chút so với các mã khác với việc loại bỏ nó SETUP_LOOP.

uncompyle6 đang giải quyết một số vấn đề này, với việc đưa ra các báo cáo lỗi khác nhau. Và với sự ra đời của 3.6, nhiều opcode và tính năng 3.5 mới hơn xuất hiện thường xuyên hơn.

uncompyle6 yếu đối với 3,7 trong việc xử lý luồng điều khiển và thậm chí còn yếu hơn đối với 3,8, mặc dù nó có lẽ là người dẫn đầu hiện tại. Do đó, những gì tôi đã làm ở đây là tạo một dự án mới hoàn toàn chỉ để xử lý luồng điều khiển Python . Chỉ riêng điều này là khó vì cấu trúc điều khiển phong phú của Python. Ngoài xử lý ngoại lệ mà cần xử lý đặc biệt để cạnh và trong một đồ thị kiểm soát dòng chảy, có những elsekhối có thể xuất hiện như một phần của for, whiletrycấu trúc; ngoài ra, có finallycác khối.

Khi dự án đó có thể xử lý mọi thứ một cách hợp lý [và ngay bây giờ thì không thể], tôi sẽ đặt điều đó đầu tiên vào mã fork trong dự án //github.com/rocky/python-decompile3 . Đây là công cụ khó; tình nguyện viên được chào đón ở đây.

Mặc dù cả uncompyle6 và pycdc đều không theo kịp những thay đổi đối với Python, nhưng hiện tại, uncompyle6 thực hiện một công việc triệt để hơn. Bạn có thể xem các trình theo dõi vấn đề cho từng vấn đề để có được cảm giác cập nhật về vị trí của mọi thứ.

Lịch sử gần đây với uncompyle6 và declye3 là mọi thứ đã đến mức sửa chữa một số vấn đề có thể phá vỡ những vấn đề khác. Hãy để tôi giải thích. uncompyle6decompile3khớp mẫu trên hướng dẫn. Có thể có một mô hình cụ thể không thành công 50% thời gian. Theo thời gian, tôi sẽ tinh chỉnh mẫu thành một thứ gì đó phức tạp hơn và ít thất bại hơn, chẳng hạn như 25% thời gian, nhưng các trường hợp cụ thể đã hoạt động với mẫu 50% được sử dụng trước đó.

Vì vậy, đề xuất của tôi khi có vấn đề với uncompyle6 là hãy thử các phiên bản khác nhau, sử dụng pycdc hoặc khi thực tế, hãy so sánh kết quả của các trình dịch ngược khác nhau.

13 hữu ích 3 bình luận chia sẻ

Chủ Đề