Cách Windows Xử Lý Các Tệp DLL - nói dối e blog

Cách Windows Xử Lý Các Tệp DLL

Trong hệ điều hành Windows, các tệp DLL có thể được đặt biệt danh thông qua thiết lập trong nhánh đăng ký HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs. Khi mở Trình soạn thảo Đăng ký (Registry Editor), người dùng có thể quan sát danh sách các biệt danh này.

Ví dụ cụ thể là mục “kernel32” tương ứng với tệp “kernel32.dll”. Khi lập trình viên gọi hàm LoadLibrary(“kernel32.dll”), hệ thống sẽ ưu tiên tải phiên bản kernel32.dll nằm trong thư mục System32 thay vì tệp cùng tên có thể tồn tại trong thư mục hiện hành. Điều này giúp đảm bảo tính ổn định và bảo mật cho ứng dụng.

Nguyên lý hoạt động của cơ chế này như sau:

  1. Khi phát hiện tham số truyền vào LoadLibrary là tên tệp DLL không có đường dẫn rõ ràng (ví dụ: “kernel32.dll”), hệ thống sẽ truy vấn giá trị DllDirectory trong nhánh KnownDLLs.
  2. Quan trọng cần lưu ý: Tên khóa trong đăng ký sẽ không bao gồm đuôi .dll. Quy trình khớp tên sẽ tự động loại bỏ đuôi .dll trước khi so sánh với tên khóa đăng ký.

Người dùng có thể tận dụng cơ chế này để thay đổi ánh xạ tên các DLL hệ thống bằng cách chỉnh sửa trực tiếp nhánh đăng ký kể trên. Tuy nhiên cần thận trọng vì thao tác sai có thể gây lỗi hệ thống.

Vấn đề ưu tiên tải DLL COM từ thư mục cục bộ Đối với các đối tượng COM đã đăng ký, để tránh xung đột tên tệp với phần mềm khác, kỹ thuật “DLL redirection” (chuyển hướng DLL) được áp dụng. Đặc biệt cần lưu ý kỹ thuật này KHÔNG khả dụng trên hệ điều hành Windows 98.

Giải pháp cụ thể như sau:

  • Tạo tệp văn bản trống có tên “[Tên ứng dụng].exe.local” (ví dụ: myapp.exe.local) đặt cùng thư mục với file thực thi chính.
  • Khi chạy ứng dụng, hệ thống sẽ ưu tiên tải tất cả DLL từ thư mục hiện hành trước khi tìm kiếm ở các vị trí mặc định khác.

Lưu ý: Cơ chế này đặc biệt hữu ích khi cần kiểm soát phiên bản DLL sử dụng cho ứng dụng cụ thể, giúp tránh xung đột với các phiên bản DLL toàn hệ thống. Tuy nhiên cần cân nhắc kỹ lưỡng về tính bảo mật khi cho phép tải DLL từ thư mục không xác định.

0%