# Chapter 4: Enumerating Operating System Artifacts

Chương này sẽ được hướng dẫn về các kỹ thuật trích xuất tên người dùng, tên máy, tài nguyên mạng, chia sẻ và dịch vụ từ một hệ thống và giải thích cách phần mềm độc hại có thể sử dụng thông tin mà nó thu thập để xác định môi trường phân tích hoặc mục tiêu không phù hợp.&#x20;

## 4.1 Processes

Phần mềm độc hại có thể sử dụng các kỹ thuật enumeration để phát hiện VM và sandbox, đồng thời hiểu rõ hơn về môi trường hoạt động của nó. Các hàm API windows chính mà phần mềm độc hại có thể sử dụng để enumeration các process là `CreateToolhelp32Snapshot` , `Process32First` và `Process32Next`. Đoạn trích mẫu phần mềm độc hại dưới đây trích xuất các quy trình đang chạy trên máy chủ để tìm quy trình mục tiêu `VboxTray.exe`, một quy trình phổ biến trong một số VM VirtualBox:

```nasm
call CreateToolhelp32Snapshot //1
--snip--
loc_2:
lea ecx, [esp+peInfo]

push ecx           // Pointer to buffer (peInfo) //2
push eax           // Handle to snapshot
call Process32First

test [esp+peInfo.szExeFile], vboxtray_process_name //3
jz loc_3
--snip--
loc_3:
lea ecx, [esp+peInfo]

push ecx           // Pointer to buffer (peInfo) //4
push eax           // Handle to snapshot
call Process32Next
test [esp+peInfo.szExeFile], vboxtray_process_name

jz loc_3           // Loop //5
```

Hàm `CreateToolhelp32Snapshot` tạo một snapshot các quy trình đang chạy trên máy chủ của nạn nhân và trả về một handle cho nó (1). Handle này được đẩy lên ngăn xếp, cùng với một con trỏ đến bộ đệm `peInfo`, sẽ lưu trữ đầu ra của hàm `Process32First` (2). `Process32First` xuất thông tin về quy trình đầu tiên đang chạy trên host, `peInfo.szExeFile`. Sau khi gọi `Process32First`, phần mềm độc hại so sánh `peInfo.szExeFile` với biến `vboxtray_process_name`, trước đó đã được định nghĩa là `VboxTray.exe` (3). (việc gán biến này không được hiển thị trong đoạn mã).

Nếu tên quy trình không khớp, chương trình sẽ nhảy đến vùng mã tiếp theo.

Cả con trỏ đến bộ đệm và handle của snapshot lại được đẩy vào ngăn xếp để chuẩn bị cho hàm tiếp theo là `Process32Next` (4), hàm này thực hiện chính xác điều tương tự như `Process32First` nhưng sẽ lặp lại trên các quy trình còn lại đang chạy trên host. Sau khi quy trình tiếp theo được trích xuất và lưu trữ trong bộ đệm, phần mềm độc hại thực hiện một so sánh khác với biến `vboxtray_process_name`. Lần này nếu tên không khớp, mã sẽ lặp lại để thực thi lại `Process32Next`, lặp lại cho đến khi nó trích xuất tất cả các quy trình hoặc tìm thấy quy trình mục tiêu (5).

Nếu chúng ta đang phân tích phần mềm độc hại và phát hiện nó trích xuất danh sách quy trình và kiểm tra tên quy trình cụ thể như `VboxTray.exe` hoặc `Vmtoolsd.exe`, thì điều đó sẽ là một red flag.&#x20;

Dưới đây là một tên quy trình liên quan đến VM phổ biến mà phần mềm độc hại có thể nhắm tới:

* **VMware**  \
  • `TPAutoConnSvc.exe`  \
  • `VGAuthService.exe`  \
  • `VMwareService.exe`  \
  • `Vm3dservice.exe`  \
  • `Vmtoolsd.exe`  \
  • `Vmwaretray.exe`  \
  • `Vmwareuser.exe`
* **VirtualBox**  \
  • `VboxControl.exe`  \
  • `VBoxService.exe`  \
  • `VboxTray.exe`

Một số phần mềm độc hại cũng tìm kiếm các công cụ phân tích phần mềm độc hại điển hình (chẳng hạn như *Procmon*, *Wireshark*, *Process Explorer* và *Fiddler*), có thể đang chạy trên máy trạm của nhà phân tích tại thời điểm kích hoạt.&#x20;

Nếu phần mềm độc hại tìm thấy bất kỳ quy trình ví dụ nào dưới đây đang chạy trên hệ thống, nó có thể quyết định tự chấm dứt hoặc thực hiện các hành động lẩn tránh khác:

* `autoruns.exe`
* `fiddler.exe`
* `ollydbg.exe`
* `procexp.exe`
* `procmon.exe`
* `tcpview.exe`
* `wireshark.exe`
* `x64dbg.exe`

Thông thường, ta có thể cần đổi tên tệp thực thi cho các công cụ này trước khi chạy quy trình. Ví dụ đổi tên `procmon.exe` thành `nomcorp.exe` có thể tránh được các kiểm tra phần mềm độc hại cơ bản. Tuy nhiên, thủ thuật này sẽ không hiệu quả đối với phần mềm độc hại xem xét thanh tiêu đề cửa sổ.

