Tìm tham số hàm cho các hàm trong thư viện đối tượng dùng chung


7

Tôi hiện đang loay hoay với một số thư viện c mà không có tài liệu. Tôi tự hỏi liệu có thể lấy thêm siêu dữ liệu hay không, chẳng hạn như các tham số và giá trị trả về, bên ngoài những gì được cung cấp bằng cách gọi nm -Dhoặc objdump -T filename | grep text. Tôi không chắc điều này có khả thi hay không, nhưng nếu có, nó sẽ cứu tôi khỏi việc săn lùng bất cứ ai phụ trách thư viện!

Chỉnh sửa: Tôi muốn có thể làm điều này mà không cần đọc mã máy nếu có thể. Dường như có một số giải pháp cho phép tôi thực hiện dễ dàng nếu tôi là một chuyên gia về mã máy, nhưng vì tôi không và không có mong muốn hiện tại để nhảy xuống hố thỏ đó, tôi thực sự hy vọng có một giải pháp khác đường.


Thư viện C / C ++, phải không?
slm

vâng, ý tôi là thư viện C. Xin lỗi điều đó không rõ ràng, tôi sẽ chỉnh sửa câu hỏi của mình
Edward Shen

1
Với C, bạn không thể. Thông tin đơn giản là không có ở đó. (Có một phần thông tin nếu các thư viện được biên dịch với các ký hiệu gỡ lỗi.) Đây là một công việc kỹ thuật đảo ngược. Nếu bạn quyết định thực hiện nó, bạn có thể nhận trợ giúp về Reverse Engineering .
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


8

Một câu hỏi tương tự đã được hỏi về Stack Overflow: Làm thế nào để trích xuất nguyên mẫu hàm từ tệp ELF?

Tóm lại: nói chung bạn không thể. Nếu thư viện thực thi (hoặc thư viện dùng chung) không có thông tin gỡ lỗi, thông tin về số lượng và loại đối số sẽ không được lưu trữ trong tệp thực thi.

Nếu tệp đối tượng được chia sẻ không có thông tin gỡ lỗi, thì bạn sẽ có thể trích xuất thông tin bằng readelf -wihoặc sử dụng trình gỡ lỗi.

Ví dụ: tôi đã có một tệp thực thi ELF có chứa một hàm int foo(char a, long b), được biên dịch với thông tin gỡ lỗi. GDB nói với tôi:

(gdb) p foo
$1 = {int (char, long int)} 0x40051c <foo>

readelf -wi(một chút khó hiểu, bạn sẽ phải tự khớp với các mục):

 <1><2d>: Abbrev Number: 2 (DW_TAG_subprogram)            <= function
    <2e>   DW_AT_external    : 1    
    <2f>   DW_AT_name        : foo                        <= func name
    <33>   DW_AT_decl_file   : 1    
    <34>   DW_AT_decl_line   : 1    
    <35>   DW_AT_prototyped  : 1    
    <36>   DW_AT_type        : <0x6c>                     <= return type
    <3a>   DW_AT_low_pc      : 0x40051c 
    <42>   DW_AT_high_pc     : 0x400532 
    <4a>   DW_AT_frame_base  : 0x0  (location list)
    <4e>   DW_AT_GNU_all_call_sites: 1  
    <4f>   DW_AT_sibling     : <0x6c>   
 <2><53>: Abbrev Number: 3 (DW_TAG_formal_parameter)      <= parameter
    <54>   DW_AT_name        : a    
    <56>   DW_AT_decl_file   : 1    
    <57>   DW_AT_decl_line   : 1    
    <58>   DW_AT_type        : <0x73>   
    <5c>   DW_AT_location    : 2 byte block: 91 6c  (DW_OP_fbreg: -20)
 <2><5f>: Abbrev Number: 3 (DW_TAG_formal_parameter)      <= other param
    <60>   DW_AT_name        : b    
    <62>   DW_AT_decl_file   : 1    
    <63>   DW_AT_decl_line   : 1    
    <64>   DW_AT_type        : <0x7a>   
    <68>   DW_AT_location    : 2 byte block: 91 60  (DW_OP_fbreg: -32)
 <1><6c>: Abbrev Number: 4 (DW_TAG_base_type)
    <6d>   DW_AT_byte_size   : 4    
    <6e>   DW_AT_encoding    : 5    (signed)
    <6f>   DW_AT_name        : int  
 <1><73>: Abbrev Number: 5 (DW_TAG_base_type)
    <74>   DW_AT_byte_size   : 1    
    <75>   DW_AT_encoding    : 6    (signed char)
    <76>   DW_AT_name        : (indirect string, offset: 0x2e): char    
 <1><7a>: Abbrev Number: 5 (DW_TAG_base_type)
    <7b>   DW_AT_byte_size   : 8    
    <7c>   DW_AT_encoding    : 5    (signed)
    <7d>   DW_AT_name        : (indirect string, offset: 0x0): long int 

Lưu ý rằng đối với C ++, các ký hiệu bạn thấy nmmang theo nhiều thông tin hơn (trừ khi chúng được khai báo extern "C"- số lượng và loại tham số phải có sẵn cho trình liên kết để xử lý quá tải. Nhưng thông tin loại trả về cũng không có. (Nhưng các biểu tượng được đọc sai - c++filtcó thể được sử dụng để tháo gỡ.)

Biên dịch cùng một tệp nguồn như C ++ cung cấp đầu ra sau cho nm a.out | c++filt:

...
0000000000400554 T foo(char, long)
...

1
Đâu là ánh xạ từ một cái gì đó giống như 0x6cmột loại thực tế?
mowwwalker

Nó được hiển thị trong đầu ra, các phần DWiah_base_type với id đó.
Mat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.