Làm cách nào để gỡ lỗi Ghidra plugin Python script trong IDE?
Tôi muốn gỡ lỗi các tập lệnh plugin Ghidra được viết bằng python bằng IDE chẳng hạn như Eclipse. Tôi đã cài đặt Pydev và plugin GhidraDev (từ Ghidra mở một tập lệnh trong Eclipse để tự động cài đặt plugin).
Với tập lệnh plugin được mở trong Eclipse, tôi sẽ đặt một điểm ngắt (ví dụ: trên print stmt bên dưới), sau đó nhấp vào Gỡ lỗi> GhidraScripts để khởi chạy Ghidra và cuối cùng bắt đầu tập lệnh theo cách thủ công (xem tập lệnh mẫu bên dưới). Tôi thấy chuỗi và có thể tạm dừng chuỗi tập lệnh từ Eclipse, nhưng các điểm ngắt không bao giờ bị tấn công.
Tôi đã thử khởi chạy GhidraScripts (Headless) và GhidraScript dựa trên GUI, tuy nhiên tôi không có gì phải nghỉ cả.
# Hello Function Script
# @author mechgt
# @category _NEW_
# @keybinding
# @menupath
# @toolbar
import ghidra
import time
# Iterate through functions, parsing and printing each
function = getFirstFunction()
while function is not None:
print("Function: {} Address: {}".format(function.getName(), function.getEntryPoint()))
time.sleep(3)
function = getFunctionAfter(function)
Làm cách nào để có được chức năng gỡ lỗi cho các tập lệnh Ghidra Python?
LƯU Ý: Các vấn đề gỡ lỗi Eclipse / Ghidra / PyDev xuất hiện liên quan đến một lỗi có thể xảy ra: https://github.com/NationalSecurityAgency/ghidra/issues/1707
Trả lời
Bản thân tôi không sử dụng Eclipse cho Ghidra, nhưng theo như tôi vừa kiểm tra thì nó cũng hỗ trợ điều này. Tôi có thể xác nhận rằng cách tiếp cận này (gỡ lỗi từ xa cộng với các sơ khai Python) hoạt động tốt với PyCharm.
Gỡ lỗi từ xa với pydevd
Ý tưởng cơ bản là sử dụng gỡ lỗi từ xa bằng pydevdhoặc tương tự.https://stackoverflow.com/a/41492711/13220684 giải thích cách sử dụng cơ bản.
Vấn đề với điều này là bạn sẽ phải cài đặt pydevdbên trong môi trường Ghidra Jython. Sau đây là phỏng theohttps://github.com/VDOO-Connected-Trust/ghidra-pyi-generator#python-packages
# Create a virtualenv for Ghidra packages.
# It is important to use Python2.7 for this venv!
# If you want, you can skip this step and use your default Python installation.
mkvirtualenv ghidra
# Create Jython's site-pacakges directory.
jython_site_packages="~/.local/lib/jython2.7/site-packages"
mkdir -p $jython_site_packages # Create a PTH file to point Jython to Python's site-packages directories. # Again, this has to be Python2.7. # Outside a virtualenv, use python -c "import site; print(site.getusersitepackages()); print(site.getsitepackages()[-1])" > $jython_site_packages/python.pth
# If using virtualenv, use the following instead
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())" > $jython_site_packages/python.pth
# Use pip to install packages for Ghidra
pip install pydevd
Bây giờ có thể có import pydevdbên trong một tập lệnh Ghidra Python (hoặc thậm chí là REPL tích hợp).
Tôi không nhớ liệu plugin GhidraDev cho eclipse có cung cấp tính năng hoàn thành tab cho ghidramô-đun bên trong các tập lệnh Python hay không, nhưng thiết lập này đủ chung chung để bạn không bắt buộc phải sử dụng Eclipse nữa nếu bạn thích một IDE khác cho Python.
IDE chỉ cần hỗ trợ gỡ lỗi từ xa thông qua pydevd. Tôi cũng thực sự khuyên bạn nên sử dụnghttps://github.com/VDOO-Connected-Trust/ghidra-pyi-generator nếu bạn đang sử dụng IDE khác để cung cấp thông tin loại, chữ ký phương thức và chuỗi tài liệu của API Ghidra cho IDE.
Một cách giải quyết khác
Cá nhân tôi sử dụng hầu hết ghidra_bridgevà các loại đã đề cập trước đây sơ khai cho Python với Ghidra. Vì ghidra_bridgelà một giao diện RPC đầy đủ, bạn có thể viết một tập lệnh Python 3 với sự hỗ trợ đầy đủ của IDE và chạy nó qua IDE. ghidra_bridgesau đó xử lý kết nối đến môi trường Ghidra Python và proxy tất cả các đối tượng có liên quan. Với kiểu khai báo IDE chỉ coi tập lệnh là tập lệnh Python chung và ghidramô-đun giống như bất kỳ mô-đun Python 3 nào.