2012-04-27 29 views
7

hiện tại tôi đang viết chương trình nhỏ đọc tiêu đề tệp elf và in một số thông tinĐọc ELF tiêu đề trong C

Tôi có một con trỏ char chưa ký tên là buf trỏ đến vị trí tệp elf nằm trong bộ nhớ (I sử dụng mmap để ánh xạ nó vào bộ nhớ), sau đó tôi định kiểu nó vào một hợp tinh con trỏ tiêu đề

Elf32_Ehdr *ehdr = (Elf32_Ehdr *)buf; 

Sau này tôi muốn để có được một địa chỉ của bảng tiêu đề chương trình, tôi làm điều đó như thế này

Elf32_Phdr *ptbl = (Elf32_Phdr *) (buf + ehdr->e_phoff) 

Như tôi đã nhận thấy giá trị của con trỏ ptbl không thay đổi và khi tôi cố gắng để in giá trị của các thành viên e_phoff như thế này

fprintf(stdout , "Offset of program headers : %d\n", ehdr->e_phoff); 

tôi nhận được không Cùng những thứ sẽ xảy ra khi tôi cố gắng để in số chương trình tiêu đề và số tiêu đề phần - luôn nhận được số không Nếu tôi sử dụng chế độ đọc linux, nó in các giá trị thích hợp Có ai gặp phải sự cố tương tự không?

+3

Tôi nghĩ rằng tôi đã tìm thấy vấn đề, tôi đang sử dụng máy 64 bit, vì vậy tôi vừa thay đổi Elf32_Phdr thành Elf64_Phdr và nó đã hoạt động –

+0

Tiếp tục trả lời câu hỏi của riêng bạn. Đó là một điều hợp lệ để làm, nếu bạn tìm thấy câu trả lời đầu tiên. Rõ ràng, bạn đã sử dụng kiểu con trỏ struct sai, vì vậy bạn đã tham khảo bộ nhớ ngược dòng về những gì dự định. –

+0

Tôi đề nghị sử dụng libelf. –

Trả lời

5

Khi phân tích một đối tượng ELF, bạn sẽ cần phải ghi nhớ rằng:

  1. Kích thước, liên kết tập tin và bố trí nội cho các cấu trúc trong file (chẳng hạn như các ELF thực thi Header) phụ thuộc vào ELF kích thước từ của đối tượng.
  2. Sự kết thúc của đối tượng ELF có thể khác với độ tin cậy 'bản địa' của chương trình đọc đối tượng.
  3. Các đối tượng ELF chứa một số lượng lớn các phần hoặc phân đoạn chương trình có thể sử dụng lược đồ "mở rộng đánh số" thay thế.

Thay vì xử lý những trường hợp này bằng tay, nó có thể được dễ dàng hơn để sử dụng một thực hiện các ELF (3) truy cập API để phân tích đối tượng ELF (xem: BSD libelf, hoặc GNU libelf).

Hướng dẫn `` libelf by Example '' chứa phần giới thiệu dễ đọc về API ELF (3).

+0

Cảm ơn người đàn ông, tôi chỉ đang chơi với ví dụ này để có được một cảm giác gần gũi hơn về ELF là gì, dù sao nhờ các liên kết hữu ích –

Các vấn đề liên quan