2008-09-05 72 views
10

Tôi đang làm việc trên một tiện ích cần giải quyết các địa chỉ hex thành tên hàm và số dòng mã nguồn trong một mã nhị phân. Tiện ích này sẽ chạy trên Linux trên x86, mặc dù các tệp nhị phân mà nó phân tích sẽ dành cho một hệ thống nhúng dựa trên MIPS. Các tệp nhị phân MIPS có định dạng ELF, sử dụng DWARF cho thông tin gỡ lỗi tượng trưng.Phân tích cú pháp các tệp nhị phân MIPS: có thư viện Python để phân tích cú pháp dữ liệu nhị phân không?

Tôi hiện đang lên kế hoạch để phân vùng, đi qua trong danh sách địa chỉ thập phân và phân tích cú pháp đầu ra để lấy tên hàm và số dòng nguồn. Tôi đã biên soạn một objdump với sự hỗ trợ cho MIPS nhị phân, và nó đang làm việc.

Tôi muốn có một gói cho phép tôi tự tìm kiếm mọi thứ từ mã Python mà không cần phải thực hiện một quy trình khác. Tôi có thể tìm thấy không có đề cập đến libdwarf, libelf, hoặc libbfd trên python.org, cũng không đề cập đến bất kỳ python trên dwarfstd.org.

Có mô-đun thích hợp nào ở đâu đó không?

Trả lời

4

Vui lòng kiểm tra pyelftools - một tinh khiết thư viện Python mới có nghĩa là để làm điều này.

3

Tôi không biết bất kỳ điều gì, nhưng nếu thất bại, bạn có thể sử dụng ctypes để trực tiếp sử dụng libdwarf, libelf hoặc libbfd.

4

Bạn nên dùng thử Construct. Nó rất hữu ích để phân tích dữ liệu nhị phân thành các đối tượng python.

Thậm chí còn có ví dụ về định dạng tệp ELF32.

+0

Tôi đang tìm một thứ tương tự và được kiểm tra Xây dựng. Có gì là khá tốt đẹp, nhưng dự án đã không được cập nhật trong một thời gian khá. – ctuffli

+0

Chỉ cần có một cái nhìn tại Xây dựng, và nó có vẻ thực sự tuyệt vời. Rất ấn tượng. –

3

Tôi đã phát triển một trình phân tích cú pháp DWARF bằng cách sử dụng Construct. Hiện tại khá thô và phân tích cú pháp chậm. Nhưng tôi nghĩ ít nhất tôi cũng nên cho bạn biết. Nó có thể phù hợp với nhu cầu của bạn, với một chút công việc.

Tôi đã có mã trong Mercurial, lưu trữ tại bitbucket:

Construct là một thư viện rất thú vị. DWARF là một định dạng phức tạp (như tôi đang khám phá) và đẩy Xây dựng đến giới hạn của nó mà tôi nghĩ.

+0

Xin chào Craig, bạn có bất kỳ ví dụ nào về cách sử dụng trình phân tích cú pháp DWARF của bạn không? Tôi đã nhìn vào repo của bạn nhưng không thể tìm thấy bất kỳ. Làm thế nào tôi có thể làm một cái gì đó giống như ví dụ dwarf.get_loc_by_addr() của emilmont? –

+0

@NickToumpelis, tôi đã không thực hiện thêm bất kỳ công việc nào trong thời gian này, nhưng bây giờ tôi chỉ trở lại với nó vì nó có thể hữu ích trong công việc của tôi. Tôi không hoàn toàn hài lòng với giải pháp dựa trên Construct, bởi vì nó làm chậm việc phân tích cú pháp. Vì vậy, hiện tại không có API cấp cao như bạn yêu cầu. Nó được phân tích thông tin DWARF vào một cây. Nhiệm vụ tiếp theo sẽ là tìm kiếm cây cho thông tin bạn đang tìm kiếm.Định dạng DWARF rất biểu cảm, tôi không chắc chắn sẽ là một API đơn giản để truy cập dữ liệu. –

+1

Craig: pyelftools (https://bitbucket.org/eliben/pyelftools) được xây dựng trên đầu trang 'construct', sử dụng nó cho API cấp thấp, nhưng thêm API cấp cao đầy đủ tính năng ở trên cùng –

2

hachior là một thư viện để phân tích dữ liệu nhị phân

8

Bạn có thể quan tâm đến các thư viện lùn từ pydevtools:

>>> from bintools.dwarf import DWARF 
>>> dwarf = DWARF('test/test') 
>>> dwarf.get_loc_by_addr(0x8048475) 
('/home/emilmont/Workspace/dbg/test/main.c', 36, 0) 
Các vấn đề liên quan