ฉันจะดีบัก Ghidra plugin Python scripts ใน IDE ได้อย่างไร
ฉันต้องการดีบักสคริปต์ปลั๊กอิน Ghidra ที่เขียนด้วย python โดยใช้ IDE เช่น Eclipse ฉันติดตั้ง Pydev และปลั๊กอิน GhidraDev แล้ว (จาก Ghidra เปิดสคริปต์ใน Eclipse เพื่อติดตั้งปลั๊กอินอัตโนมัติ)
เมื่อเปิดสคริปต์ปลั๊กอินใน Eclipse ฉันจะตั้งค่าเบรกพอยต์ (เช่นบน stmt พิมพ์ด้านล่าง) จากนั้นคลิก Debug> GhidraScripts เพื่อเปิด Ghidra และในที่สุดก็เริ่มสคริปต์ด้วยตนเอง (ดูสคริปต์ตัวอย่างด้านล่าง) ฉันเห็นเธรดและสามารถหยุดเธรดสคริปต์ชั่วคราวจาก Eclipse ได้ แต่เบรกพอยต์จะไม่ถูกตี
ฉันได้ลองทั้ง GhidraScripts (Headless) และ GUI ที่ใช้การเปิดตัว GhidraScript แล้ว แต่ก็ไม่มีการหยุดพักเลย
# 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)
ฉันจะรับฟังก์ชันการดีบักสำหรับสคริปต์ Ghidra Python ได้อย่างไร
หมายเหตุ: ปัญหาการดีบัก Eclipse / Ghidra / PyDev เกี่ยวข้องกับข้อบกพร่องที่เป็นไปได้: https://github.com/NationalSecurityAgency/ghidra/issues/1707
คำตอบ
ฉันไม่ได้ใช้ Eclipse สำหรับ Ghidra ด้วยตัวเอง แต่เท่าที่ฉันตรวจสอบแล้วก็ควรรองรับสิ่งนี้ด้วย ฉันสามารถยืนยันได้ว่าวิธีนี้ (การดีบักระยะไกลบวกกับต้นขั้ว Python) ทำงานได้ดีกับ PyCharm
การแก้จุดบกพร่องระยะไกลด้วย pydevd
แนวคิดพื้นฐานคือการใช้การดีบักระยะไกลที่มีpydevdหรือคล้ายกันhttps://stackoverflow.com/a/41492711/13220684 อธิบายการใช้งานพื้นฐาน
ปัญหานี้คือคุณจะต้องติดตั้งpydevdภายในสภาพแวดล้อม Ghidra Jython ต่อไปนี้ดัดแปลงมาจากhttps://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
ตอนนี้ควรเป็นไปได้ที่จะimport pydevdอยู่ภายในสคริปต์ Ghidra Python (หรือแม้แต่ REPL ในตัว)
ฉันจำไม่ได้ว่าปลั๊กอิน GhidraDev สำหรับ eclipse ให้การเติมแท็บสำหรับghidraโมดูลภายในสคริปต์ Python หรือไม่ แต่การตั้งค่านี้เป็นแบบทั่วไปพอที่คุณไม่จำเป็นต้องใช้ Eclipse อีกต่อไปหากคุณต้องการ IDE อื่นสำหรับ Python
IDE จำเป็นต้องรองรับการดีบักระยะไกลผ่านทางpydevd. ฉันขอแนะนำอย่างยิ่งให้ใช้https://github.com/VDOO-Connected-Trust/ghidra-pyi-generator หากคุณกำลังใช้ IDE อื่นเพื่อให้ข้อมูลประเภทลายเซ็นของเมธอดและ docstrings ของ Ghidra API ไปยัง IDE
วิธีแก้ปัญหาอื่น
โดยส่วนตัวฉันใช้ส่วนใหญ่ghidra_bridgeและต้นขั้วประเภทที่กล่าวถึงก่อนหน้านี้สำหรับ Python กับ Ghidra เนื่องจากghidra_bridgeเป็นอินเทอร์เฟซ RPC แบบเต็มคุณจึงสามารถเขียนสคริปต์ Python 3 พร้อมรองรับ IDE เต็มรูปแบบและเรียกใช้ผ่าน IDE ghidra_bridgeจากนั้นจัดการการเชื่อมต่อกับสภาพแวดล้อม Ghidra Python และพร็อกซีอ็อบเจ็กต์ที่เกี่ยวข้องทั้งหมด ด้วยชนิดของต้นขั้ว IDE จะถือว่าสคริปต์เป็นสคริปต์ Python ทั่วไปและghidraโมดูลเหมือนกับโมดูล Python 3