DLL Hooking là gì và nó hoạt động như thế nào?
Khi các nhà phát triển cần mở rộng chức năng của một chương trình mà họ không có mã nguồn, họ thường chuyển sang DLL hooking. Đây là một cách không chính thống để làm cho một chương trình làm điều gì đó mà nó không có ý định làm.
Vấn đề là, tin tặc cũng sử dụng kỹ thuật này vì tất cả các lý do sai trái, chẳng hạn như vũ khí hóa các ứng dụng vô hại hoặc bẻ khóa phần mềm. Vậy DLL hooking là gì và nó thực sự hoạt động như thế nào?
Mục Lục
DLL là gì?
Mỗi ứng dụng phụ thuộc vào một số tệp bên ngoài mã cơ sở của nó để chạy. Các tệp bên ngoài này chứa mã và dữ liệu mà chương trình cần để hoạt động bình thường. Khi bất kỳ tệp bên ngoài nào bị thiếu, chương trình có thể gặp sự cố về độ ổn định hoặc hoàn toàn từ chối chạy.
Trong hệ điều hành Windows, các tệp bên ngoài này được gọi là DLL hoặc thư viện liên kết động. Thư viện liên kết động là các thành phần thiết yếu của hệ điều hành Windows, cung cấp mã và tài nguyên có thể tái sử dụng có thể được chia sẻ trên nhiều ứng dụng.
Các tệp bên ngoài trên Windows được gọi là thư viện. Có hai loại thư viện: động và tĩnh. Các thư viện động được tải vào thời gian chạy và các thư viện tĩnh được tải vào thời gian biên dịch. DLL là một thư viện động.
DLL Hooking là gì?
DLL hooking là một kỹ thuật bao gồm việc chặn và thay đổi lệnh gọi hàm mà các chương trình hoặc quy trình tạo ra cho một DLL. Về cơ bản, một thiết lập Man-in-The-Middle được thiết lập trong đó một cái móc nối nằm giữa một chương trình và các tệp DLL mà nó gọi. Tất cả hoặc các cuộc gọi chức năng được nhắm mục tiêu sau đó được theo dõi và thay đổi.
Đây là một ví dụ về quy trình tấn công DLL hooking:
- Kẻ tấn công phân tích các lời gọi hàm được thực hiện bởi chương trình và các tệp DLL mà nó phụ thuộc vào.
- Kẻ tấn công tạo một hook bằng cách sử dụng một trong nhiều kỹ thuật triển khai như hook IAT, hook nội tuyến, hook COM, v.v.
- Thực thi mã tùy ý xảy ra.
- Việc thực hiện cuộc gọi chức năng ban đầu có thể xảy ra hoặc không.
- Kẻ tấn công che đậy dấu vết của chúng bằng cách xóa hook và hoàn nguyên tất cả các thay đổi đã thực hiện.
DLL hooking là một kỹ thuật tinh vi có thể được sử dụng cho cả mục đích tốt (chẳng hạn như mở rộng chức năng chương trình, gỡ lỗi và ghi nhật ký) hoặc cho mục đích xấu (chẳng hạn như bỏ qua các biện pháp bảo mật, đánh cắp dữ liệu nhạy cảm, thực thi mã tùy ý và viết các bản hack trò chơi điện tử).
DLL Hooking hoạt động như thế nào?
Trước khi đi sâu vào triển khai DLL hooking, điều quan trọng là phải làm rõ những điều cơ bản. Hãy lùi lại một bước và hiểu điều gì sẽ xảy ra khi một lệnh gọi hàm được thực hiện cho một DLL bởi một chương trình.
Khi một chương trình gọi một hàm trong DLL, trước tiên, hệ điều hành sẽ tra cứu tên của hàm đó trong Bảng Địa chỉ Nhập của chương trình và lấy địa chỉ của hàm từ Bảng Địa chỉ Xuất của DLL.
Khi địa chỉ của hàm được giải quyết, chương trình có thể chuyển đến địa chỉ của hàm để truy cập và thực thi nó. DLL hooking xoay quanh việc chặn quá trình này và chuyển hướng lệnh gọi hàm sang một hàm khác. Có một số cách để thực hiện DLL hooking. Hãy xem xét các kỹ thuật được sử dụng phổ biến nhất để thực hiện nó.
Điều này có thể khá kỹ thuật, vì vậy nó có thể hữu ích nếu bạn là người dùng thành thạo Windows hoặc có hiểu biết sâu sắc về nội bộ Windows.
Kết nối IAT
IAT hooking là một kỹ thuật hiệu quả được các tác giả phần mềm độc hại sử dụng rộng rãi để phá vỡ các biện pháp bảo mật và tránh bị phát hiện. Bảng địa chỉ nhập (IAT) là một cấu trúc dữ liệu được tải vào bộ nhớ bất cứ khi nào một quy trình mới được tạo. IAT chứa tên của tất cả các lệnh gọi hàm đã nhập và địa chỉ bộ nhớ của chúng.
Khi một chương trình gọi một hàm trong DLL, tên hàm đầu tiên được tìm kiếm trong IAT và nếu địa chỉ bộ nhớ của hàm đã nói không được tìm thấy trong IAT thì nó được thiết lập từ Bảng địa chỉ xuất của DLL.
Nó là một cấu trúc dữ liệu trong đó tất cả các hàm do DLL xuất ra được ánh xạ tới địa chỉ bộ nhớ của chúng. Trong móc nối IAT, kẻ thù có thể sửa đổi IAT của một quy trình và thay thế ánh xạ chức năng hợp pháp bằng ánh xạ độc hại, do đó làm gián đoạn hoạt động dự định và khiến chương trình thực thi mã tùy ý.
Đây là luồng tấn công chung trong IAT hooking trông như thế nào:
- Một chương trình thực hiện lời gọi hàm.
- Địa chỉ chức năng được đặt trong IAT.
- Vì IAT đã được kết nối; địa chỉ chức năng đã bị thay đổi và vị trí bộ nhớ của chức năng độc hại được tải.
- Chương trình nhảy đến vị trí của chức năng độc hại và mã tùy ý được thực thi.
- Cuối cùng, lời gọi hàm ban đầu được thực hiện.
Kết nối nội tuyến
Nối nội tuyến là một kỹ thuật nối DLL liên quan đến việc thay đổi mã nguồn của chức năng đích để hướng việc thực thi của nó tới một chức năng đặc biệt. Inline Hooking, trái ngược với IAT hooking, trực tiếp thay đổi mã của hàm mục tiêu, giúp kẻ tấn công kiểm soát chính xác hơn cách hoạt động của hàm mục tiêu.
Trong sơ đồ trên, hãy quan sát cách chức năng hợp lệ đã bị giả mạo để chỉ ra một chức năng độc hại. Khi tất cả các hướng dẫn trong chức năng độc hại được thực thi, một lệnh nhảy được thực hiện để quay lại chức năng hợp pháp để nó hoàn tất việc thực thi.
Các đối thủ sử dụng móc nội tuyến để thực hiện các thay đổi lâu dài đối với chương trình, chẳng hạn như thay đổi tham số hoặc giá trị trả về của hàm.
Đường vòng của Microsoft
Nghiên cứu của Microsoft đã phát triển gói kết nối DLL nội bộ, Đường vòng. Nó cho phép các lập trình viên theo dõi và thay đổi các lời gọi hàm được thực hiện bởi một chương trình. Đường vòng có thể được sử dụng cho nhiều nhiệm vụ khác nhau, bao gồm nhưng không giới hạn ở: thiết bị đo đạc, thử nghiệm và sửa lỗi.
Các đối thủ sử dụng Đường vòng để thực hiện các cuộc tấn công DLL injection và hooking, và các nhà phát triển thường sử dụng nó để mở rộng chức năng của ứng dụng của họ. Bạn có thể tìm hiểu thêm về gói Detours trên kho lưu trữ GitHub chính thức.
Bây giờ bạn đã biết DLL Hooking hoạt động như thế nào
DLL hooking là một kỹ thuật phức tạp, khi được sử dụng đúng mục đích, có thể tăng cường khả năng ứng dụng của bạn hoặc giúp bạn gỡ lỗi và tối ưu hóa phần mềm. Thật không may, hooking thường được sử dụng như một kỹ thuật đối nghịch hơn là một kỹ thuật phát triển. Vì vậy, điều quan trọng là bạn phải áp dụng và tuân thủ các phương pháp hay nhất về bảo mật để đảm bảo rằng các ứng dụng của bạn an toàn và không bị tấn công như hooking và injection.