> For the complete documentation index, see [llms.txt](https://twentysick.gitbook.io/twentysick/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://twentysick.gitbook.io/twentysick/sharing/series-phat-minh-lai-cai-banh-xe/windows-native-application/windows-native-application-la-gi.md).

# Windows Native Application là gì?

Khi tìm hiểu về Windows, ta sẽ thấy có rất nhiều loại ứng dụng, phần mềm khác nhau, GUI Application, Console Application,... và không thể không nhắc tới Native Application. Dù không quá nổi bật, nhưng Native Application đóng một vai trò rất quan trọng trong hệ điều hành Windows

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2F8eM2oPSFSXohQSfqIZ8t%2Fimage1.png?alt=media&amp;token=03f7ce1c-fd62-43fa-b368-7bbece9f87cb" alt=""><figcaption></figcaption></figure>

## Windows Application

**Windows Application** là thuật ngữ chỉ các ứng dụng, phần mềm được thiết kế để chạy trên hệ điều hành Windows. Các phần mềm này có thể là các chương trình có giao diện đồ họa (GUI) như Microsoft Word, Microsoft Excel,... hoặc là các chương trình sử dụng dòng lệnh như Command Prompt, Powershell,... Tùy từng loại Subsystem mà chương trình sẽ gọi các API từ các thư viện khác nhau.

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FNHJHkiBZ0DVwHqPZAJuD%2Fimage2.png?alt=media&amp;token=894be003-e41b-46ef-b28e-341bbbd46fc6" alt=""><figcaption></figcaption></figure>

**Win32API (Windows API)** là thuật ngữ chỉ các API được thiết kế để tương tác với hệ điều hành Windows khi được thực thi. Các API này được Microsoft định nghĩa, viết thành tài liệu chính thống và được lưu trong nhiều file dll.

\
Trên hệ điều hành Windows, khi 1 chương tình bình thường được thực thi, sẽ thực hiện tuần tự:

{% code overflow="wrap" %}

```

↳ Process thực hiện gọi các Win32API
   ↳ Win32API sẽ gọi các NtAPI (Native API) 
      ↳ NtAPI (Native API) sẽ tương tác trực tiếp với Kernel 

```

{% endcode %}

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FwNzJGCZ7LcGYfGVJkPVS%2Fimage3.png?alt=media&amp;token=9e811c2e-c960-45cc-bcd6-ddebb201b472" alt=""><figcaption></figcaption></figure>

## Subsystem

**SubSystem** trong hệ điều hành Windows được định nghĩa như lớp trung gian giữa Application và Kernel. Nó giúp xác định cách Application được thực thi và tương tác với hệ thống. Hiện nay, có tổng 9 loại SubSystem.

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FWYp2M2in0zii1olIHEJF%2Fimage4.png?alt=media&amp;token=131f246c-a2b4-481e-9d5c-038b775c2b91" alt=""><figcaption></figcaption></figure>

## Windows Native Application

**Windows Native Applications** là thuật ngữ dùng để chỉ các file thực thi đặc biệt trên hệ điều hành Windows. Các file này được thiết kế để thao tác trực tiếp với Windows Kernel thông qua việc sử dụng các NtAPI (Native API). Không giống với *Windows Driver*, Native Application sẽ được thực thi dưới User Mode chứ không phải Kernel Mode.

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FONE71gkUntBP9OAfKq9W%2Fimage5.png?alt=media&amp;token=8e6281a1-2289-42a4-86e4-101575ad3670" alt=""><figcaption></figcaption></figure>

**Native API (NtAPI)** là các API được thiết kế để thao tác với Kernel, đóng vai trò làm cầu nối giữa Kernel mode và User mode. Các API này có thể truy cập sâu vào tài nguyên hệ thống: tiến trình, bộ nhớ,...

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FoLKzp5ipE7g2vYuVYQVN%2Fimage6.png?alt=media&amp;token=cec032ce-0372-4c26-912e-c47b05320796" alt=""><figcaption></figcaption></figure>

Ví dụ Native Application trong hệ điều hành Windows:

* *smss.exe*
* *csrss.exe*
* *wininit.exe*
* *autochk.exe*

Khi thực thi Native Application, các Native API sẽ được gọi trực tiếp và tương tác trực tiếp với Kernel, bỏ qua bước gọi các Windows API.

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2Fbr8ySvhUgdO0usU402eJ%2Fimage7.png?alt=media&amp;token=acc0de41-cf35-472f-8774-74e76256f1c7" alt=""><figcaption></figcaption></figure>

### Ưu điểm của Windows Native Application

* Do chỉ sử dụng các NtAPI từ ntdll.dll, nên tốc độ thực thi của Native Application rất nhanh. Bên cạnh đó, việc không sử dụng các API từ các thư viện khác, kích thước của file cũng giảm đáng kể do Import Address Table (IAT) chỉ có mỗi ntdll.dll.
* Các EDR/AV sẽ hook vào các Windows DLLs ở User Mode, nhưng Native Application không hề sử dụng các DLLs đó mà chỉ sử dụng mỗi NtDll.dll nên dương như Native Application sẽ bypass việc hooking này. Điều này khiến cho mã độc là Native Application sẽ khó bị phát hiện bởi EDR/AV.
* Ngoài ra, các phần mềm này còn *có thể thực thi khi quá trình boot diễn ra với quyền đặc biệt trên hệ điều hành Windows*. Điều này khiến cho Native Application có thể thực hiện những hành vi mà User bình thường không thể thực hiện được.

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FbNadeSUr0kbqkCHrvPuR%2Fimage8.png?alt=media&amp;token=3b4af24e-da8c-4835-9205-1587c8b37f1f" alt=""><figcaption></figcaption></figure>

### Nhược điểm của Windows Native Application

* Native Application không thể thực thi từ Windows API, cho nên việc thực thi file bằng cách Double-click hoặc thực thi trực tiếp bằng câu lệnh là không thể. Vì việc Double-click hoặc sử dụng lệnh đều sẽ gọi đến hàm CreateProcess của WinAPI để khởi tạo tiến trình và thực thi file.
* Ngoài ra, còn một nhược điểm nữa của các Native Application là các phần mềm này chỉ sử dụng mỗi Native API (NtAPI). Phần lớn các Native API (NtAPI) không hề có tài liệu chính thống từ Microsoft mà chỉ được tổng hợp từ các Researchers (dù các researchers tổng hợp rất chi tiết và nhiều nhưng không hề đầy đủ). Và các Native API (NtAPI) có thể bị thay đổi giữa các phiên bản của Windows. Cho nên đây là một trở ngại khi phát triển Native Application.

<figure><img src="https://3579869334-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fqj23826F0xExp2MNexN5%2Fuploads%2FsuPjXwr4RFpnSmZsI0wG%2Fimage9.png?alt=media&amp;token=cc96910f-98b4-49ba-a0b8-d72dd0aebe42" alt=""><figcaption></figcaption></figure>

## So sánh Windows Native Application và Windows Drivers

Dù đều có thể được thực thi trong quá trình boot, nhưng Native Application và Windows Driver là 2 loại file khác nhau:

|                                  | Windows Native Application | Windows Drivers        |
| -------------------------------- | -------------------------- | ---------------------- |
| Entry point                      | NtProcessStartup           | DriverEntry            |
| Execution Mode                   | User Mode                  | Kernel Mode            |
| File Format                      | .exe                       | .sys                   |
| API                              | Native API                 | Kernel API             |
| Rủi ro khi chương trình chạy lỗi | Crash ứng dụng             | Crash toàn bộ hệ thống |
| Được thực thi bởi                | SMSS.exe                   | Windows Kernel I/O     |
| Chữ ký số                        | Không bắt buộc             | Bắt buộc               |