Khi trích xuất và tìm kiếm các tên quy trình cụ thể, một số phần mềm độc hại sẽ sử dụng hashed name thay vì các chuỗi văn bản thuần túy để mục tiêu của nó sẽ không dễ dàng hiển nhiên đối với nhà phân tích phần mềm độc hại.

Ví dụ: tổng băm MD5 của tên quy trình `fiddler.exe` là `447c259d51c2d1cd320e71e6390b8495`, vì vậy nếu đạng gỡ lỗi một mẫu phần mềm độc hại cụ thể hoặc kiểm tra nó trong một trình disassembler, bạn có thể nhận thấy chuỗi `447c259d51c2d1cd320e71e6390b8495` thay vì `fiddler.exe`. Bạn có thể thấy điều này sẽ làm chậm quá trình phân tích như thế nào và có thể gây khó khăn cho một nhà phân tích thiếu kinh nghiệm.

Luôn nhận thức được khả năng hashing của các phần mềm độc hại. Điều này không chỉ đúng với các quy trình mà còn với các tên tệp, dịch vụ và các chuỗi khác mà phần mềm độc hại có thể đang tìm kiếm.

## 4.2 Directories and Files

Trích xuất các thư mục và tệp là một kỹ thuật khác mà phần mềm độc hại có thể sử dụng để phát hiện sandbox và VM. Phần mềm độc hại có thể tìm kiếm các tệp và thư mục cụ thể được liên kết với phần mềm hypervisor (chẳng hạn như VMware Workstation và VirtualBox) hoặc với các sandbox phần mềm độc hại tự động (như Cuckoo).

Đoạn mã sau đây cho thấy một mẫu phần mềm độc hại gọi `FindFirstFile` với `C:\Windows\System32\drivers\vm*` làm mục tiêu. Mẫu này đang tìm kiếm thư mục trình điều khiển Windows cho bất kỳ tệp drivers nào có tiền tố vm, đây là một mẫu phổ biến cho các tệp VMware Workstation driver:

```nasm
call FindFirstFileW
test [ebp+FindFileData.cFileName], fileName ; "C:\Windows\System32\drivers\vm*"
jz loc_2
--snip--

loc_2:
--snip--
call FindNextFileW
test [ebp+FindFileData.cFileName], fileName
jz loc_2
```

Sau lệnh gọi đến `FindFirstFile`, lệnh test so sánh giá trị của tên tệp được trả về với `C:\Windows\System32\drivers\vm*`. Nếu kết quả của lệnh `test` là 0 (nghĩa là không có kết quả phù hợp), mã sẽ nhảy đến `loc_2`, chứa lệnh gọi hàm tiếp theo, `FindNextFile`. `FindNextFile` thực thi và lệnh `test` tương tự so sánh tên tệp. Nếu lệnh `test` trả về 0, chương trình sẽ nhảy đến loc\_2 một lần nữa. `FindNextFile` sẽ tiếp tục thực thi cho đến khi có một kết quả phù hợp hoặc không còn tệp nào nữa.

Mặc dù trích xuất tệp trong phần mềm độc hại là rất phổ biến vì nhiều lý do, sự hiện diện của `FindFistFile` và `FindNextFile` có thể có nghĩa là phần mềm độc hại có thể đang cố gắng phát hiện một môi trường phân tích. Các đường dẫn tệp và thư mục *VMware Workstation* và *VirtualBox* mà phần mềm độc hại có thể nhắm mục tiêu bao gồm:

**Tệp VMware**

* `C:\Windows\System32\drivers\vm*`
* `C:\Windows\System32\vm*`
* `C:\Windows\SysWOW64\vm*`

**Thư mục VMware**

