2008-12-22 13 views
17

Có thể nhận được chữ ký của hàm được xuất (kiểu C?) (Số tham số/kiểu, kiểu trả về) từ một DLL không? Tôi có thể xem danh sách tên, địa chỉ, chức năng, v.v. với DLL Export Viewer nhưng tôi không thể xem chữ ký. Tôi chỉ có tệp dll và không có tệp .h cũng như .def.Nhận chữ ký của các hàm được xuất trong một DLL

CẬP NHẬT: Sử dụng công cụ có tên API Monitor, tôi có thể đính kèm vào quá trình sử dụng dll được đề cập và xem các cuộc gọi đến các chức năng. Điều này cho phép tôi xem số tham số, giá trị trả về và giá trị số nguyên của chúng (con trỏ?) Nhưng điều này không giúp ích gì nhiều. Tôi có lẽ nên tìm một cách để xác định loại cấu trúc mà con trỏ trỏ đến vào thời điểm gọi.

Trả lời

3

Trong C++, chữ ký chức năng là "mangled" vào tên theo cách phụ thuộc trình biên dịch. Điều này không xảy ra trong C. Vì vậy, nếu bạn có các hàm C trong tệp DLL của mình, bạn sẽ thấy các tên chưa được sắp xếp. Nếu đó là một C++, bạn sẽ thấy những cái bị xé.

C++ cần có tên bị xáo trộn để cho phép trình liên kết giải quyết các chức năng quá tải với các chữ ký khác nhau.

Tôi không nghĩ rằng có bất kỳ cách nào để bạn có thể nhận được các chữ ký hàm từ một DLL "C". Họ chỉ đơn giản là không có mặt.

3

Đối với các hàm C, thông tin này không được lưu trữ trong DLL. Điều duy nhất tôi có thể đề nghị là để tháo rời chức năng và nhìn vào cách nó tương tác với các biến trên ngăn xếp và sau đó cố gắng xác định chữ ký.

Chúc may mắn!

17

Các tệp DLL không lưu trữ chữ ký của các chức năng mà chúng xuất. Các câu trả lời khác đã đề cập đến C++ và khi hàm C++ được xuất là C++, thì tên thực sự sẽ bị xáo trộn. Gỡ rối nó với lược đồ mangling của trình biên dịch phù hợp, và bạn sẽ có chữ ký. Nhưng hầu hết các DLL không xuất các hàm C++ sử dụng tên C++ của chúng. Thay vào đó, các hàm mà một DLL chọn để xuất được xuất bằng các tên kiểu C, vì vậy ngay cả khi DLL được viết bằng C++, các hàm đã xuất sẽ vẫn không có bất kỳ thông tin chữ ký nào.

Bạn không có tiêu đề? Hầu hết các nhà cung cấp bao gồm loại điều đó trong SDK của họ. Nếu bạn không nhận được một, sau đó khiếu nại cho nhà cung cấp. Nếu bạn không được phép nhận được một cái, thì có lẽ bạn đang đi về nhiệm vụ của bạn một cách sai lầm; bạn có chắc bạn đang sử dụng DLL đó trực tiếp không?

Nếu bạn không có tệp tiêu đề, thì bạn cũng có thể tự hỏi mình có thực sự được cho phép, hợp pháp, sử dụng DLL trong chương trình của bạn hay không. Nếu nó chỉ là một DLL tùy ý bạn tìm thấy trên hệ thống của bạn, thì ngay cả khi bạn có thể viết mã cho nó, bạn có thể không được phép phân phối lại nó khi bạn gửi chương trình của bạn.

+0

Bạn hoàn toàn đúng tại điểm của mình :) – huseyint

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