2012-06-10 14 views
5

Tôi đã tháo một DLL và thấy có một số chức năng. Tôi tìm thấy chức năng mà tôi cần và địa chỉ của nó là 0x10001340.là nó có thể cho địa chỉ chức năng trong DLL để thay đổi nếu nó được nạp vào ứng dụng?

Địa chỉ này có giữ nguyên không, nếu tôi tải dll này vào ứng dụng của tôi? Vậy tôi có thể gọi hàm đó bằng địa chỉ của ứng dụng của tôi không?

Tôi hỏi vì tôi không chắc chắn: điều gì sẽ xảy ra nếu khi dll này được tải, một số chức năng trong ứng dụng chính đã có cùng địa chỉ? Vì vậy, có thể các hàm bên trong dll có thể thay đổi địa chỉ khi tải hoặc v.v.

+0

Bạn đã nhận đúng ... –

+0

đúng về tùy chọn nào? : Địa chỉ D có thể thay đổi khi được tải? – Kosmos

Trả lời

8

Trên Windows dll có địa chỉ tải ưu tiên, nhưng trình tải có thể thay đổi tất cả các tham chiếu đó nếu nó nhận thấy phần đó của không gian địa chỉ ảo đã được sử dụng. Quá trình này được gọi là "rebasing".

Địa chỉ cơ sở "mặc định" được chỉ định tại thời gian liên kết (/BASE với trình liên kết Microsoft) và có thể hữu ích để đặt nó thành một thứ khác với mặc định nếu bạn định sử dụng dll này cùng với cùng một địa chỉ cơ sở; điều này làm tăng tốc quá trình tải, vì bộ nạp không phải rebase một trong các dll ở mỗi tải. (IIRC cũng có các công cụ có thể rebase một dll hiện có và lưu kết quả trên đĩa)

Thật tốt khi ghi nhớ rằng, từ Windows Vista trở đi, các dll được biên dịch với một cờ được chỉ định luôn được tải một cách ngẫu nhiên địa chỉ cơ sở để tránh một số loại khai thác.

3

Đó là cực kỳ không chắc rằng bạn sẽ kết thúc bằng cùng một địa chỉ. Đối số mặc định/BASE cho trình liên kết cho các tệp DLL là 0x10000000, đó là cách điểm nhập của bạn kết thúc tại địa chỉ đó. Nhưng có nhiều các tệp DLL được liên kết bằng cài đặt mặc định, chỉ một thực tế mới có thể tải được tại địa chỉ đó. Tất cả những cái khác được tải sau này cần được dựa trên lại.

Bạn có thể tìm ra giá trị tốt hơn cho/BASE, tuy nhiên, không bao giờ bảo đảm rằng bạn nhận được địa chỉ tải mà bạn yêu cầu.

2

Như Matteo đã nói, một DLL có địa chỉ tải ưa thích (được chỉ định trong trường ImageBase của cấu trúc IMAGE_OPTIONAL_HEADER). Khi hệ thống cố gắng tải một DLL nó sẽ tải nó tại địa chỉ này nếu có thể (trừ khi không gian địa chỉ ngẫu nhiên được kích hoạt) và không có "vá" là bắt buộc. Nếu nó không thể tải tại địa chỉ ưa thích, DLL sẽ được định vị lại sẽ yêu cầu bất kỳ tham chiếu tuyệt đối nào trong DLL được vá để bù lại cho việc di dời.

Vì vậy, để trả lời câu hỏi của bạn: Không có gì đảm bảo rằng một DLL sẽ được tải tại địa chỉ ưa thích của nó. Sau khi tải tải tiếp theo sẽ không tải thêm bản sao của DLL để các địa chỉ sẽ không thay đổi. Tuy nhiên, một khi đã được tải (DLLs được tham chiếu tính) không có gì đảm bảo nó sẽ được tải tại cùng một địa chỉ trong lần tiếp theo.