* `C:\Program Files\VMware\`
* `C:\Program Files\Common Files\VMware\`

**Tệp VirtualBox**

* `C:\Windows\System32\VBox*`
* `C:\Windows\System32\drivers\VBox*`

**Thư mục VirtualBox**

* `C:\Program Files\Oracle\VirtualBox Guest Additions\`

Tương tự như VM, môi trường sandbox tự động thường chứa các thư mục và tệp cụ thể mà phần mềm độc hại có thể cho là đáng ngờ. Ví dụ: nhiều cài đặt Cuckoo chứa một số tệp lệnh và tệp như `Analyzer.py` và `analysis.conf`. Một số phiên bản Cuckoo thậm chí có thể có một thư mục có tên `cuckoo` hoặc `agent` trong đường dãn thư mục `c:\`. Hãy ghi nhớ điều này khi phân tích phần mềm độc hại lẩn tránh trong một sandbox.

Cuối cùng, phần mềm độc hại có thể sử dụng việc trích xuất thư mục và tệp để xác định môi trường hoạt động của nó và lập hồ sơ mục tiêu của nó. Ví dụ; nếu một mẫu phần mềm độc hại đang nhắm mục tiêu vào một tổ chức hoặc loại hệ thống nhất định, nó có thể trích xuất hệ thống tệp để tìm các thư mục và tệp cụ thể chứa tên công ty mục tiêu. Kiểm tra này sẽ cho phép phần mềm độc hại chỉ lây nhiễm các hệ thống trong phạm vi tấn công của nó. Một ví dụ điển hình về một hệ thống như vậy là Stuxnet, nó tìm kiếm một số tệp liên quan đến phần mềm Siemens Step7 trên host nạn nhân. Nếu các tệp này không tồn tại, hệ thống sẽ không bị nhiễm.

{% hint style="success" %}
Một số tệp và thư mục này có thể được đổi tên hoặc thậm chí bị xóa mà không ảnh hưởng đến môi trường VM.
{% endhint %}

## 4.3 Shared Folders

Để chia sẻ tệp giữa VM và hệ điều hành máy chủ, nhà phân tích có thể cấu hình các thư mục chia sẻ. Nhưng trong khi các thư mục chia sẻ cho phép dễ dàng chuyển tệp từ máy chủ sang máy khách và ngược lại, chúng cũng cung cấp cho phần mềm độc hại một manh mối khác rằng nó đang bị phân tích.

Phần mềm độc hại có thể trích xuất các thư mục chia sẻ bằng cách sử dụng hàm API Windows `WNetGetProviderName`, hàm này truy xuất thông tin tài nguyên mạng. Vì các thư mục chia sẻ VM có hiệu quả là tài nguyên mạng, nên việc gọi hàm này trên một Vm *VirtualBox* được cấu hình với các thư mục chia sẻ có thể trả về kết quả là "`VirtualBox Shared Folders`" chẳng hạn, đây là một dấu hiệu chết người cho thấy máy này được lưu trữ trên một hypervisor VirtualBox.

Ngoài ra, vì các thư mục chia sẻ VM hoạt động giống như ở đĩa mạng, chúng có thể được xác định thông qua các hàm truy xuất tệp và thư mục thông thường, chẳng hạn như `FindFirstFile` và `FindNextFile` đã thảo luận trước. Đường dẫn mục tiêu cho các hàm này sẽ là tên của ổ đĩa mạng VM. Một số tên ổ đĩa mạng phổ biến là `\\VboxSrv` và `\\vmware-host`.

## 4.4 The Registry

Windows registry chứa thông tin về phần mềm đã cài đặt, cấu hình phần cứng, mạng, cài đặt ngôn ngữ và vị trí, và nhiều điểm dữ liệu khác mà Windows sử dụng để hoạt động. Do đó phần mềm độc hại cố gắng hiểu môi trường mục tiêu và phát hiện VM hoặc sandbox thường sẽ truy vấn registry. Nó có thể truy xuất toàn bộ hive của registry và tìm kiếm các chuỗi liên quan đến VM đáng ngờ, hoặc nó có thể chỉ đơn giản là kiểm tra một vài khóa được quan tâm cụ thể. Đoạn trích code sau đây cho thấy điều này có thể trông như thế nào trong một phần mềm độc hại thực tế:"

<figure><img src="/files/ENNn9oCgEWws1rVS8Nzy" alt=""><figcaption></figcaption></figure>

Phần mềm độc hại gọi `RegOpenKey` để mở khóa cụ thể mà nó quan tâm, sau đó gọi hàm `RegEnumValue` để trích xuất tất cả các giá trị và dữ liệu nằm dưới khóa registry này. Hãy phân tích đoạn mã này chi tiết hơn một chút.

Đầu tiên, phần mềm độc hại di chuyển giá trị `lpSubKey`, đại diện cho khóa registry mà nó quan tâm, vào thanh ghi `rdx` (1). Trong trường hợp này, khóa registry đó là `HKLM:\HARDWARE\Description\System`. Giá trị trong thanh ghi rdx được sử dụng làm tham số cho lệnh tiếp theo đến `RegOpenKeyExA` (2). Tiếp theo, mã tải con trỏ đến các cấu trúc `lpData` (3) và `lpValueName` (4). Sau đó, nó gọi `RegEnumValueA` (5), hàm này lưu trữ các giá trị và dữ liệu trả về cho khóa registry `HKLM:\HARDWARE\Description\System` trong `lpValueName` và `lpData`, tương ứng.

Thông thường, malware sẽ gọi RegEnumKey nhiều lần trong một vòng lặp, vì mỗi lần lặp của RegEnumKey chỉ lưu trữ một giá trị và một mục dữ liệu.&#x20;

Cuối cùng, phần mềm độc hại so sánh giá trị nghi ngờ, `VBOX -1`, với giá trị trong bộ đệm `lpData` (6). Nếu chúng khớp nhau, phần mềm độc hại cho rằng nó đang chạy trong một máy ảo *VirtualBox* và tự kết thúc.

Phần mềm độc hại cũng có thể truy vấn các khu vực nhất định của registry để lập hồ sơ môi trường. Ví dụ, nó có thể cống gắng phát hiện nó có đang chạy trên một hệ thống máy tính của một công ty nhất định hay không để tránh vô tình lây nhiễm nhầm mục tiêu.

Trong mã dưới đây, mẫu phần mềm độc hại này đang truy vấn registry để tìm phần mềm liên quan đến mục tiêu của nó, một công ty có tên là `NewCorp`:

<figure><img src="/files/6AqiHR2ILv1UW8HDl0Ly" alt=""><figcaption></figcaption></figure>

Ví dụ này đang sử dụng hàm RegOpenKey Windows API để tìm kiếm khóa registry `HKCU\Software\NewCorp` của host's system. Nếu phần mềm độc tìm thấy khóa này, nó cho rằng nó đang chạy trên một hệ thống trong tổ chức **NewCorp**; nếu không, nó sẽ tự kết thúc.

Phần mềm độc hại cũng có thể truy vấn registry bằng các công cụ dòng lệnh Windows, chẳng hạn như `reg query`:

<figure><img src="/files/S6rOs1CysVtUzB4GULeY" alt=""><figcaption></figcaption></figure>

Lệnh này sẽ thành công nếu khóa tồn tại trên hệ thống của nạn nhân và thất bại nếu không.

Một cách cuối cùng mà phần mềm độc hại có thể try vấn registry alf sử dụng Windows Management Instrumentation (WMI), Powershell và các công cụ Windows gốc khác. Hiện tại, điểm quan trọng là có nhiều phương pháp truy vấn registry, nhưng cũng cần lưu ý rằng cả phần mềm độc hại và phần mềm vô hại đều try vấn registry vì nhiều lý do. Một try vấn không phải lúc nào cũng chỉ ra rằng phần mềm độc hại đang sử dụng lập hồ sơ hoặc trốn tránh.&#x20;

Các khóa registry mà phần mềm độc hại có thể tìm kiếm để cố gắng xác định môi trường phân tích VM bao gồm:

* **VMware Workstation**
  \*  `HKCU:\SOFTWARE\VMware, Inc.`
  * `HKLM:\SOFTWARE\Classes\Applications\VMwareHostOpen.exe`
  * `HKLM:\SOFTWARE\Classes\VMwareHostOpen.AssocFile`
  * `HKLM:\SOFTWARE\Classes\VMwareHostOpen.AssocURL`
  * `HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\VMware User Process`
  * `HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\VMware VM3DService     Process`
  * `HKLM:\SOFTWARE\RegisteredApplications\VMware Host Open`
  * `HKLM:\SOFTWARE\WOW6432Node\RegisteredApplications\VMware Host Open`
  * `HKLM:\SYSTEM\CurrentControlSet\Enum\IDE\DiskVMware_Virtual_IDE_Hard    Drive___________00000001\`
* **VirtualBox**
  * `HKLM:\HARDWARE\ACPI\DSDT\VBOX_`
  * `HKLM:\HARDWARE\ACPI\FADT\VBOX__`
  * `HKLM:\HARDWARE\ACPI\RSDT\VBOX__`
  * `HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\VBoxTray`
  * `HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Oracle VM`    \
    `VirtualBox Guest Additions`
  * `HKLM:\SOFTWARE\Oracle\VirtualBox Guest Additions`
  * `HKLM:\SYSTEM\ControlSet001\services\VBoxMouse`
  * `HKLM:\SYSTEM\ControlSet001\services\VBoxSF`
  * `HKLM:\SYSTEM\ControlSet001\services\VBoxService`
  * `HKLM:\SYSTEM\ControlSet001\services\VBoxVideo`
  * `HKLM:\SYSTEM\ControlSet001\services\VBoxGuest`
* **General**
  * `HKLM:\HARDWARE\Description\System\BIOS\SystemManufacturer`
  * `HKLM:\HARDWARE\Description\System\BIOS\SystemProductName`
  * `HKLM:\HARDWARE\Description\System\SystemBiosVersion`
  * `HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Store\Configuration\OEMID`
  * `HKLM:\SYSTEM\CurrentControlSet\Control\Class\`

Bạn có thể sử dụng côn gục `regedit.exe` trên máy ảo phân tích của bạn, bạn cso thể kiểm tra các khóa để hiểu những gì mã độc có thể tìm kiếm. Ví dụ, khi kiểm tra khóa registry `HKLM:\HARDWARE\Description\System`, bạn có thể phát hiện các giá trị đáng chú ý mà mã độc có thể sử dụng để phát hiện môi trường ảo hóa.

{% hint style="success" %}
Các khóa registry này thường có thể được đổi tên và xóa bỏ hoàn toàn để đánh lừa phần mềm độc hại và vượt qua các kỹ thuật né tránh của chúng.
{% endhint %}

## 4.4 Services

Dịch vụ là các ứng dụng thường khởi động khi hệ thống khởi động và chạy ngầm trong phiên của người dùng, và đây là cách khác mà phần mềm độc hại có thể sử dụng để nhận diện môi trường máy ảo (VM) hoặc sandbox. Một số dịch vụ là duy nhất cho một thương hiệu hypervisor nhất định, tiết lộ sự hiện diện của nó, và một số dịch vụ cũng có thể nhận diện các công cụ phân tích phần mềm độc hại đã cài đặt. Ví dụ, phần mềm độc hại có thể tìm kiếm dịch vụ VirtualBox Guest Additions, điều này chỉ ra sự hiện diện của VirtualBox.

Phần mềm độc hại có thể truy vấn các dịch vụ bằng nhiều cách. Một trong những kỹ thuật phổ biến nhất là sử dụng hàm Windows API `EnumServiceStatus` hoặc `EnumServiceStatusEx`, hàm này sẽ trả về danh sách các dịch vụ trên host và trạng thái liên quan đến chúng, thường là `running` hoặc `stopped`. Phần mềm độc hại cũng có thể sử dụng hàm OpenService để mở một handle đến một dịch vụ cụ thể. Nếu nó thu được handle thành công (nghĩa là dịch vụ tồn tại), mã trả vè sẽ là true.

Ngoài các hàm Windows API, còn có các phương pháp khác để liệt kê dịch vụ mà phần mềm độc hại có thể sử dụng. Ví dụ, phần mềm độc hại có thể sử dụng công cụ dòng lệnh Windows `sc` để try vân danh sách dịch vụ hoặc một dịch vụ cụ thể.

<figure><img src="/files/8Fx2dmV4461rPQrX6qwh" alt=""><figcaption></figcaption></figure>

Tương tự, malware có thể sử dụng công cụ dòng lệnh `wmic` để truy vấn tất cả các dịch vụ trên host.

<figure><img src="/files/OPCTEpRBX6ocxjpML8gk" alt=""><figcaption></figcaption></figure>

Cuối cùng, vì một số thông tin dịch vụ được lưu trữ trong registry, malware có thể truy vấn registry để lấy thông tin dịch vụ. Nếu bạn thấy malware sử dụng các hàm API liên quan đến dịch vụ, sử dụng các công cụ như `sc`, hoặc truy vấn registry để tìm các dịch vụ hypervisor cụ thể, mẫu này có thể đang cố gắng phát hiện môi trường phân tích.

Để hiểu rõ hơn và khám phá các dịch vụ đang chạy trên VM và sandbox của bạn, bạn có thể sử dụng ứng dụng gốc của Windows `services.exe` để lấy danh sách các dịch vụ được cấu hình trên hệ thống.&#x20;

Dưới đây là bảng liệt kê một số dịch vụ phổ biến được tạo bởi VMware và VirtualBox:

<table><thead><tr><th width="165.45452880859375">Name</th><th>Description</th></tr></thead><tbody><tr><td>VGAuthService</td><td>VMware Guest Authentication Service</td></tr><tr><td>VMTools</td><td>VMware Tools Service</td></tr><tr><td>VBoxService</td><td>VirtualBox Guest Additions Service</td></tr></tbody></table>

## 4.5 Installed Software

Malware có thể truy xuất các phần mềm đã cài đặt trên máy phân tích của bạn và tìm kiếm các từ khóa đại diện cho các công cụ phân tích thông dụng hoặc các dấu hiệu liên quan đến sandbox. Kỹ thuật này cũng có thể được sử dụng để lập hồ sơ mục tiêu; malware có thể đơn giản là truy vấn host, tìm kiếm phần mềm đã cài đặt cho thấy hệ thống này là mục tiêu hợp lệ.

Để tìm kiếm phần mềm đã cài đặt, malware có thể sử dụng hàm Windows API như `MsiEnumProducts` hoặc kiểm tra khóa registry `HKLM\Software\Microsoft\Windows\Current Version\Uninstall`, nội dung từ máy phân tích malware của tôi được hiển thị bên dưới:

<figure><img src="/files/hnd7XuQvmJ0fCsl2xeDs" alt=""><figcaption></figcaption></figure>

Ở đây bạn có thể thấy một số công cụ phân tích.

{% hint style="success" %}
Lưu ý: trình cài đặt phần mềm tạo ra nhiều dấu vết trên host, chẳng hạn như thư mục mới, tệp và mục nhập registry, tất cả đều có thể được liệt kê bởi phần mềm độc hại. Đôi khi sử dụng phiên bản di động của các công cụ phân tích là cách tiếp cận tốt hơn, vì chúng không cần phải được cài đặt và được chạy trực tiếp từ một tệp thực thi độc lập.
{% endhint %}

## 4.6 Mutexes

Như đã giải thích ở chương 1, mutex là một đối tượng giúp kiểm soát việc truy cập vào tài nguyên, hoạt động như một loại người gác cổng. Một số sandbox và hypervisor có các mutex độc đáo có thể thu hút sự chú ý của malware. Ví dụ, VMware thường sử dụng các mutex bắt đầu bằng VMware, chẳng hạn như `VMwareGuestCopyPasteMutex`.

Malware có thể sử dụng hàm Windows API `CreateMutex` hoặc `OpenMutex` để tìm kiếm các giá trị mutex cụ thể, như được hiển thị trong mẫu này:

```nasm
push mutex_name ; "VMwareGuestCopyPasteMutex"
push 0
push 20000L
call OpenMutexA
test eax, eax
```

Malware đẩy biến `mutex_name`, chứa mutex mà malware muốn tìm vào stack. Nó cũng đẩy 2 giá trị khác cần thiết cho hàm `OpenMutex` nhưng không quan trọng ở đây. Tiếp theo nó gọi `OpenMutexA` và sử dụng lệnh test để kiểm tra xem hàm đó có thành công hay thất lại. Nếu cuộc gọi hàm thành công, `VMwareGuestCopyPasteMutex` tồn tại trên hệ thống, có nghĩa là hệ thống có khả năng đang chạy bên trong hypervisor VMware.

Hãy nhớ rằng không phải tất cả hoạt động liên quan đến mutex đều độc hại. Mutex là các đối tượng Windows tiêu chuẩn và tự bản thân chúng không phải là độc hại hay lành tính. Nếu bạn phát hiện phần mềm độc hại đang truy xuất mutex và cố gắng tìm các chuỗi rất cụ teher như các ví dụ vừa đưa ra, nó có thể đang sử dụng kỹ thuật phát hiện này.&#x20;

Một số mutex có thể tiết lộ môi trường máy ảo bao gồm:

* VMware Workstation&#x20;
  * `VMToolsHookQueueLock`&#x20;
  * `VMwareGuestCopyPasteMutex`&#x20;
  * `VMwareGuestDnDDataMutex`
* VirtualBox
  * `VBoxService`&#x20;
  * `VBoxTray`

## 4.7 Pipes

Pipe là một đối tượng Windows cho phép giao tiếp giữa các tiến trình. Một số hypervisor tạo ra các pipe độc đáo trên hệ điều hành có thể tiết lộ sự hiện diện của chúng cho phần mềm độc hại. Phần mềm độc hại có thể gọi một số hàm khác nhau, chẳng hạn như `CreateFile` và `CallNamePipe`, để tìm kiếm các name pipe cụ thể.

Một cách tuyệt vời để kiểm tra các máy ảo của bạn về các pipe này là sử dụng công cụ **Pipelist**, một phần của bộ Windows Sysinternals từ Mark Russinovich. Hình dưới đây hiển thị kết quả từ việc chạy lệnh `pipelist64.exe` trên một VMware Workstation. Nếu nhìn kỹ, ta có thể phát hiện pipe `vgauth-service`, độc đáo cho VMware.

<figure><img src="/files/wlOmD5vyHlMBiXonld2y" alt=""><figcaption></figcaption></figure>

Dưới đây là một số pipe phổ biến có thể tồn tại trên VM của bạn:

* VMware Workstation&#x20;
  * `Vmmemctl`
  * `vgauth-service`
* VirtualBox
  * `VBoxTray`&#x20;
  * `VBoxTrayIPC`&#x20;
  * `VBoxGuest`&#x20;
  * `VBoxVideo`
  * `VBoxMouse`&#x20;
  * `VBoxMiniRdr`

## 4.8 Devices and Drivers

Các hypervisor thường cài đặt các thiết bị và trình điều khiển (drivers) cụ thể trên hệ điều hành khách.  Devices là các đối tượng thường đại diện cho phần cứng vật lý trên hệ thống, chẳng hạn như USB controllers hoặc ổ đĩa cứng. Drivers là các đối tượng phần mềm điều khiển phần cứng, cho phép hệ điều hành và thiết bị giao tiếp. Các đối tượng device và driver thường được quản lý bởi trình quản lý đối tượng Windows.

Phần mềm độc hại có thể truy xuất các đối tượng device và driver bằng cách sử dụng 2 hàm Windows API: NtOpenDirectoryObject và NtQueryDirectoryObject. Đoạn mã sau cho thấy các hàm này hoạt động:

<figure><img src="/files/0H0qntWHXQHCpBmkR2Rm" alt=""><figcaption></figcaption></figure>

Bạn có thể thấy một handletoiws thư mục \\\Driver được nạp vào thanh ghi rcx (1), sử dụng lệnh lea, hoặc load effective addresss. Lệnh lea tính toán địa chỉ của một toán hạng và nạp nó vào một thanh ghi đích. Tiếp theo là một cuộc gọi đến NtOpenDirectoryObject, mở \\\Driver để chuẩn bị cho cuộc gọi hàm NtQueryDirectoryObject sau đó (2). Sau đó NtQueryDirectoryObject truy vấn các đối tượng thư mục \\\Driver và lưu trữ danh sách các đối tượng trong một bộ đệm đã được chỉ định trước đó (3). Malware sau đó tìm kiếm qua bộ đệm này, tìm kiếm các driver cụ thể thường được sử dụng trong VM. Các thiết bị có thể được truy vấn theo cách tương tự.

Để hiểu rõ hơn về nội dung của trình quản lý đối tượng Windows, bạn có thể xem nó trực tiếp trên VM Windows bằng công cụ WinObj từ Sysinternals. Hình dưới đây hiển thị một số driver liên quan đã được cài đặt trên VM.&#x20;

<figure><img src="/files/nwjQLivUQaS3xdwohLuF" alt=""><figcaption></figcaption></figure>

Một số driver hypervisor phổ biến cho VMware Workstation và VirtualBox bao gồm:

* **VMware Workstation**&#x20;
  * `vm3dmp`&#x20;
  * `vm3dmp-debug`
  * `vm3dmp-stats`
  * `vm3dmp-sloader`
  * `vmci`
  * `vmhgfs`
  * `VMMemCtl`
  * `vmmouse`
  * `vmrawdsk`
  * `vmusbmouse`
  * `vsock`
* **VirtualBox**
  * `VBoxGuest`
  * `VBoxMouse`
  * `VBoxSF`
  * `VBoxVideo`
  * `VBoxWddm`

Và đây là một số thiết bị phổ biến:

* **VMware Workstation**
  * `VMCIGuestDev`
  * `VMCIHostDev`
  * `vm3dmpDevice`
  * `vmci`
  * `vmmemctl`
* **VirtualBox**
  * `VBoxGuest`
  * `VBoxMiniRdr`

## 4.9 Usernames and Hostnames

Nhiều sandbox có danh sách mặc định các tên người dùng có thể được gán cho tài khoản người dùng trên hệ thống. Những tên người dùng này có thể được ngẫu nhiên hóa, nhưng chúng thường được mã hóa cứng (hardcode). Hostname của hệ thống tương tự cũng có thể được mã hóa cứng và ngẫu nhiên hóa tại thời điểm khởi động. Tuy nhiên, đây không chỉ là đặc điểm của các sandbox tự động. Các nhà phân tích malware cũng có thể cấu hình máy ảo phân tích của họ với tên người dùng hoặc tên máy chủ có thể là chung chung, nổi tiếng (phổ biến), hoặc không giống như một người dùng thực sẽ cấu hình hệ thống của họ.

Một số phần mềm độc hại có thể lợi dụng bằng cách liệt kê các tài khoản người dùng và tên máy chủ của hệ thống, cụ thể là tìm kiếm các tên người dùng chung như Administrator, User, hoặc John, hoặc tên máy chủ như Cuckoo, Test, Desktop, Workstation, hoặc Lab,.. cũng là một kiểm tra phổ biến.

{% hint style="success" %}
LƯU Ý: hãy cấu hình VM và môi trường sandbox của bạn với ten người dùng và tên máy chủ không chung chung. Cố gắng sử dụng các giá trị mà một người dùng cuối thực tế hoặc môi trường doanh nghiệp sẽ sử dụng, hoặc ngẫu nhiên hóa các tên.
{% endhint %}

## 4.10 Locale and Language Settings

Cài đặt bàn phím và ngôn ngữ có thể được sử dụng để xác định vị trí của nạn nhân tiềm năng. Malware có thể sử dụng kỹ thuật này để bao gồm hoặc loại trừ một host như một mục tiêu hợp lý vì lý do địa lý hoặc địa chính trị, hoặc để tránh bị phân tích. Ví dụ, giả sử một mẫu malware muốn xác định liệu một nạn nhân tiềm năng có nằm ở Nga hoặc nói tiếng Nga không. Tùy thuộc vào thông tin này, nó có thể chọn triển khai payload của mình trên host hoặc âm thầm tự kết thúc. Dưới dây là 3 tiếp cận khác nhau mà nó có thể sử dụng để trích xuất thông tin này:

* Lấy ngôn ngữ bố cục bàn phím
* Liệt kê cài đặt ngôn ngữ của chính hệ thống, chẳng hạn như ngôn ngữ hiển thị.
* Lấy locale của host

Phương pháp đầu tiên có lẽ là phổ biến nhất. Hàm Windows `GetKeyboardLayout` trả về ngôn ngữ bàn phím đang hoạt động của máy chủ, và `GetKeyboardLayoutList` trả về danh sách đầy đủ tất cả các ngôn ngữ bàn phím được cài đặt trên host.

Có một số hàm Windows có thể lấy cài đặt ngôn ngữ của host. `GetUserDefaultUILanguage`, ví dụ trả về ngôn ngữ giao diện người dùng của người dùng hiện đang đăng nhập. `GetSytemDefaultUILanguage` trả về ngôn ngữ hệ thống, hoặc cụ thể hơn, ngôn ngữ mà hệ điều hành được cài đặt. Cuối cùng, `GetProcessPreferredUILanguage` sẽ liệt kê các ngôn ngữ mà các quy trình đang chạy của người dùng có thể đang sử dụng. Thật nhiều lựa chọn.

Locale của host khác với cài đặt ngôn ngữ bàn phím và giao diện người dùng của hót ở chỗ nó là một danh sách các cài đặt liên quan đến ngôn ngữ cho một kết hợp ngôn ngữ và quốc gia cụ thể. Một số mục có thể được bao gồm như một phần của locale là định dạng hiển thị tiền tệ và ngày/giờ, cũng như một định danh ngôn ngữ. Các hàm Windows API `GetSystemDefaultLCID` và `GetUserDefaultLCID` trả về thông tin locale có thể được sử dụng để lập hồ sơ host hoặc người dùng. Các quy trình và luồng cũng có thể có locale tùy chỉnh riêng, mà malware có thể truy vấn bằng hàm `GetThreadLocale`.

Trong một mẫu malware, bạn có thể thấy một cuộc gọi đến một trong các hàm đã đề cập trước đó, chẳng hạn như GetKeyboardLayout, theo sau là một so sánh với một số giá trị đại diện cho định danh ngôn ngữ Windows.

```c
keyboard_layout = GetKeyboardLayout(0)
if keyboard_layout == "0x419" {
    TerminateProcess()
}
```

Mẫu malware này gọi hàm `GetKeyboardLayout` và so sánh kết quả với giá trị 0x419, đây là định danh ngôn ngữ tiếng Nga ở dạng thập phân (hex). Nếu định danh ngôn ngữ tiếng Nga này đang được sử dụng, malware sẽ thực thi `TerminateProcess`.

<table><thead><tr><th width="188.22225952148438">Định danh (dạng hex)</th><th>Ngôn ngữ (và quốc gia liên quan)</th></tr></thead><tbody><tr><td><strong>0x402</strong></td><td>Tiếng Bulgaria (Bulgaria)</td></tr><tr><td><strong>0x4</strong></td><td>Tiếng Trung (Giản thể) (Trung Quốc)</td></tr><tr><td><strong>0x809</strong></td><td>Tiếng Anh (Vương quốc Anh)</td></tr><tr><td><strong>0x409</strong></td><td>Tiếng Anh (Hoa Kỳ)</td></tr><tr><td><strong>0x407</strong></td><td>Tiếng Đức (Đức)</td></tr><tr><td><strong>0x418</strong></td><td>Tiếng Romania (Romania)</td></tr><tr><td><strong>0x419</strong></td><td>Tiếng Nga (Nga)</td></tr></tbody></table>

Có một số phương pháp kín đáo hơn để liệt kê hoặc suy ra cài đặt ngôn ngữ và locale của nạn nhân tiềm năng, chẳng hạn như truy xuất định dạng ngày/giờ, định dạng tiền tệ, hoặc thậm chí thông tin lịch. Danh sách tiềm năng rất rộng. Điều quan trọng nhất là bạn có kiến thức cần thiết để xác định nhiều phương pháp phổ biến mà malware có thể sử dụng để lập hồ sơ ngôn ngữ và locale của nạn nhân.

## 4.11 Operating System Version Information

Trước khi lây nhiễm vào máy tính của nạn nhân, malware thường cần xác định liệu máy đó có đang chạy một hệ điều hành nhất định không. Stuxnet, ví dụ, chỉ lây nhiễm vào máy tính Windows XP vì các tác giả của nó biết rằng các cơ sở mục tiêu sử dụng Windows XP để điều khiển bộ điều khiển logic có thể lập trình Siemens. Một mẫu malware chỉ có thể chạy trên một phiên bản Windows nhất định có thể cố gắng xác định hệ điều hành trước khi lây nhiễm vào host tránh vô tình làm crash máy.&#x20;

Ví dụ, nếu malware chứa mã khai thác chỉ hoạt động cho một phiên bản cụ thể của Windows, chẳng hạn như Windows 7 Service Pack 1, nhưng gây ra sự không ổng định cho hệ thống Windows 7 Service Pack 2, nó có thể muốn xác định phiên bản phụ hệ điều hành của nạn nhân trước để ngăn chặn sự crash không mong muốn có thể cảnh báo nạn nhân sự hiện diện của nó.

Kỹ thuật này thường không được triển khai như một kỹ thuật phát hiện hoặc né tránh, nhưng đáng được thảo luận trong bối cảnh này vì nó vẫn có thể can thiệp vào quá trình phân tích. Ví dụ, nếu bạn đang nghiên cứu Stuxnet và quyết định chạy mẫu trong một máy ảo hoặc sandbox với hệ điều hành Windows hiện đại, có khả năng nó sẽ không chạy đúng, do đó vô tình né tránh các phương pháp phân tích tự động và động.&#x20;

Đây là một điểm quan trọng cần ghi nhớ: một mẫu malware không thực thi đúng trong môi trường phân tích của bạn không nhất thiết là cố tình cố gắng né tránh.

Có nhiều cách để truy xuất hệ điều hành và phiên bản của mục tiêu thông qua hàm Windows API `GetVersionEx`, cùng với người anh em gần gũi `GetVersion`, thực hiện điều này, như được hiển thị ở đoạn code mẫu sau:

```nasm
lea eax, [ebp-0A0h]
push eax
mov [ebp+VersionInformation.dwOSVersionInfoSize], 9Ch
call GetVersionExA
test eax, eax
jnz short loc_2
--snip--
cmp [ebp+VersionInformation.dwMajorVersion], 4
jnz loc_1000FA0F
```

Hàm `GetVersionExA` lấy một bộ đệm làm đối số. Bộ đệm này sẽ là khu vực bộ nhớ nơi thông tin hệ điều hành trả về sẽ được lưu trữ sau khi `GetVersionExA` được gọi. Lệnh `lea` nạp địa chỉ bộ đệm, `[ebp-0A0h]` vào thanh ghi `eax`, và sau đó địa chỉ bộ đệm được đẩy vào stack với `push eax`.

Tiếp theo mẫu phải xác định kích thước của dữ liệu sẽ được trả về từ cuộc gọi hàm `GetVersionExA`. Dữ liệu này sẽ được lưu trữ trong một cấu trúc gọi là `VersionInformation`. Mẫu này chỉ định kích thước của cấu trúc `VersionInformation` là 0x9C = 156 bytes.

Cuối cùng, mẫu malware gọi `GetVersionExA` để lấy phiên bản hệ điều hành, sau đó kiểm tra thông tin đó bằng cách so sánh `dwMajorVersion` với giá trị 4, đại diện cho một phiên bản Windows rất cũ (5 sẽ là số phiên bản cho Windows XP). Về cơ bản, mẫu malware này đang kiểm tra để xem phiên bản Windows của host này cũ như thế nào.

| Operating system    | dwMajorVersion | dwMinorVersion |
| ------------------- | -------------- | -------------- |
| Windows 10          | 10             | 0              |
| Windows Server 2016 | 10             | 0              |
| Windows 8 1         | 6              | 3              |
| Windows Server 2012 | 6              | 2              |
| Windows 7           | 6              | 1              |
| Windows Server 2008 | 6              | 0              |
| Windows Vista       | 6              | 0              |
| Windows XP          | 5              | 1              |

Trong chương này, chúng ta đã đề cập đến nhiều cách phổ biến (và một số không quá phổ biến) mà phần mềm độc hại có thể phát hiện môi trường phân tích bằng cách kiểm tra các đối tượng và dấu vết của hệ điều hành.&#x20;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://viettaliii.gitbook.io/home/mal/evasive-malware/chapter-4-enumerating-operating-system-artifacts.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
