[P3] Cách mà mã độc hiện đại hoạt động
Mở bài
Quay lại với series về mã độc thường niên vào mỗi tháng 5, hôm nay mình sẽ giới thiệu anh em một kĩ thuật mà Malware nói chung và Trojan nói riêng thường sử dụng - DLL side loading.
Lưu ý: Bài viết này chỉ mang mục đích học tập và nghiên cứu, tác giả không chịu trách nhiệm cho bất kì hành vi vi phạm pháp luật nào cả :DD
1. DLL là gì??
Trước khi bắt đầu kĩ thuật chúng ta sẽ tìm hiểu DLL là gì. DLL (Dynamic Linked Library) là thư viện chứa các hàm hoặc dữ liệu được chia sẻ có thể sử dụng bởi nhiều ứng dụng cùng 1 lúc. Các file DLL này sẽ export các hàm để có thể dùng bởi các process khác. Khác với các file thực thi như EXE, DLL không thực thi trực tiếp code một cách độc lập mà cần phải gọi nó thông qua các file thực thi đó. Lấy ví dụ dễ hiểu, để hiển thị một hộp thoại thông báo chúng ta sẽ phải gọi hàm MessageBoxA thứ sẽ được export bởi user32.dll, điều này cũng tức là chúng ta muốn gọi hàm MessageBoxA, chúng ta cần phải load user32.dll vào không gian địa chỉ của mình rồi mới có thể dùng hàm MessageBoxA được export
Hệ điều hành Windows cung cấp cho người dùng vô số file DLL như thế (mọi người có thể tìm trong thư mục C:/Windows/System32 để tham khảo) và các file hệ thống của Windows cũng đều sử dụng nó. Dưới đây là các hàm mà file alg.exe load từ thư viện MSWSOCK.dll

Lý do tạo các file DLL
- Lý do đầu tiên dễ thấy nhất vì nó là thư viện động, các bạn sẽ không muốn phải code lại toàn bộ hàm cho nhiều dự án đâu, thay vào đó là dùng 1 thư viện lưu chính hàm đó và gọi đến nó mỗi khi dùng. Thêm nữa, thay vì một tập tin lớn chứa toàn bộ chức năng, mã sẽ được chia làm thành nhiều thư viện độc lập và mỗi thư viện lại có một nhiệm vụ cụ thể điều này giúp gom vào từng mục đích cụ thể và dễ bảo trì. Ví dụ như user32.dll sẽ làm các công việc liên quan đến giao diện người dùng.

- Khi một hàm trong DLL thay đổi, code sẽ không cần phải biên dịch lại miễn là nó vẫn giữ nguyên các đối số truyền, kiểu dữ liệu, giá trị trả về, các quy ước gọi hàm. Trong khi đó với code mà các đối tượng được liên kết tĩnh thì cần phải được liên kết lại khi hàm thay đổi
- Nhiều process tải cùng 1 DLL vào cùng 1 địa chỉ cơ sở sẽ chia sẻ 1 bản sao duy nhất của DLL. Điều này giúp tiết kiệm một phần bộ nhớ
- Bên cạnh đó, các ngôn ngữ khác nhau đều có thể dùng được miễn tuân thủ quy ước gọi hàm.
Cách viết 1 file DLL cơ bản
Tùy thuộc vào cách chọn entrypoint mà sẽ có những cách để trigger code. Sẽ có 4 trường hợp xảy ra như sau:
- DLL_PROCESS_ATTACH: Khi 1 process tải dll thì tại đây sẽ trigger code
- DLL_THREAD_ATTACH: khi 1 process tạo 1 thread mới sẽ trigger code
- DLL_THREAD_DETACH: khi 1 process dừng tạo thread sẽ trigger code
- DLL_PROCESS_DETACH: khi 1 process dừng load DLL thì sẽ trigger code
Do đó mà tùy vào mục đích và yêu cầu nên sẽ chọn 1 entrypoint function trên nhưng code cơ bản sẽ như này:

Tại đây mình sẽ thực thi gọi ra 1 thông báo khi dll được load. Và vì mình viết ở DLL_PROCESS_ATTACH nên mỗi khi chương trình gọi đến file DLL đó thì nó sẽ trigger code của mình và bật ra thông báo Hacked By Kon

Okay vậy chúng ta đã xong cách tạo ra 1 file DLL đơn giản. Tiếp theo là tìm hiểu kĩ thuật DLL Side Loading
2. DLL Side Loading là gì??
DLL side loading là kĩ thuật được mã độc sử dụng phổ biến trong thực tế. Chúng sẽ lợi dụng việc các chương trình hợp pháp gọi đến các hàm độc hại do kẻ tấn công kiểm soát thông qua dll cùng tên để trigger các hành vi . DLL Side Loading khá dễ nhầm 1 kĩ thuật khác nhưng mà mình sẽ đề cập nó trong bài sau. Lý do attacker sử dụng kĩ thuật này vì nó dễ sử dụng và khó bị phát hiện. Nếu chỉ chú ý các process được load(lành tính) mà không chú ý để các lib được load lên thì dễ bị bỏ sót. Và để hiểu rõ hơn thì chúng ta sẽ tìm hiểu cách mà hệ điều hành Windows load các file DLL.
Thông thường, thứ tự tìm kiếm DLL trên Windows (từ cao xuống thấp):
-
Thư mục chứa file EXE của ứng dụng.
-
Thư mục hệ thống (System32).
-
Thư mục hệ thống (SysWOW64 nếu ứng dụng 32-bit trên 64-bit).
-
Thư mục Windows.
-
Thư mục hiện tại (current working directory) - nhưng có thể thay đổi tùy chế độ.
-
Các thư mục trong biến môi trường PATH.
Hiểu được cơ chế load này rồi chúng ta sẽ có một cái hình tổng quát như sau. Attacker sẽ lợi dụng cơ chế tìm kiếm của Windows và sẽ đưa DLL độc hại vào cùng thư mục, Có thể bằng cách copy file hoặc đính kèm trong các ứng dụng crack,... Thử áp dụng vào 1 file mình sẽ tạm gọi là một file lành tính. Code mẫu dưới đây

Logic của code này nó sẽ export 2 hàm để các ứng dụng thực thi, mỗi khi ứng dụng gọi hàm này thì sẽ trigger code bật thông báo

Kĩ thuật này không phải lúc nào cũng sẽ thành công nếu ứng dụng hardcode hoặc chỉ định đường dẫn nhưng vẫn là một trog các cách phổ biến được sử dụng. Đến đây là hết rồi, cảm ơn các bạn đã đọc.Mình sẽ cập nhật các bài khác vào kì sau :> Nếu có thiếu sót gì hãy góp ý thẳng dưới bình luận nhé, xin cảm ơn :>
All rights reserved