DLL injection
Lối tiếp cận trên Microsoft Windows

Trên Microsoft Windows, có nhiều cách để ép một tiến trình phải nạp và thực thi code của một DLL, nằm ngoài ý định của tác giả phần mềm đó:
Các DLL được liệt kê trong mục registry HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs đều được tải vào mọi tiến trình có tải User32.dll [en] trong lời gọi ban đầu tới DLL đó. Bắt đầu với Windows Vista, AppInit_DLL bị tắt theo mặc định. Bắt đầu với Windows 7, cơ sở hạ tầng của AppInit_DLL hỗ trợ code signing [en]. Bắt đầu với Windows 8, toàn bộ tính chức năng của AppInit_DLL đều bị tắt nếu có bật Secure Boot, bất chấp code signing hoặc thiết lập registry.
Các tệp DLL được liệt kê trong registry key HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCertDLLs đều được nạp vào mọi tiến trình có gọi các hàm Win32 API là CreateProcess, CreateProcessAsUser, CreateProcessWithLogonW, CreateProcessWithTokenW và WinExec. Đấy là cách đúng để sử dụng DLL injection một cách hợp lẽ trên phiên bản Windows hiện tại – Windows 10. DLL phải được ký bằng một chứng chỉ hợp lệ.
Các hàm để thao túng tiến trình như CreatRemoteThread hoặc các kỹ thuật code injection như AtomBombing, có thể được sử dụng để tiêm DLL vào một chương trình sau khi nó đã bắt đầu. Lưu ý rằng nếu không có sự đề phòng, lối tiếp cận này có thể bị 'tiến trình mục tiêu' phát hiện do các tin báo DLL_THREAD_ATTACH được gửi đến mọi 'mô-đun đang chạy' ngay khi một thread bắt đầu.
Mở một handle [en] tới tiến trình mục tiêu. Điều này có thể được thực hiện bằng cách spawn [en] ra tiến trình đấy hoặc bằng cách lần nó dựa trên một đầu mối mà chắc chắn có tồn tại khi tiến trình đó chạy – ví dụ, một cửa sổ [en] có tiêu đề đễ dự đoán, hoặc bằng cách lấy danh sách các 'tiến trình đang chạy' và quét tìm 'tên tệp' của 'tệp thực thi mục tiêu'.
Cấp phát bộ nhớ trong 'tiến trình mục tiêu', rồi ghi tên của 'DLL cần tiêm' vào bộ nhớ đó.
Bước này có thể được bỏ qua nếu một 'tên DLL phù hợp' đã có sẵn trong tiến trình mục tiêu. Ví dụ: nếu một tiến trình mà có liên kết đến 'User32.dll [en]', 'GDI32.dll [en]', 'Kernel32.dll [en]' hoặc bất kỳ thư viện nào khác có tên kết thúc bằng ‘32.dll’, thì có thể tải thư viện có tên '32.dll'. Kỹ thuật này trong quá khứ đã được chứng minh là có hiệu quả để vượt qua hàng rào ngăn ngừa DLL injection của một tiến trình.
Tạo một thread mới trong 'tiến trình mục tiêu' với 'địa chỉ bắt đầu' của thread được đặt thành địa chỉ của LoadLibrary và đối số được đặt thành địa chỉ của chuỗi văn bản vừa được ghi vào mục tiêu ở bước 2.
Thay vì ghi tên của một 'DLL cần tải' vào mục tiêu và bắt đầu thread mới tại LoadLibrary, người ta có thể viết hẳn một 'mã-để-thực-thi' vào mục tiêu và bắt đầu thread tại mã đó.
Hệ điều hành sau đó gọi vào thường trình sơ khởi (initialization [en] routine) của 'DLL được tiêm'.
Các lời gọi hook [en] của Windows như SetWindowsHookEx.
Sử dụng hàm SuspendThread hoặc NtSuspendThread để tạm đình chỉ tất cả các thread, sau đó sử dụng hàm SetThreadContext hoặc NtSetContextThread để sửa đổi ngữ cảnh của một thread đang tồn tại trong ứng dụng đó để thực thi 'mã được tiêm', từ đó có thể nạp DLL.
Khai thác các 'hạn chế về thiết kế' trong Windows và các ứng dụng có gọi hàm LoadLibrary hoặc LoadLibraryEx mà không chỉ định 'đường dẫn hợp cách đầy đủ' (full-qualified path [en]) đến DLL được tải.
Shim [en] ở mức hệ điều hành.
Thay thế một 'DLL đặc thù ứng dụng' bằng một 'bản thay thế giả mạo' có bản thực hiện của các hàm được xuất (export) tương tự như bản gốc.