- รีเวิร์สเอนจิเนียริงด้วยโมเดลภาษาขนาดใหญ่
1. แนะนำ LLM4Decompile และ Decompile-Eval
- เป้าหมายคือการสร้างและเผยแพร่โอเพนซอร์ส LLM ตัวแรกที่ออกแบบมาเพื่อการถอดคอมไพล์โดยเฉพาะ และสร้างเบนช์มาร์กการถอดคอมไพล์ตัวแรกที่เน้นความสามารถในการคอมไพล์ใหม่และความสามารถในการรันใหม่เพื่อใช้ประเมินประสิทธิภาพของมัน
- รวบรวมตัวอย่างโค้ด C จำนวนหนึ่งล้านรายการจาก AnghaBench แล้วคอมไพล์เป็นแอสเซมบลีโค้ดด้วย GCC เพื่อนำมาสร้างชุดข้อมูลคู่แอสเซมบลี-ซอร์สขนาด 4 พันล้านโทเค็น
- ใช้ชุดข้อมูลนี้เพื่อทำ fine-tune โมเดลโค้ด LLM ชั้นนำอย่าง DeepSeek-Coder และสร้าง Decompile-Eval ซึ่งเป็นเบนช์มาร์กสำหรับการประเมินโดยอิงจากคำถาม HumanEval และตัวอย่างทดสอบ
- การประเมินทำจากสองมุมมอง คือโค้ดที่ถอดคอมไพล์แล้วสามารถคอมไพล์ใหม่ได้สำเร็จหรือไม่ และสามารถผ่าน assertion ทั้งหมดใน test case ได้หรือไม่
2. ผลการประเมิน
เมตริก
- ความสามารถในการคอมไพล์ใหม่ และ ความสามารถในการรันใหม่ เป็นตัวชี้วัดสำคัญในการตรวจสอบประสิทธิผลของกระบวนการถอดคอมไพล์
- หากโค้ดที่ถอดคอมไพล์แล้วสามารถคอมไพล์ใหม่ได้ ก็เป็นหลักฐานที่ชัดเจนของความถูกต้องสมบูรณ์ทางไวยากรณ์
- แต่ไวยากรณ์เพียงอย่างเดียวไม่สามารถรับประกันได้ว่าโค้ดจะมีความหมายเหมือนกับโปรแกรมต้นฉบับ ดังนั้นความสามารถในการรันใหม่จึงเป็นตัวชี้วัดสำคัญสำหรับประเมินความถูกต้องเชิงความหมาย
- ความสามารถในการคอมไพล์ใหม่และความสามารถในการรันใหม่สะท้อนถึงการกู้คืนไวยากรณ์และการคงไว้ซึ่งความหมาย ซึ่งเป็นสิ่งจำเป็นสำหรับการถอดคอมไพล์ที่ใช้งานได้จริงและมีความทนทาน
3. วิธีใช้งานโมเดล
- LLM4Decompile มีโมเดลตั้งแต่ 1.3 พันล้านถึง 33 พันล้านพารามิเตอร์ และสามารถใช้งานได้บน Hugging Face
- ตัวอย่างโมเดล: llm4decompile-1.3b, llm4decompile-6.7b, llm4decompile-33b, llm4decompile-6.7b-nsp, llm4decompile-6.7b-uo
- โมเดล NSP ถูกฝึกด้วยแอสเซมบลีโค้ด และมีค่าเฉลี่ยความสามารถในการรันใหม่ประมาณ 0.17
- โมเดล UO ถูกฝึกโดยไม่มีความรู้ล่วงหน้าเกี่ยวกับระดับการเพิ่มประสิทธิภาพ (O0~O3) และมีค่าเฉลี่ยความสามารถในการรันใหม่ประมาณ 0.21
- ตัวอย่างการใช้งานโมเดล: คอมไพล์โค้ด C เป็นไบนารี, ทำ disassemble ไบนารีเป็นคำสั่งแอสเซมบลี, แล้วใช้ LLM4Decompile แปลคำสั่งแอสเซมบลีกลับเป็น C
4. วิธีใช้ Decompile-Eval
- ข้อมูลถูกจัดเก็บเป็นรายการ JSON ใน
llm4decompile/decompile-eval/decompile-eval.json
- มีทั้งวิธีรันการประเมินบน GPU เดี่ยวและโปรเซสเดียว รวมถึงวิธีใช้งาน TGI (เร็วขึ้น 10 เท่า รองรับหลาย GPU และหลายโปรเซส)
5. สิ่งที่กำลังดำเนินการ
- LLM4Binary: มีแผนจะเพิ่มชุดข้อมูลขนาดใหญ่ขึ้นเพื่อ pre-train โมเดลด้วยแอสเซมบลีโค้ดและโค้ด C
- Decompiler-ALL: มีแผนรองรับภาษา/แพลตฟอร์มและการตั้งค่าเพิ่มเติมมากขึ้น (เช่น การถอดคอมไพล์หลายฟังก์ชัน)
6. ใบอนุญาต
ความเห็นของ GN⁺
- LLM4Decompile นำเสนอแนวทางที่พลิกโฉมเมื่อเทียบกับวิธีถอดคอมไพล์ไบนารีแบบเดิม โดยเฉพาะการใช้โมเดลภาษาขนาดใหญ่เพื่อให้การถอดคอมไพล์มีความแม่นยำและมีประสิทธิภาพมากขึ้น
- เทคโนโลยีนี้อาจมีประโยชน์มากในด้านความปลอดภัยซอฟต์แวร์ และช่วยในการวิเคราะห์มัลแวร์หรือการบำรุงรักษาระบบเลกาซีได้
- การที่ความสามารถในการรันใหม่ของโค้ดที่ถอดคอมไพล์แล้วยังไม่สมบูรณ์ บ่งชี้ว่าเทคโนโลยีนี้ยังมีพื้นที่ให้พัฒนา และยังต้องมีการวิจัยเพิ่มเติมเพื่อเพิ่มความแม่นยำและประสิทธิภาพในสภาพแวดล้อมจริง
- เครื่องมือเดิมที่มีความสามารถคล้ายกันมีทั้งดีคอมไพเลอร์เชิงพาณิชย์และโอเพนซอร์สอย่าง Ghidra และ IDA Pro แต่ LLM4Decompile นำเสนอแนวทางใหม่ที่อิงกับแมชชีนเลิร์นนิง
- เมื่อนำเทคโนโลยีนี้มาใช้ ควรพิจารณาคุณภาพและขอบเขตของข้อมูลฝึก ความแม่นยำของโมเดล ความเร็วในการทำงาน เป็นต้น โดยข้อดีคือความแม่นยำและความยืดหยุ่นที่สูง แต่ข้อเสียอาจเป็นความซับซ้อนของโมเดลขนาดใหญ่และความต้องการทรัพยากรคอมพิวต์ที่สูง
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ความเห็นเกี่ยวกับผลลัพธ์ด้าน "ความสามารถในการรันซ้ำ":
คำถามเกี่ยวกับความน่าเชื่อถือของผลลัพธ์ที่ดีคอมไพล์:
กรณีใช้งานที่ยอดเยี่ยมสำหรับการ fine-tune LLM:
ความสนใจเกี่ยวกับการฝึกโมดูลดีคอมไพล์ตามฐานนักพัฒนา:
ความสนใจเกี่ยวกับกรณีใช้งานในอุดมคติของดีคอมไพเลอร์และการสร้างชุดข้อมูล:
การแนะนำโปรเจกต์ดีคอมไพเลอร์แบบ LLM ที่กำลังพัฒนาโดยบุคคลหนึ่ง:
ความกังวลเกี่ยวกับ benchmark ที่ไม่มีการเปรียบเทียบกับแนวทางที่ใช้ AI:
ความสนใจต่อความต่างอย่างมากระหว่างคะแนนความสามารถในการคอมไพล์ใหม่และการรันซ้ำ:
ความสงสัยเกี่ยวกับการเปรียบเทียบกับดีคอมไพเลอร์ที่ไม่ใช่ LLM:
ความอยากรู้ว่าทำไมโมเดล 6b จึงทำได้ดีกว่าโมเดล 33b: