|
|
|
Dowloads Lab tại đây
Xem lại tóm tắt nội dung của Chương 7 tại đây.
Table of Contents
Lab 7-2 Phân tích phần mềm độc hại được tìm thấy trong tệp Lab07-02.exe
Câu hỏi?
Phân tích chi tiết
1 Thông tin tổng quan
Môi trường phân tích | Windows 10 Flare VM |
---|---|
Mẫu phân tích | Lab07-02.exe |
Size | 16.00 KB (16384 bytes) |
MD5 | 7bbc691f7e87f0986a1030785268f190 |
Compiled | Sunday 19 December 2010, 11.18.04 |
2 Công cụ sử dụng
- VirusTotal (https://www.virustotal.com): Kiểm tra nhanh bằng nhiều engine antivirus.
- IDA Pro (https://hex-rays.com/ida-pro): Trình dịch ngược để phân tích mã assembly.
- Strings (https://learn.microsoft.com/en-us/sysinternals/downloads/strings): là một tiện ích dòng lệnh nhỏ gọn từ Sysinternals của Microsoft để quét một tệp và in ra các chuỗi ASCII và Unicode có thể in được.
3 Thực thi Lab07-02.exe
Nhấn đúp chay Lab07-02.exe trong máy Windows 10 Flare VM để xem những thay đổi. Ngay lập tức trình duyệt web sẽ mở kết nối đến trang web http://www.malwareanalysisbook.com/ad.html.
4 Phân tích Tĩnh
4.1 Sử dụng VirusTotal
Việc đầu tiên tải mẫu lên VirusTotal để kiểm tra.
https://www.virustotal.com/gui/file/bdf941defbc52b03de3485a5eb1c97e64f5ac0f54325e8cb668c994d3d8c9c90
Kết quả quét trên VirusTotal cho thấy mẫu được nhận diện là Trojan.
4.2 Kiểm tra Strings
Nội dung:
File: Lab07-02.exe MD5: 7bbc691f7e87f0986a1030785268f190 Size: 16384 Ascii Strings: --------------------------------------------------------------------------- 0000004D !This program cannot be run in DOS mode. 000000D0 Rich; 000001E8 .text 0000020F `.rdata 00000237 @.data 00001013 Phh @ 0000101D hX @ 0000106E L$$QVP 00001095 hx @ 000010AF SVW 000010FF =h0@ 00001134 5p0@ 000011A7 %( @ 0000212E OleUninitialize 00002140 CoCreateInstance 00002154 OleInitialize 00002162 ole32.dll 0000216C OLEAUT32.dll 0000217C _exit 00002184 _XcptFilter 00002192 exit 0000219A __p___initenv 000021AA __getmainargs 000021BA _initterm 000021C6 __setusermatherr 000021DA _adjust_fdiv 000021EA __p__commode 000021FA __p__fmode 00002208 __set_app_type 0000221A _except_handler3 0000222C MSVCRT.dll 0000223A _controlfp Unicode Strings: --------------------------------------------------------------------------- 00003010 http://www.malwareanalysisbook.com/ad.html
0000212E OleUninitialize 00002140 CoCreateInstance 00002154 OleInitialize 00002162 ole32.dll 0000216C OLEAUT32.dll 00003010 http://www.malwareanalysisbook.com/ad.html
Bên lề:
Các hàm SysFreeString, SysAllocString, VariantInit, CoCreateInstance, OleInitialize,
và OleUninitialize thường được sử dụng trong lập trình COM (Component Object Model) trên
Windows. Trong phân tích mã độc, các hàm này thường liên quan đến việc
thao tác với các đối tượng COM, quản lý chuỗi, hoặc xử lý các biến
kiểu VARIANT. Việc hiểu
rõ chức năng của chúng có thể giúp nhận diện các hành vi bất thường
trong mã độc. Dưới đây là chi tiết về từng hàm:
1. SysAllocString
Hàm SysAllocString được sử dụng để tạo (cấp phát) một chuỗi kiểu
BSTR.
- Cú pháp:
BSTR SysAllocString(const OLECHAR *psz);
- Tham số:
- psz: Con trỏ đến chuỗi Unicode để sao chép vào chuỗi BSTR mới.
- Trả về:
- Con trỏ đến chuỗi BSTR đã được cấp phát. Nếu không cấp phát được (thiếu bộ nhớ), trả về NULL.
- Ví dụ:
BSTR bstr = SysAllocString(L"Hello, COM!"); if (bstr != NULL) { // Sử dụng chuỗi bstr } SysFreeString(bstr); // Giải phóng bộ nhớ
Trong phân tích mã độc:
- Hàm này thường được sử dụng để cấp phát chuỗi cho các đối tượng COM hoặc truyền dữ liệu.
- Kẻ tấn công có thể sử dụng SysAllocString để tạo ra các chuỗi độc hại trong bộ nhớ.
2. SysFreeString
Hàm SysFreeString được sử dụng để giải phóng bộ nhớ của một chuỗi
BSTR đã được cấp phát trước đó.
- Cú pháp:
void SysFreeString(BSTR bstr);
- Tham số:
- bstr: Con trỏ đến chuỗi BSTR cần giải phóng.
- Lưu ý:
-
Nếu chuỗi BSTR là NULL,
hàm sẽ không làm gì.
-
Không sử dụng hàm này để giải phóng các kiểu chuỗi khác ngoài BSTR.
- Ví dụ:
BSTR bstr = SysAllocString(L"Hello, COM!"); if (bstr != NULL) { // Sử dụng bstr } SysFreeString(bstr); // Giải phóng sau khi sử dụng
Trong phân tích mã độc:
Nếu mã độc không giải phóng chuỗi, có thể dẫn đến rò rỉ bộ nhớ, nhưng cũng có trường hợp cố tình làm vậy để giữ chuỗi độc hại trong bộ nhớ lâu hơn.
3. VariantInit
Hàm VariantInit được sử dụng để khởi tạo một biến kiểu VARIANT. Biến
VARIANT là một kiểu dữ liệu đa năng được sử dụng rộng rãi trong COM.
- Cú pháp:
void VariantInit(VARIANTARG *pvarg);
- Tham số:
- pvarg: Con trỏ đến biến VARIANT cần khởi tạo.
- Lưu ý:
-
Hàm này đặt giá trị mặc định cho biến VARIANT và đặt kiểu của nó là
VT_EMPTY.
- Sau khi sử dụng biến VARIANT, bạn cần giải phóng bằng hàm VariantClear.
- Ví dụ:
VARIANT var; VariantInit(&var); // Khởi tạo biến VARIANT var.vt = VT_BSTR; var.bstrVal = SysAllocString(L"Hello, VARIANT!"); VariantClear(&var); // Giải phóng
Trong phân tích mã độc:
- Hàm này có thể xuất hiện khi mã độc sử dụng các đối tượng COM hoặc các hàm tự động hóa OLE.
- Kiểm tra dữ liệu được lưu trong biến VARIANT có thể cho thấy các dữ liệu đáng ngờ.
4. CoCreateInstance
Hàm CoCreateInstance được sử dụng để tạo một đối tượng COM.
- Cú pháp:
HRESULT CoCreateInstance( REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID *ppv );
- Tham số:
-
rclsid: CLSID của đối
tượng COM cần tạo.
-
pUnkOuter: Con trỏ đến
đối tượng ngoài trong trường hợp "aggregation" (nếu không, truyền
NULL).
-
dwClsContext: Ngữ cảnh
(ví dụ:
CLSCTX_INPROC_SERVER
cho DLL,
CLSCTX_LOCAL_SERVER cho
EXE).
-
riid: Interface ID mà
bạn muốn nhận.
- ppv: Con trỏ để nhận đối tượng COM mới tạo.
- Trả về:
-
S_OK: Thành công.
- Mã lỗi HRESULT khác nếu thất bại.
- Ví dụ:
IUnknown* pUnknown = NULL; HRESULT hr = CoCreateInstance(CLSID_SomeCOMObject, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pUnknown); if (SUCCEEDED(hr)) { // Sử dụng pUnknown pUnknown->Release(); // Giải phóng đối tượng COM }
Trong phân tích mã độc:
- Đây là một hàm quan trọng, thường bị lạm dụng bởi mã độc để truy cập các thành phần hệ thống như WMI, Shell.Application, hoặc các API quản lý file.
- Các CLSID hoặc IID đáng ngờ có thể tiết lộ hành vi độc hại.
5. OleInitialize
- Cú pháp:
HRESULT OleInitialize(LPVOID pvReserved);
- Tham số:
- pvReserved: Luôn đặt là NULL.
- Trả về:
-
S_OK nếu thành
công.
-
S_FALSE nếu OLE đã được
khởi tạo trước đó.
- Mã lỗi HRESULT khác nếu thất bại.
- Lưu ý:
- Khi không cần sử dụng nữa, bạn phải gọi OleUninitialize.
- Ví dụ:
HRESULT hr = OleInitialize(NULL); if (SUCCEEDED(hr)) { // Sử dụng OLE OleUninitialize(); // Hủy khởi tạo }
Trong phân tích mã độc:
- Hàm này có thể xuất hiện khi mã độc chuẩn bị thao tác với OLE hoặc tự động hóa COM.
- Thường được kết hợp với CoCreateInstance hoặc các API khác.
6. OleUninitialize
Hàm OleUninitialize được sử dụng để dọn dẹp và hủy khởi tạo thư viện
OLE.
- Cú pháp:
void OleUninitialize();
- Lưu ý:
-
Phải gọi hàm này khi không cần sử dụng OLE nữa.
- Hàm này đối ứng với OleInitialize.
- Ví dụ:
OleInitialize(NULL); // Sử dụng OLE OleUninitialize(); // Hủy khởi tạo sau khi sử dụng
Trong phân tích mã độc:
- Có thể không được gọi trong mã độc, vì kẻ tấn công không quan tâm đến việc giải phóng tài nguyên.
- Việc bỏ qua bước này có thể dẫn đến hành vi bất thường trong quá trình phân tích.
Tóm tắt ngắn gọn:
Hàm | Mô tả |
---|---|
SysAllocString | Cấp phát bộ nhớ và tạo chuỗi kiểu BSTR. |
SysFreeString | Giải phóng bộ nhớ của chuỗi BSTR. |
VariantInit | Khởi tạo một biến kiểu VARIANT. |
CoCreateInstance | Tạo một đối tượng COM dựa trên CLSID và IID. |
OleInitialize | Khởi tạo thư viện OLE trước khi sử dụng các chức năng liên quan. |
OleUninitialize | Hủy khởi tạo thư viện OLE khi không cần sử dụng nữa. |
Các hàm này là nền tảng của lập trình COM trong Windows và được sử dụng rộng rãi khi xây dựng hoặc tương tác với các ứng dụng COM hoặc OLE.
4.3 Sử dụng IDA Pro
4.3.1 Kiểm tra các hàm Import
- ole32.dll: Thư viện này gồm các hàm liên quan đến COM (Component Object Model) (ví dụ: OleInitialize, CoCreateInstance, OleUninitialize). Đây là dấu hiệu quan trọng cho thấy mã độc sử dụng COM.
- oleaut32.dll: Thư viện này gồm các hàm hỗ trợ cho OLE và COM (ví dụ: VariantInit).
4.3.2 Phân tích hàm main
Nhấn phím Space để chuyển sang chế độ Graph của hàm main:
Tiếp theo vào menu View | Graphs | Flow chart để xem chở chế độ
Flow chart của hàm:
Phân
tích
chức năng chính của hàm
main:
a. Khởi tạo COM:
- Hàm OleInitialize được gọi ở đầu hàm để khởi tạo môi trường COM (Component Object Model). Điều này gợi ý rằng chương trình có thể sử dụng các đối tượng COM để thực hiện các tác vụ.
- Nếu thất bại (trả về giá trị khác 0), chương trình sẽ nhảy tới nhãn loc_401085 để kết thúc.
b. Tạo một đối tượng COM:
- Lời gọi hàm CoCreateInstance được sử dụng để tạo một đối tượng COM, hàm CoCreateInstance có 5 tham số được đẩy vào stack:
-
rclsid: Class ID của đối tượng cần tạo.
-
pUnkOuter: Giá trị NULL (đối tượng không thuộc đối tượng bao bọc khác).
-
dwClsContext: Giá trị
4
(CLSCTX_INPROC_SERVER), cho biết đối tượng sẽ được
tạo trong quy trình hiện tại.
-
riid: ID giao diện của đối tượng.
- ppv: Con trỏ đến con trỏ void sẽ nhận địa chỉ của đối tượng mới tạo.
-
Nếu đối tượng COM không được tạo thành công (giá trị trả về khác 0), chương trình sẽ nhảy đến loc_40107F để giải phóng tài nguyên.
c. Xử lý chuỗi và URL:
- VariantInit: Được sử dụng để khởi tạo biến kiểu VARIANT, một kiểu dữ liệu được dùng trong COM.
- SysAllocString: Phân bổ chuỗi BSTR - Binary String hoặc Basic String (chuỗi được sử dụng trong môi trường COM).
-
Một URL
(http://www.malwareanalysisbook.com/ad.htm
) được truyền vào và xử lý.
d. Gọi phương thức COM:
-
Một phương thức của đối tượng COM được gọi thông qua con trỏ đối tượng
tại địa chỉ
[edx+2Ch].
e. Giải phóng tài nguyên:
- SysFreeString: Chuỗi BSTR được giải phóng sau khi sử dụng.
-
OleUninitialize: Giải phóng môi trường COM trước khi kết thúc chương trình.
f. Kết thúc chương trình:
-
Hàm thực hiện dọn dẹp stack và trả về.
Kết luận về chức năng của hàm main:
- Khởi tạo môi trường COM (Component Object Model) để làm việc với các đối
tượng COM thông qua
hàm OleInitialize.
- Tạo và khởi tạo một đối tượng COM, có thể dùng
để gửi hoặc xử lý thông tin bằng cách sử dụng CoCreateInstance.
- Xử lý URL, có khả năng thực hiện một số tác vụ
với URL được cung cấp (có thể liên quan đến việc tải dữ liệu từ internet).
- Giải phóng tài nguyên và kết thúc chương trình bằng cách gọi SysFreeString và OleUninitialize.
4.3.3 Phân tích csid và iid
Bấm đúp vào vị trí khoanh như ảnh chụp ở trên IDA Pro sẽ chuyển đến chi
tiết rdata
của riid
và rclsid.
Bên lề:
Trong lập trình COM (Component Object Model) của Microsoft,
rclsid và
riid là hai khái niệm
quan trọng để tạo và sử dụng các đối tượng COM. Dưới đây là giải thích về
chúng:
CLSID (Class Identifier) -
rclsid:
-
Định nghĩa: CLSID là một GUID (Globally Unique Identifier - Mã
định danh duy nhất toàn cầu) 128-bit (16 byte),
được sử dụng để định danh một lớp COM cụ thể. Có thể hiểu nó như
là "tên" của một lớp đối tượng COM.
-
Vai trò: Khi bạn muốn tạo một đối tượng COM, bạn cần biết CLSID
của lớp mà bạn muốn tạo. CLSID cho phép hệ thống tìm thấy và tải đúng mã
(DLL hoặc EXE) chứa việc triển khai của lớp đó.
-
Ví dụ: CLSID của Internet Explorer là
{0002DF01-0000-0000-C000-000000000046}. Khi một chương trình muốn tạo một instance (thể hiện) của Internet
Explorer thông qua COM, nó sẽ sử dụng CLSID này.
-
Lưu trữ: CLSID thường được lưu trữ trong Registry của Windows
dưới khóa
HKEY_CLASSES_ROOT\CLSID.
IID (Interface Identifier) -
riid:
-
Định nghĩa: IID cũng là một GUID 128-bit
(16 byte), được sử dụng để định danh một
giao diện COM cụ thể. Một giao diện định nghĩa một tập hợp các
phương thức mà một đối tượng COM hỗ trợ.
-
Vai trò: Một lớp COM có thể triển khai nhiều giao diện. IID cho
phép client (chương trình sử dụng COM) yêu cầu một giao diện cụ thể từ
đối tượng. Điều này cho phép tính đa hình và khả năng mở rộng trong
COM.
-
Ví dụ: Giao diện
IWebBrowser2 (một giao
diện được Internet Explorer triển khai) có một IID riêng. Khi một chương
trình muốn sử dụng các chức năng duyệt web cơ bản của Internet Explorer
thông qua COM, nó sẽ yêu cầu giao diện
IWebBrowser2 bằng IID
của nó.
-
Lưu trữ: IID cũng thường được lưu trữ trong Registry của Windows, thường
là dưới khóa
HKEY_CLASSES_ROOT\Interface.
Ví dụ minh họa:
Ví dụ 1
Hãy tưởng tượng bạn có một chiếc TV (lớp - CLSID). Chiếc TV này có thể
được điều khiển bằng nhiều cách khác nhau (giao diện - IID):
-
Điều khiển từ xa (IID_RemoteControl): Cho phép bạn bật/tắt TV,
thay đổi kênh, âm lượng.
-
Bảng điều khiển trên TV (IID_PanelControl): Cho phép bạn điều
khiển bằng các nút bấm trực tiếp trên TV.
-
Điều khiển bằng giọng nói (IID_VoiceControl): Cho phép bạn điều
khiển TV bằng giọng nói.
CLSID của chiếc TV sẽ xác định loại TV đó (ví dụ: TV Samsung Model XYZ).
IID sẽ xác định cách bạn tương tác với TV. Bạn có thể sử dụng điều khiển
từ xa (IID_RemoteControl), hoặc bạn có thể sử dụng bảng điều khiển trên TV
(IID_PanelControl), tùy thuộc vào nhu cầu và khả năng của bạn.
Ví dụ 2
Bạn muốn mua một món đồ chơi (đối tượng COM).
-
rclsid
(CLSID) giống như tên của cửa hàng đồ chơi: Nó cho biết bạn cần
đến cửa hàng nào để mua món đồ chơi đó. Ví dụ: "Cửa hàng đồ chơi ABC",
"Siêu thị đồ chơi XYZ". Mỗi cửa hàng có một tên riêng để phân biệt.
-
riid
(IID) giống như loại đồ chơi bạn muốn mua trong cửa hàng đó: Ví
dụ: "Xe ô tô điều khiển từ xa", "Búp bê Barbie", "Bộ xếp hình Lego".
Trong một cửa hàng, có thể có nhiều loại đồ chơi khác nhau.
Tóm lại:
-
rclsid (CLSID) định
danh một lớp COM.
-
riid (IID) định danh
một giao diện COM.
-
Cả hai đều là GUID và được sử dụng cùng nhau để tạo và sử dụng các đối
tượng COM.
Như vậy căn cứ vào ảnh chụp hiển thị rdata của riid và rclsid ở phía trên thì có thể hiểu đoạn mã đó như sau:
rclsid IID <2DF01h, 0, 0, <0C0h, 0, 0, 0, 0, 0, 0, 46h>>
- 2DF01h: Phần đầu tiên (DWORD) là 0x0002DF01.
- 0: Phần thứ hai (WORD) là 0x0000.
- 0: Phần thứ ba (WORD) là 0x0000.
- <0C0h, 0, 0, 0, 0, 0, 0, 46h>: Phần cuối cùng (8 byte) là 0xC0 0x00 0x00 0x00 0x00 0x00 0x00 0x46.
riid IID <0D30C1661h, 0CDAFh, 11D0h, <8Ah, 3Eh, 0, 0C0h, 4Fh, 0C9h, 0E2h, 6Eh>>
- 0D30C1661h: Phần đầu tiên (DWORD) là 0xD30C1661.
- 0CDAFh: Phần thứ hai (WORD) là 0xCDAF.
- 11D0h: Phần thứ ba (WORD) là 0x11D0.
- <8Ah, 3Eh, 0, 0C0h, 4Fh, 0C9h, 0E2h, 6Eh>: Phần cuối cùng (8 byte) là 0x8A 0x3E 0x00 0xC0 0x4F 0xC9 0xE2 0x6E.
Đoạn mã này định nghĩa CLSID của Internet Explorer và IID của giao diện IWebBrowser2. Sự hiện diện của nó trong mã độc là một dấu hiệu mạnh mẽ cho thấy mã độc đang lợi dụng Internet Explorer cho các mục đích xấu.
Bên lề:
Giải thích thêm về cách biểu diễn một IID (Interface Identifier)
trong IDA Pro để tránh nhầm lẫn. Lấy ví dụ biểu diễn này:
IID <2DF01h, 0, 0, <0C0h, 0, 0, 0, 0, 0, 0, 46h>>
Giải thích chi tiết:
- IID: Đây là từ khóa cho biết đây là một Interface Identifier. IID là một loại GUID (Globally Unique Identifier) được sử dụng để xác định duy nhất một interface COM (Component Object Model).
- <2DF01h, 0, 0, <0C0h, 0, 0, 0, 0, 0, 0, 46h>>: Đây là cách IDA Pro (hoặc một số công cụ khác) biểu diễn các thành phần của cấu trúc GUID (hoặc IID). Cấu trúc GUID được định nghĩa như sau trong C/C++:
C++ typedef struct _GUID { DWORD Data1; WORD Data2; WORD Data3; BYTE Data4[8]; } GUID;
Trong biểu diễn của ví dụ này thì:
- 2DF01h: Đây là giá trị của Data1 (DWORD - 4 byte tương đương 32bit). Chữ h ở cuối cho biết đây là giá trị hex.
- 0: Đây là giá trị của Data2 (WORD - 2 byte tương đương 16 bit).
- 0: Đây là giá trị của Data3 (WORD - 2 byte tương đương 16 bit).
- <0C0h, 0, 0, 0, 0, 0, 0, 46h>: Đây là giá trị của Data4 (mảng 8 byte). Các giá trị được liệt kê theo thứ tự byte.
Chuyển đổi sang định dạng GUID chuẩn:
Để chuyển đổi biểu diễn trên sang định dạng GUID chuẩn
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, bạn cần thực hiện các bước sau:
1. Đảo ngược thứ tự byte trong
Data1,
Data2, và
Data3: Đây là do kiến trúc little-endian phổ biến trên Windows.
- 2DF01h (01 DF 02 00) trở thành 0002DF01
- 0 trở thành 0000
- 0 trở thành 0000
2. Giữ nguyên thứ tự byte trong
Data4:
- 0C0h, 0, 0, 0, 0, 0, 0, 46h trở thành C000000000000046
3. Kết hợp các phần và thêm dấu gạch ngang:
- 0002DF01-0000-0000-C000-000000000046
Kết quả:
Dựa trên các phần đã phân tích ở trên, IID này sẽ được biểu diễn tương
ứng như sau:
IID | <2DF01h, 0, 0, <0C0h, 0, 0, 0, 0, 0, 0, 46h>> |
---|---|
GUID | {0002DF01-0000-0000-C000-000000000046} |
Định dạng GUID | {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} |
Đây chính là CLSID của Internet Explorer.
- CLSID nằm trong \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID.
- IID nằm trong \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface{IID}
Bên lề:
4.3.4 Xác định chi tiết hàm call dword ptr [edx+2Ch]
Lệnh call dword ptr [edx+2Ch]
khác với các hàm được định nghĩa rõ ràng trong mã nguồn. Lý do chính
là:
- Địa chỉ tính toán động: Địa chỉ của hàm không được xác định rõ ràng mà được tính toán tại thời điểm thực thi dựa trên giá trị của thanh ghi edx và offset 2Ch. Điều này khiến IDA Pro khó xác định chính xác hàm này là gì.
- Có thể là một con trỏ đến một hàm trong thư viện động: Địa chỉ này có thể trỏ đến một hàm nằm trong một thư viện động (DLL), và IDA Pro có thể chưa có thông tin về các hàm trong thư viện đó.
-
Hàm có thể được mã hóa hoặc obfuscated:
Mã của hàm có thể được mã hóa hoặc làm khó hiểu để ngăn cản việc phân
tích.
Do đó, để phân tích chi tiết hơn, chúng ta sử dụng chức năng structures trong IDA Pro.
Sử dụng Structures trong IDA Pro để phân tích:
Structures
là một công cụ mạnh mẽ trong IDA Pro giúp bạn tạo các cấu trúc dữ liệu tùy
chỉnh để mô tả các vùng nhớ trong chương trình. Bằng cách tạo một cấu trúc
phù hợp, bạn có thể:
- Hiểu rõ hơn về dữ liệu: Biết được các thành phần của một cấu trúc dữ liệu, mối quan hệ giữa các thành phần đó.
- Dễ dàng truy cập các thành phần: Bạn có thể truy cập trực tiếp đến các thành phần của cấu trúc bằng tên thay vì phải tính toán offset.
-
Tìm kiếm các mẫu:
Bạn có thể tìm kiếm các cấu trúc tương tự trong toàn bộ chương
trình.
Các bước sử dụng Structures:
1. Đặt con trỏ
Đặt con trỏ tại vị trí của lệnh call dword ptr [edx+2Ch].
2.
Mở cửa sổ Structures
Chọn menu View | Open subviews | Structures (hoặc nhấn Shift+F9).
Cửa sổ Structures mở ra.
3. Thêm kiểu cấu trúc (Structure Type
- Chọn menu Edit | Add stuct type... (hoặc nhấn phím Insert).
- Hộp thoại Create structure/union xuất hiện.
4. Thêm cấu trúc chuẩn (Standard Structure):
Trong hộp thoại Create structure/union:
- Click vào nút Add standard structure.
- Tìm kiếm và chọn IwebBrowser2Vtbl (có thể dùng chọn tùy chọn Search để tìm) trong danh sách các cấu trúc chuẩn.
- Nhấn OK.
5. Kiểm tra cấu trúc
6. Áp dụng cấu trúc vào lệnh gọi
Quay trở lại tab IDA View-A, tại vị trí lệnh gọi call dword ptr [edx+2Ch]:
- Nhấn chuột phải vào dòng lệnh đó.
- Chọn tùy chọn là[edx+IwebBrowser2Vtbl.Navigate]như trong ảnh chụp ở dưới. Tùy chọn này sẽ hiển thị nếu IDA đã nhận diện chính xác offset 2Ch (tức 44 byte theo hệ thập phân) tương ứng với hàm Navigate.
7. Kết quả
Sau bước trên, lệnh call
dword ptr [edx+2Ch]
đã được thay thế bằng dword ptr
[edx+IwebBrowser2Vtbl.Navigate].
Lúc này IDA Pro sẽ nhận diện dword ptr [edx+2Ch]
là một hàm có tên là Navigate.
Tóm lại sau khi dùng Cấu trúc để phân tích thì chúng ta biết được lệnh call dword ptr [edx+2Ch] sẽ gọi IWebBrowser2.
Bên lề:
Trong IWebBrowser2, phương thức Navigate được khai báo như
sau:
HRESULT Navigate( BSTR URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers );
Giải thích các tham số
-
URL
(BSTR):
-
URL mà trình duyệt sẽ điều hướng tới.
-
Đây là một chuỗi Unicode chứa địa chỉ trang web hoặc tài nguyên
(http, https, file, ftp, ...).
-
Flags
(VARIANT*):
-
Cờ điều khiển kiểu điều hướng.
-
Là một VARIANT
chứa giá trị kiểu số (VT_I4) hoặc NULL.
-
Các giá trị có thể bao gồm:
-
navOpenInNewWindow (0x1):
Mở URL trong cửa sổ trình duyệt mới.
-
navNoHistory (0x2):
Không lưu URL vào lịch sử trình duyệt.
-
navNoReadFromCache (0x4):
Không đọc nội dung từ bộ nhớ đệm.
-
navNoWriteToCache (0x8):
Không ghi nội dung vào bộ nhớ đệm.
-
TargetFrameName (VARIANT*):
-
Tên của khung (frame) mà URL sẽ được mở.
-
Nếu là NULL hoặc chuỗi rỗng (""), URL sẽ mở trong khung hiện tại.
-
Nếu là " _blank", URL sẽ mở trong cửa sổ hoặc tab mới.
-
PostData (VARIANT*):
-
Dữ liệu cần gửi tới URL bằng phương thức HTTP POST.
-
Thường là một chuỗi byte hoặc dữ liệu nhị phân.
-
Nếu không có dữ liệu, truyền NULL.
-
Headers (VARIANT*):
-
Chuỗi chứa các tiêu đề HTTP bổ sung (HTTP headers).
- Ví dụ: "Content-Type: application/x-www-form-urlencoded\r\nCustom-Header: Value\r\n".
Giá trị trả về
-
HRESULT:
-
S_OK: Thành công.
-
Các giá trị lỗi khác: Lỗi cụ thể xảy ra trong quá trình thực thi.
Trả lời Câu hỏi
2. Mục đích của chương trình này là gì?
Tạo một đối tượng COM và sử dụng phương thức Navigate để kết nối đến http://www.malwareanalysisbook.com/ad.html.
3. Khi nào chương trình này sẽ thực hiện xong?
Chương trình sẽ hoàn thành sau khi kết nối đến URL http://www.malwareanalysisbook.com/ad.html
bằng Internet Explorer và hiển thị trang web.
Tổng kết bài Lab07-02.exe
Phương thức Navigate trong mã độc là một cách mà các tác giả mã độc sử
dụng để tự động điều hướng trình duyệt web hoặc thực thi các hành động liên
quan đến trình duyệt mà không cần tương tác trực tiếp từ người dùng. Phương
thức này thường được khai thác thông qua giao diện IWebBrowser2 của COM
(Component Object Model) để thao tác với Internet Explorer (hoặc các thành
phần tương tự).
Trong mã độc, phương thức Navigate được sử dụng để:
1. Tự động điều hướng đến các trang web độc hại:
-
Dẫn người dùng đến các trang phishing (giả mạo) để lấy cắp thông tin
nhạy cảm như tài khoản ngân hàng, mật khẩu, hoặc thông tin cá nhân.
-
Mở trang chứa mã khai thác lỗ hổng (exploit kits) để cài đặt thêm mã độc vào
hệ thống nạn nhân.
2. Tải nội dung hoặc payload độc hại:
-
Navigate có thể được sử dụng để tải xuống các tệp thực thi độc hại hoặc các
file script từ server điều khiển (Command and Control - C2).
-
Gửi dữ liệu nhạy cảm hoặc thông tin thu thập được từ nạn nhân về server điều
khiển.
3. Che giấu hoạt động độc hại:
-
Thay vì hiển thị cửa sổ trình duyệt rõ ràng, mã độc có thể chạy trình duyệt
ở chế độ ẩn và sử dụng Navigate để thực thi các hành động trong nền.
-
Ví dụ: Điều hướng đến quảng cáo để thực hiện click fraud (lừa đảo
quảng cáo).
4. Thực hiện các cuộc tấn công mạng tự động:
-
Điều hướng đến các URL có chứa tham số tấn công nhằm khai thác các dịch vụ
web hoặc API (ví dụ: SQL injection, Cross-Site Scripting - XSS).
- Tự động gửi yêu cầu POST hoặc GET chứa mã độc.
Bên lề:
Phân tích mã độc sử dụng Navigate trong IDA Pro đòi hỏi hiểu cách mã độc tương tác với IWebBrowser2 thông qua bảng VTable để thực hiện các hành vi độc hại như tải xuống payload, truyền thông dữ liệu hoặc mở trang web độc hại. Dưới đây là hướng dẫn chi tiết về cách phân tích mã độc có sử dụng Navigate trong IDA Pro.
1. Hiểu về hàm
Navigate
trong ngữ cảnh mã độc
-
Navigate
là một phương thức của giao diện
IWebBrowser2, được sử dụng để điều hướng đến một URL hoặc gửi yêu cầu HTTP.
-
Trong mã độc, phương thức này thường được sử dụng để:
-
Tải xuống payload từ máy chủ điều khiển (C2 server).
-
Gửi dữ liệu đánh cắp (sử dụng POST request).
- Điều hướng nạn nhân đến trang web độc hại (phishing, drive-by download).
2. Quy trình phân tích mã độc có hàm
Navigate
trong IDA Pro
2.1. Bước 1: Tìm kiếm dấu hiệu của COM
Mã độc sử dụng
Navigate
phải khởi tạo đối tượng IWebBrowser2. Điều này thường được thực hiện
thông qua API COM, cụ thể là
CoCreateInstance. Vì vậy, bạn cần:
-
Tìm lời gọi đến CoCreateInstance:
-
Trong cửa sổ Imports, tìm
CoCreateInstance.
-
Nếu mã độc không sử dụng API Imports trực tiếp, bạn có thể tìm các lời
gọi gián tiếp thông qua assembly (VD:
call eax
hoặc
call edx).
-
Kiểm tra CLSID và IID được sử dụng:
-
CLSID của IWebBrowser2:
{0002DF01-0000-0000-C000-000000000046}
-
IID của IWebBrowser2:
{D30C1661-CDAF-11D0-8A3E-00C04FC9E26E}
Ví dụ trong assembly:
push offset IID_IWebBrowser2 ; IID của IWebBrowser2 push offset CLSID_InternetExplorer ; CLSID của Internet Explorer push 0 push 1
2.2. Bước 2: Xác định bảng VTable
-
Sau khi khởi tạo, đối tượng COM sẽ trỏ đến bảng VTable. Bạn có thể
xác định điều này bằng cách theo dõi con trỏ đối tượng (ecx, esi, hoặc
eax).
-
VTable chứa con trỏ hàm của các phương thức COM, trong đó
Navigate
thường nằm ở offset
0x28
(40 bytes).
Trong IDA, bạn sẽ thấy các lệnh tương tự:
mov eax, [ecx] ; Lấy con trỏ VTable từ đối tượng IWebBrowser2 mov edx, [eax+28h] ; Lấy hàm Navigate từ offset 0x28 call edx ; Gọi hàm Navigate
2.3. Bước 3: Phân tích lời gọi
Navigate
Khi gọi
Navigate, các tham số được đẩy vào stack theo thứ tự sau:
-
Headers (tùy chọn): Tiêu đề HTTP bổ sung.
-
PostData (tùy chọn): Dữ liệu POST gửi đến máy chủ.
-
TargetFrameName (tùy chọn): Frame mục tiêu hoặc NULL.
-
Flags (tùy chọn): Các cờ điều khiển hành vi điều hướng.
-
URL: Chuỗi chứa địa chỉ URL cần điều hướng.
Ví dụ trong assembly:
push offset Headers ; HTTP Headers push offset PostData ; POST Data push 0 ; TargetFrameName = NULL push 0 ; Flags = 0 push offset URL ; URL để điều hướng mov ecx, pIWebBrowser2 ; Đối tượng IWebBrowser2 call edx ; Gọi hàm Navigate
2.4. Bước 4: Xác định tham số URL và POST
- Tìm tham số URL:
-
Trong cửa sổ Strings (Shift+F12), tìm kiếm các chuỗi URL
khả nghi.
-
Dò ngược từ nơi chuỗi được tham chiếu để xác định nó được đẩy vào stack
ở đâu.
Ví dụ:
push offset URL ; URL = "http://malicious.com"
- Tìm tham số POST:
-
Nếu có dữ liệu POST, nó thường là một mảng byte (hoặc cấu trúc dữ liệu)
được chuẩn bị trước khi gọi
Navigate.
-
Kiểm tra bộ nhớ nơi dữ liệu này được khởi tạo hoặc chỉnh sửa.
- Headers (nếu có):
- Tương tự, kiểm tra các tham số Headers nếu được sử dụng.
2.5. Bước 5: Phân tích hành vi của mã độc
Khi bạn đã xác định lời gọi
Navigate
và các tham số, bạn cần phân tích hành vi mã độc:
-
URL: Kiểm tra URL độc hại để xem nó trỏ đến tài nguyên gì (phishing
site, C2 server...).
-
PostData: Phân tích dữ liệu POST để xác định xem mã độc gửi thông
tin gì (như thông tin đăng nhập, dữ liệu đánh cắp).
- Headers: Kiểm tra xem mã độc có sử dụng headers đặc biệt để ngụy trang hay không.
3.1. Đoạn mã giả lập trong IDA Pro
.text:00401100 mov eax, [ecx] .text:00401102 mov edx, [eax+28h] ; Offset 0x28: Navigate .text:00401105 push offset Headers ; HTTP Headers .text:0040110A push offset PostData ; POST Data .text:0040110F push 0 ; TargetFrameName = NULL .text:00401111 push 0 ; Flags = 0 .text:00401113 push offset URL ; URL = "http://malicious.com" .text:00401118 mov ecx, [esi+8] ; IWebBrowser2 object .text:0040111B call edx ; Call Navigate
3.2. Phân tích mã độc
- URL:
-
"http://malicious.com": Máy chủ C2 của mã độc.
-
URL này có thể chứa payload hoặc trang phishing.
- POST Data:
-
Nếu có dữ liệu POST, mã độc có thể đang gửi thông tin nhạy cảm (như mật
khẩu, cookie).
- Headers:
- Headers có thể chứa chuỗi User-Agent giả mạo.
- Wireshark:
-
Phân tích lưu lượng mạng để xem kết nối đến URL độc hại.
- x64dbg/OllyDbg:
-
Đặt breakpoint tại lời gọi
Navigate
hoặc
CoCreateInstance
để phân tích runtime.
- VirusTotal/Any.Run:
- Phân tích URL độc hại.
- Dynamic Analysis:
-
Chạy mã độc trong môi trường sandbox để kiểm tra hành vi mạng thực
tế.
- Code Injection:
- Một số mã độc sử dụng Code Injection để nhúng lời gọi Navigate vào một tiến trình khác.
-
Navigate trong IWebBrowser2 thường được sử dụng bởi mã độc
để giao tiếp với máy chủ điều khiển.
-
Trong IDA Pro, phân tích tập trung vào:
-
Lời gọi
CoCreateInstance
để khởi tạo COM.
-
Offset 0x28 trong VTable của IWebBrowser2.
- Tham số URL, POST Data, và Headers.
- Sử dụng công cụ bổ sung như Wireshark hoặc sandbox để phân tích hành vi runtime.