2011-07-07 35 views
11

Tôi cần gọi hàm từ một chương trình khác. Nếu chương trình khác là một thư viện, tôi chỉ đơn giản có thể sử dụng dlopen và dlsym để có được một xử lý cho các chức năng. Thật không may, các chương trình khác là một Unix thực thi, và xây dựng nó như là một thư viện không phải là một lựa chọn. Cố gắng dlopen() trên các thực thi cho thông báo lỗi này:Sử dụng dlopen() trên một tập tin thực thi

dlopen([...]/testprogram, 1): no suitable image found. Did find: [...]/testprogram: can't map

Đây không phải là đáng ngạc nhiên, như dlopen là có nghĩa là để sử dụng với các thư viện, không thực thi. Có cách nào để có được dlopen và dlsym để làm việc với thực thi? Nếu không, liệu có cách nào khác để đạt được điều tương tự không?

Trả lời

7

Bạn không thể mở tệp thực thi dưới dạng thư viện. Điểm vào của tệp thực thi sẽ cố gắng khởi tạo lại thư viện C và tiếp nhận con trỏ brk. Điều này sẽ làm hỏng đống malloc của bạn. Ngoài ra, tệp thực thi có khả năng được ánh xạ tại một địa chỉ cố định không có chuyển vị trí và nếu địa chỉ này trùng lặp với bất kỳ thứ gì đã được tải, thì cũng không thể ánh xạ nó vì lý do đó.

Bạn cần phải cấu trúc lại chương trình khác vào thư viện hoặc thêm giao diện RPC vào chương trình khác.

Lưu ý rằng điều này không nhất thiết áp dụng cho thực thi PIE. Tuy nhiên, trừ khi thực thi được thiết kế đặc biệt để được dlopen() ed, điều này là không an toàn, vì main() sẽ không chạy, và bất kỳ khởi tạo nào được thực hiện trong main() do đó sẽ không xảy ra.

+3

Như đã thảo luận ở đây: http://stackoverflow.com/questions/6617099/call-function-in-unrelated-executable-linux/6619977#6619977, câu trả lời này là sai cho thực thi PIE, đó là thực sự là một hình thức đặc biệt của thư viện được chia sẻ (và thậm chí có ET_DYN e_type). –

6

Trên một số hệ thống ELF (đặc biệt là Linux), bạn có thể dlopen() thực thi PIE. Khi sử dụng GCC, chỉ cần biên dịch thực thi với -fpie hoặc -fPIE, và liên kết nó với -pie và xuất những biểu tượng thích hợp sử dụng --dynamic-list hoặc -rdynamic (giải thích chi tiết hơn trong this other SO answer.

+0

A [câu trả lời tương tự] (http://stackoverflow.com/questions/19713517/how-to-self-dlopen-an-executable-binary/19716028#19716028). –

0

Để thêm khả năng tải thực thi qua dlopen là đã đăng ký với tư cách là từ chối glibc RFE (Yêu cầu nâng cao). Xem chi tiết về RFE và cách tiếp cận có thể có đối với một số trường hợp đặc biệt có thể được tìm thấy tại

[http://sourceware.org/bugzilla/show_bug.cgi?id= 11754] [1]

Không bao gồm PIE sẽ có nhiều vấn đề cản trở các cảnh để thực hiện một chức năng như vậy.

0

Công cụ ở đây để làm chính xác điều đó, xử lý ASLR/PIE và không phải ASLR/PIE. Biên dịch trên x86, ARM và MIPS (chỉ 32 bit). Chỉnh sửa Makefile để đặt thông số ARCH.

http://rtfc.org.uk/cliapi.html

Đó là công cụ của tôi, nhưng có vẻ như để làm những gì bạn muốn. Hãy cho tôi biết nếu nó không hoạt động cho bạn.

Tôi đánh giá cao việc tôi đến bữa tiệc này đến mức nào, nhưng hey.

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