Mở bài
Dạo gần đây mình có tìm hiểu về mã độc lây file (file infector virus) cũng như WinAPI. Để củng cố kiến thức và chia sẻ đến cộng đồng, mình sẽ hướng dẫn mọi người cách mà mã động sẽ thực hiện như nào qua 3 phần.
LƯU Ý: Bài viết này chỉ để hướng dẫn cho mục đích học tập và sẽ không chịu trách nhiệm cho bất cứ hành vi vi phạm pháp luật nào cả.
TỔNG QUAN VỀ MÃ ĐỘC LÂY FILE
1. Mã độc lây file (file infector virus) là gì?
- Mã độc lây file là một loại virus máy tính lây nhiễm vào các file thực thi trên môi trường Windows như: .exe, .com, .dll,... hoặc ở trong môi trường Unix là các file như: .bin, .out. Khi file bị lây nhiễm thực thi, virus cũng được kích hoạt và từ đó có thể lây lan tiếp sang những file chưa bị nhiễm.
2. Các hành vi độc hại.
Tìm kiếm nạn nhân: Mã độc sẽ chạy 1 module tìm kiếm các file trên hệ thống chưa bị nhiễm để đưa sang module lây nhiễm
Lây nhiễm: Sau khi đã có file, mã độc sẽ tiến hành inject các đoạn mã đôc hại của nó vào file đích
Tự lây lan/ mở rộng: Sau khi đã chèn đoạn mã độc hại của nó vào, từ một file chưa bị nhiễm đã biến thành một file độc hại khác. Ngoài ra mã độc cũng sẽ lây lan qua các ổ USB, hoặc qua mạng LAN.
Thực hiện hành vi độc hại khác: Phụ thuộc vào kĩ thuật của kẻ tấn công mà sẽ có nhiều vector tấn công khác nhau như thu thập dữ liệu người dùng, mã hóa file, keylogger,...
3. Dấu hiệu bất thường.
Các file .exe bị thay đổi thời gian sửa, kích thước file tăng lên cũng là một dấu hiệu
Các chương trình gốc bị crash, hoạt động lạ
-Antivirus cảnh báo liên tục
-File lạ xuất hiện trên hệ thống
DEMO CODE DUYỆT FILE VỚI C VÀ WINAPI
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <stdio.h>
#include <string> void ListFilesTree(const char* folderPath, int indent) { WIN32_FIND_DATAA findData; HANDLE hFind; char searchPath[MAX_PATH]; char fullPath[MAX_PATH]; snprintf(searchPath, MAX_PATH, "%s\\*", folderPath); hFind = FindFirstFileA(searchPath, &findData); if (hFind == INVALID_HANDLE_VALUE) { return; } do { if (strcmp(findData.cFileName, ".") == 0 || strcmp(findData.cFileName, "..") == 0) continue; snprintf(fullPath, MAX_PATH, "%s\\%s", folderPath, findData.cFileName); for (int i = 0; i < indent; ++i) { printf(" "); } if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { printf("[D] %s\n", findData.cFileName); ListFilesTree(fullPath, indent + 1); } else { printf("[F] %s\n", findData.cFileName); } } while (FindNextFileA(hFind, &findData)); FindClose(hFind);
} int main() { //inject("test.exe"); const char* root = "C:\\Users\\Zlick3r\\Downloads\\d3model"; // Đường dẫn gốc printf("Cây thư mục tại: %s\n", root); ListFilesTree(root, 0);
}