- Kỹ thuật reverse engineering sử dụng mô hình ngôn ngữ lớn
1. Giới thiệu về LLM4Decompile và Decompile-Eval
- Mục tiêu của nhóm là tạo ra và phát hành LLM mã nguồn mở chuyên dành cho dịch ngược đầu tiên, đồng thời xây dựng benchmark dịch ngược đầu tiên tập trung vào khả năng biên dịch lại và khả năng thực thi lại để đánh giá năng lực của nó.
- Nhóm đã biên dịch một triệu mẫu mã C thu thập từ AnghaBench thành mã assembly bằng GCC, từ đó xây dựng bộ dữ liệu 4 tỷ token gồm các cặp assembly-mã nguồn.
- Dựa trên bộ dữ liệu này, nhóm tinh chỉnh mô hình code LLM hàng đầu DeepSeek-Coder và xây dựng benchmark đánh giá Decompile-Eval dựa trên các câu hỏi HumanEval cùng các mẫu kiểm thử.
- Việc đánh giá được thực hiện từ hai góc độ: liệu mã đã dịch ngược có thể được biên dịch lại thành công hay không, và liệu nó có vượt qua tất cả assertion trong các test case hay không.
2. Kết quả đánh giá
Chỉ số
- Khả năng biên dịch lại và khả năng thực thi lại là các chỉ số quan trọng để kiểm chứng hiệu quả của quá trình dịch ngược.
- Nếu mã đã dịch ngược có thể được biên dịch lại, đó là bằng chứng mạnh mẽ cho tính toàn vẹn cú pháp.
- Tuy nhiên, chỉ cú pháp thôi không đảm bảo chương trình đó tương đương ngữ nghĩa với chương trình gốc, vì vậy khả năng thực thi lại là thước đo quan trọng để đánh giá độ chính xác ngữ nghĩa.
- Khả năng biên dịch lại và khả năng thực thi lại lần lượt thể hiện việc khôi phục cú pháp và bảo toàn ngữ nghĩa, vốn là các yếu tố thiết yếu để việc dịch ngược có thể sử dụng được và đủ độ vững chắc.
3. Cách sử dụng mô hình
- LLM4Decompile bao gồm các mô hình có từ 1,3 tỷ đến 33 tỷ tham số, và các mô hình này có thể dùng trên Hugging Face.
- Ví dụ các mô hình: llm4decompile-1.3b, llm4decompile-6.7b, llm4decompile-33b, llm4decompile-6.7b-nsp, llm4decompile-6.7b-uo
- Mô hình NSP được huấn luyện trên mã assembly, với khả năng thực thi lại trung bình khoảng 0,17.
- Mô hình UO được huấn luyện mà không có kiến thức trước về mức tối ưu hóa (O0~O3), với khả năng thực thi lại trung bình khoảng 0,21.
- Ví dụ sử dụng mô hình: biên dịch mã C thành nhị phân, disassemble tệp nhị phân thành các chỉ thị assembly, rồi dùng LLM4Decompile để chuyển các chỉ thị assembly sang C.
4. Cách dùng Decompile-Eval
- Dữ liệu được lưu dưới dạng danh sách JSON tại
llm4decompile/decompile-eval/decompile-eval.json.
- Có hướng dẫn chạy đánh giá trên một GPU với một tiến trình, cũng như cách dùng TGI (nhanh hơn 10 lần, hỗ trợ nhiều GPU và đa tiến trình).
5. Đang triển khai
- LLM4Binary: dự kiến bổ sung bộ dữ liệu lớn hơn để pretrain mô hình trên mã assembly và mã C.
- Decompiler-ALL: kế hoạch hỗ trợ thêm nhiều ngôn ngữ/nền tảng và cấu hình hơn (ví dụ: dịch ngược nhiều hàm).
6. Giấy phép
Ý kiến của GN⁺
- LLM4Decompile đưa ra một cách tiếp cận mang tính đổi mới so với các phương pháp dịch ngược nhị phân hiện có, đặc biệt là nhờ tận dụng mô hình ngôn ngữ lớn để giúp việc dịch ngược chính xác và hiệu quả hơn.
- Công nghệ này có thể rất hữu ích trong lĩnh vực bảo mật phần mềm, đồng thời hỗ trợ phân tích mã độc hoặc bảo trì các hệ thống legacy.
- Việc khả năng thực thi lại của mã đã dịch ngược chưa hoàn hảo cho thấy công nghệ này vẫn còn dư địa để cải thiện. Cần thêm nghiên cứu để nâng cao độ chính xác và hiệu quả trong môi trường thực tế.
- Các công cụ hiện có cung cấp chức năng tương tự gồm các decompiler thương mại và mã nguồn mở như Ghidra hay IDA Pro, nhưng LLM4Decompile mang đến một hướng tiếp cận mới dựa trên machine learning.
- Khi áp dụng công nghệ này, cần cân nhắc chất lượng và phạm vi dữ liệu huấn luyện, độ chính xác của mô hình, tốc độ thực thi, v.v.; lợi ích là độ chính xác và tính linh hoạt cao, nhưng nhược điểm có thể là độ phức tạp của mô hình lớn và nhu cầu tài nguyên tính toán cao.
1 bình luận
Ý kiến trên Hacker News
Ý kiến về kết quả "khả năng chạy lại":
Câu hỏi về độ tin cậy của kết quả decompile:
Một trường hợp sử dụng rất tốt cho fine-tuning LLM:
Sự quan tâm đến việc huấn luyện module decompile dựa trên nhà phát triển:
Sự quan tâm đến trường hợp sử dụng lý tưởng của decompiler và việc tạo bộ dữ liệu:
Giới thiệu về dự án decompiler dựa trên LLM mà cá nhân đang thực hiện:
Lo ngại về benchmark không có so sánh với cách tiếp cận dựa trên AI:
Sự chú ý đến khoảng cách lớn giữa điểm khả năng biên dịch lại và khả năng chạy lại:
Thắc mắc về so sánh với các decompiler không phải LLM:
Sự tò mò về việc mô hình 6b cho kết quả tốt hơn mô hình 33b: