Bạn có thể theo dõi phần 1 của bài phân tích mẫu virus lây file cụ thể Win32/Expiro tại đây.
Giai đoạn phân tích
Sử dụng LordPE, chúng ta xem xét sự khác biệt giữa hai file calc.exe trước và sau khi lây: Thay đổi về kích thước file, thay đổi một số thuộc tính file: AddressEntryPoint, NumberOfSections, SizeOfImage, SizeOfStackReserve, SizeOfHeapReserve, MajorImageVersion, MinorImageVersion, BoundImport… Việc so sánh các trường này để tìm ra sự thay đổi trước và sau khi lây, từ đây giúp chúng ta debug nhanh chóng hơn.
Khởi động OllyDBG, IDA Pro và thực hiện load chương trình calc.exe đã thu thập ở bước trước. Trước tiên cần tìm được điểm đặt breakpoint, đối với hành vi lây file, chúng ta sẽ quan tâm tới các API: FindFirstFile (A|W), FindNextFile (A|W), OpenFile, ReadFile, CreateFile, WriteFile, LocalAlloc, …. Có hai cách để dừng lại tại các API trên: Đặt breakpoint khi chương trình thực hiện CALL DLL (Từ OllyDBG → Debug → CALL DLL export ) hoặc thực hiện chạy qua từng lệnh và kiểm tra các API được load:
- Đặt breakpoint khi chương trình thực hiện CALL DLL, đặt breakpoint khi xảy ra việc load dll: KERNEL32.DLL vì DLL này chứa API để thực hiện việc lấy địa chỉ hàm tương đối với địa chỉ Kernel32. Tuy nhiên, trong chương trình này tính năng này không sử dụng được. Như vậy chúng ta phải đi theo cách thứ hai, chạy qua từng lệnh và kiểm tra API được load lên
- Chạy qua từng lệnh và kiểm tra API được load lên (Từ OllyDBG → Plugins→ Command Line → Command Line *1* hoặc trong cửa sổ code của OllyDBG, click chuột phải → Search for → All itermodular calls *2*). Hai chức năng này sẽ giúp liệt kê tất cả các API được nạp lên theo chương trình tại thời điểm hiện tại. Do các API được hệ thống sẽ được mô tả cụ thể theo tên DLL + tên API nên từ đây chúng ta sẽ dễ dàng tìm kiếm các API mình quan tâm để thiết lập các breakpoints.
- Nếu sử dụng cách số *1*, tại cửa sổ hiện ra, chúng ta gõ: bpx + API cần tìm, plugins này sẽ giúp liệt kê các API đã được load:
- Nếu sử dụng cách số *2*, chúng ta sẽ chỉ cần xem danh sách các API đã được load lên:
Sau khi đã thực hiện chạy qua từng lệnh (Dùng F8) và kết hợp với quá trình kiểm tra như trên. Sau một thời gian “to tay”, chúng ta sẽ tới được các API cần thiết (FindFirstFileA, FindNextFileA, OpenFile, LocalAlloc, ReadFile, WriteFile):
Chúng ta tiến hành đặt breakpoint tại tất cả các đoạn mã gọi tới các API mà chúng ta quan tâm. Ở đây, tôi quan tâm tới các hành vi: FindFirstFileA, FindNextFileA, CreateFile, ReadFile, WriteFile, LocalAlloc vì đây là các API có liên quan trực tiếp tới quá trình tìm, sửa file, tức là nó sẽ được virus sử dụng để thực hiện hành vi lây nhiễm lên các file khác trong hệ thống:
Sau khi đặt breakpoint xong, chúng ta tiến hành chạy F9. Lúc này, OllyDBG sẽ tự động thực thi các lệnh cho tới khi gặp các breakpoints hoặc khi chương trình kết thúc. Sau một thời gian chạy, OllyDBG dừng lại ở hàm FindFirstFileA (tuyệt vời), chúng ta tiến hành Debug (Có thể qua từng lệnh F8 hoặc F9) và tới được được đoạn mã virus tìm đến thư mục đã bẫy ở Desktop, và tiếp theo nó tìm được file: calc.exe để lây nhiễm.
Như vậy, chúng ta đã xác định được đoạn mã bắt đầu tìm kiếm các tài nguyên để lây nhiễm, bước tiếp theo virus sẽ lây nhiễm cụ thể vào file, do đó, nó sẽ cần mở file này. Do chúng ta đã đặt breakpoint tại hàm mở file (CreateFile), chúng ta tiếp tục chạy F9 để chương trình tới được đoạn mã này. Bắt đầu đoạn mã này chính là đoạn bắt đầu virus thực hiện hành vi lây vào file, vì vậy chúng ta cần phân tích kỹ để xem virus chỉnh sửa và thay đổi những gì trên file để có thể xây dựng hàm diệt.
Sau khi mở file thành công, virus lấy kích thước file thông qua hàm GetFileSize, sau đó thực hiện cấp phát một vùng nhớ (LocalAlloc) để load toàn bộ file lên vùng nhớ đó, từ đó, virus tiến hành chỉnh sửa file.
Trong cửa sổ dưới đây chúng ta sẽ có cái nhìn tổng quan về các khối lệnh và sơ đồ luồng nằm trong hàm diệt. Do đây là mẫu virus tương đối đơn giản nên chúng ta chỉ cần IDA để xem thông tin sơ bộ trong hàm, không cần đi sâu hơn ở mức đồng bộ giữa việc chạy chương trình trên OllyDBG và IDA để tìm hiểu chi tiết từng đoạn mã.
Từ đoạn này, tôi tiến hành theo dõi vùng nhớ mà chương trình được nạp lên, mã virus bắt đầu thực hiện việc đọc PE header và thay đổi các tham số. Trước tiên nó đọc một số trường trong PE Header
Virus tiến hành một số thay đổi trên file gốc trên vùng nhớ:
- Thay đổi BoundImport để tăng thêm section
- Thay đổi cờ cho vùng nhớ mới để biến nó thành vùng mã có thể thực thi
- Tăng số section trong PE Header khi thêm mới 1 section
Tiếp tục debug đoạn chương trình này, chúng ta thấy virus tiến hành thay đổi một số trường khác tương đối quan trọng khác
- Thay đổi SizeOfImage theo kích thước VirtualSize của section virus vừa ghi thêm vào
- Ghi lại EntryPoint mới để trỏ tới mã thực thi của virus, thay đổi SizeOfHeapReserve, SizeOfStackReserve, MajorImageVersion, MinorImageVersion…
Sau quá trình chỉnh sửa các trường trong file, virus tiến hành ghi nội dung file calc.exe đã được chỉnh sửa sang một file có tên: calc.ivr trong cùng thư mục, sau đó, nó thực hiện Copy đè nội dung của file calc.ivr lên file gốc và xóa bỏ file calc.ivr đi. Quá trình lây nhiễm hoàn tất.
Theo dõi tiếp
Phân tích mẫu virus lây file cụ thể Win32/Expiro – P3 – Diệt và đánh giá virus