# Tìm hiểu các thành phần hệ điều hành

## Windows API <a href="#u50jpqakb8ty" id="u50jpqakb8ty"></a>

WinAPI là viết tắt của “Windows API”, là một bộ các giao diện lập trình ứng dụng (API) được Microsoft cung cấp để phát triển các ứng dụng chạy trên hệ điều hành Windows. Các ứng dụng Windows sử dụng WinAPI để tương tác với hệ thống máy tính, bao gồm việc tạo và quản lý cửa sổ (windows), xử lý sự kiện(events) đầu vào như nhấn phím (key) và chuột (mouse), vẽ đồ họa(3D), quản lý tệp và thư mục, và nhiều chức năng khác.

### Nguyên lý hoạt động: <a href="#o8dcaht3h0lj" id="o8dcaht3h0lj"></a>

Windows phân quyền truy cập phần cứng bằng hai chế độ riêng biệt: User mode và kernel mode.

| User mode                                   | Kernel mode                        |
| ------------------------------------------- | ---------------------------------- |
| Không có quyền truy cập phần cứng trực tiếp | Truy cập phần cứng trực tiếp       |
| Truy cập vào vị trí bộ nhớ sở hữu           | Truy cập vào toàn bộ bộ nhớ vật lý |

![](https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FKSKxhzj3MkW4K4Jbpc7r%2F0.png?alt=media)

API Win32 Call cần trỏ tới địa chỉ bộ nhớ của chúng nhưng việc tìm các con trỏ này trở nên khó khăn do ASLR( Address Space Layout Randomization), mỗi ngôn ngữ hoặc gói có một quy trình riêng để vượt qua ASLR. Hai cách phổ biến nhất là [P/Invoke](https://docs.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke) và sử dụng [Windows header file](https://docs.microsoft.com/en-us/windows/win32/winprog/using-the-windows-headers). Sau đó trình biên dịch sẽ ghi chú cho trình liên kết để giải quyết các cuộc gọi hàm API đó. Trình liên kết giải quyết các cuộc gọi bằng cách tìm các hàm stub trong các thư viện chỉ định trên dòng lệnh liên kết. Khi chạy, lệnh gọi đến một trong các hàm đó sẽ khiến DLL tương ứng được tải và sau đó quyền điều khiển sẽ được chuyển đến hàm trong DLL.

Program Interaction:

* Windows API được định nghĩa theo kiểu C nhưng có thể được sử dụng thông qua bất kỳ ngôn ngữ lập trình nào có thể tương tác với cấu trúc dữ liệu API và quy ước gọi cho lệnh gọi hàm và lệnh gọi lại(callbacks).
* Các khía cạnh hướng đối tượng: Microsoft Foundation Class Library (MFC): (Thư viện C++ cung cấp lớp bao bọc cho Windows API), Visual Component Library (VCL) (Thư viện tương tự MFC nhưng được phát triển bởi Borland (nay là Embarcadero)), GDI+: Giao diện lập trình ứng dụng đồ họa 2D, kế thừa và mở rộng GDI (Graphics Device Interface), WinRT: (Giao diện lập trình ứng dụng Windows Runtime)
* Giao tiếp giữa các ứng dụng Windows:Bắt đầu từ DDE, OLE, COM, Automation Objects, ActiveX và .NET Framework.

## Process: <a href="#nbj13newenfh" id="nbj13newenfh"></a>

### Khái niệm: <a href="#qkga8dqrj92v" id="qkga8dqrj92v"></a>

Process là một chương trình đang hoạt động, tức một chương trình được gửi từ từ trạng thái ready and được lên lịch thực thi trong CPU (các trạng thái của process: new, ready, running, waiting, terminated và suspended). Thành phần:

* Private virtual address space: Các địa chỉ bộ nhớ ảo dành riêng cho process
* Executable program: Code và dữ liệu thực thi
* Open handles: Tham chiếu đến các tài nguyên hệ thống
* Security context: Access token xác định user, security groups, privileges, thuộc tính, xác nhận quyền sở hữu, khả năng, trạng thái ảo hóa UAC(User Account Control), session và trạng thái tài khoản người dùng bị giới hạn được liên kết vs Process, cũng như định danh AppContainer và thông tin sandbox liên quan
* Process ID
* Ít nhất một Thread thực thi

Xem process với: Task Manager, Tlist trong Debugging Tools for Windows, Process Explorer

### Nguyên lý hoạt động: <a href="#y6ufswx7zrep" id="y6ufswx7zrep"></a>

Chương trình là một thực thể thụ động chứa các chỉ thị điều khiển máy tính để tiến hành một tác vụ nào đó. Khi thực hiện các chỉ thị này, chương trình sẽ chuyển thành các tiến trình(một thực thể hoạt động với con trỏ lệnh xác định chỉ thị kế tiếp sẽ được thi hành), kèm theo các tài nguyên phục vụ cho hoạt động của process.

Các process tạo thành những thực thể độc lập. Mỗi process có một tập tài nguyên và môi trường riêng (con trỏ lệnh, Stack, các thanh ghi và không gian địa chỉ). Các process chỉ có thể liên lạc thông qua các cơ chế thông tin giữa các process do HĐH cung cấp

![](https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2F6SVlPiNS8Fon0KkSG4KJ%2F1.png?alt=media)

![](https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FLN0Lp0DzGrcvcq8rKhKh%2F2.png?alt=media)

### **Các hàm API quan trọng liên quan đến Process:**

1. **Tạo và quản lý Process:**
   * `CreateProcess`: Tạo một process mới.
   * `OpenProcess`: Mở một process hiện có để thao tác (đọc ghi bộ nhớ, quản lý luồng).
   * `TerminateProcess`: Kết thúc một process đang chạy.
2. **Quản lý bộ nhớ của Process:**
   * `VirtualAllocEx`: Cấp phát bộ nhớ trong không gian địa chỉ của process khác.
   * `ReadProcessMemory` và `WriteProcessMemory`: Đọc và ghi dữ liệu vào bộ nhớ của một process khác.
3. **Quản lý luồng (Threads):**
   * `CreateThread`: Tạo một thread mới trong cùng process.
   * `CreateRemoteThread`: Tạo một thread mới trong một process khác.
   * `SuspendThread` và `ResumeThread`: Tạm dừng và tiếp tục một thread.
4. **Quản lý thông tin Process:**
   * `GetProcessId`: Lấy ID của một process.
   * `GetProcessTimes`: Lấy thông tin về thời gian CPU mà process đã sử dụng.
   * `GetExitCodeProcess`: Lấy mã thoát của process sau khi kết thúc.
5. **Lấy thông tin hệ thống:**
   * `EnumProcesses`: Liệt kê các process đang chạy trong hệ thống.
   * `GetProcessImageFileName`: Lấy tên tệp thực thi của process.

### Thread là gì, nguyên lý hoạt động như thế nào <a href="#uay2um7b56ju" id="uay2um7b56ju"></a>

Thread là một chuỗi(luồng) được thực hiện trong tiến trình. Mỗi Thread xử lý tuần tự đoạn code của nó, sở hữu một con trỏ lệnh, tập các thanh ghi và một vùng nhớ stack riêng. Các thread chia sẻ CPU với nhau: một thread xử lý trong khi các thread khác chờ đến lượt. Các thread trong cùng một process chia sẻ một không gian địa chỉ chung -> có thể chia sẻ các biến toàn cục. Một Thread có thể truy xuất đến cả các stack của những tiểu trình khác trong cùng tiến trình.

![](https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FKBaGfwmwsrkGEFmci0xE%2F3.png?alt=media)

Phân loại:

User Level Thread: Được quản lý và thực thi tại mức độ ứng dụng (user space), không cần sự can thiệp của hệ điều hành

Kernel Level Thread: Được quản lý và lập lịch bởi HĐH, hoạt động trực tiếp trên kernel space

### **Kỹ thuật nâng cao**

1. **Process Injection:**
   * Các kỹ thuật injection như DLL Injection, Process Hollowing được sử dụng để thực thi mã tùy chỉnh trong process khác. Ví dụ: `CreateRemoteThread` và `VirtualAllocEx` có thể được sử dụng để tiêm mã độc vào một process hợp lệ.
2. **Hooking và API Hijacking:**
   * Hooking là kỹ thuật chặn các lời gọi hàm API trong một process. Điều này thường được thực hiện bằng cách thay đổi mã tại địa chỉ gốc của hàm API để chuyển hướng thực thi.
3. **Reflective DLL Injection:**
   * Đây là kỹ thuật nạp một DLL vào một process mà không cần ghi DLL ra đĩa, giúp tránh bị phát hiện bởi các phần mềm bảo mật.
4. **Process Mitigation Policies:**
   * Windows cung cấp các chính sách giảm thiểu rủi ro bảo mật (mitigation policies) như DEP (Data Execution Prevention), ASLR (Address Space Layout Randomization), và Control Flow Guard để bảo vệ process khỏi các tấn công.

#### **Debugging và phân tích Process:**

* Các công cụ như **Process Explorer**, **Process Hacker**, và **Task Manager** có thể được sử dụng để xem và quản lý các process đang chạy.
* **Debuggers** như WinDbg và x64dbg cho phép bạn theo dõi hoạt động chi tiết của process, bao gồm các lời gọi API, luồng thực thi, và quản lý bộ nhớ.

#### **Một số hàm hữu ích khác:**

* `GetCurrentProcessId`: Trả về ID của tiến trình hiện tại.
* `GetCurrentThreadId`: Trả về ID của luồng hiện tại.
* `OpenThread`: Mở một luồng cụ thể trong một tiến trình.

## Registry <a href="#mdin02o2s8z1" id="mdin02o2s8z1"></a>

### Khái niệm: <a href="#o75nj2ox1of" id="o75nj2ox1of"></a>

Windows Registry là một cơ sở dữ liệu phân cấp lưu trữ các cài đặt cấp thấp cho hệ điều hành Windows và cho các ứng dụng chọn sử dụng sổ đăng ký. Các kernel, device drivers, services, Security Accounts Manager và giao diện người dùng đều có thể sử dụng registry. Nó chứa các khóa (keys) và giá trị (values) được tổ chức thành một cấu trúc cây phân cấp, giúp người dùng và hệ điều hành truy xuất và thay đổi các thông tin quan trọng. Ngoài ra Registry còn hỗ trợ cấu trúc multi-profile lưu trữ cài đặt riêng của từng người dùng.

![](https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FcSgO7h7Yy2ZvJ3uvpXQq%2F4.png?alt=media)

### Tại sao lại cần registry trong Windows. <a href="#uu8ti64pyezo" id="uu8ti64pyezo"></a>

Trước khi có Windows Registry:

* Các ứng dụng lưu trữ cài đặt trong các tệp \*.ini.
* Tệp \*.ini có thể là văn bản hoặc nhị phân.
* Thường nằm trong vị trí chia sẻ không hỗ trợ cấu hình riêng cho từng người dùng.

Windows Registry là một kho lưu trữ logic của các cài đặt dụng, lưu trữ các tệp riêng lẻ và theo định dạng chuẩn, mang lại nhiều lợi ích hơn so với tệp \*.ini, bao gồm tăng hiệu suất khi phân tích dữ liệu bằng định dạng nhị phân, khả năng lưu trữ dữ liệu kiểu mạnh hơn và sự thuận tiện khi chỉnh sửa các khóa trong Registry bằng cách thủ công. Registry cũng cho phép các cài đặt người dùng được tải từ đường dẫn dành riêng cho từng người dùng, điều này hỗ trợ nhiều người dùng chia sẻ cùng một máy tính và cho phép các ứng dụng hoạt động cho người dùng với ít đặc quyền hơn. Việc sao lưu và khôi phục cũng dễ dàng hơn với Registry vì nó có thể được quản lý từ xa qua mạng, bao gồm từ các tập lệnh sử dụng bộ API tiêu chuẩn miễn là dịch vụ Remote Registry đang hoạt động và các tường lửa cho phép. Registry cũng cung cấp tính toàn vẹn hệ thống cao hơn, với khả năng cập nhật nguyên tử giữa các quy trình cùng thay đổi giá trị Registry cùng một lúc, bảo đảm tính nhất quán dữ liệu. Nếu hai quy trình cố gắng cập nhật cùng một giá trị Registry cùng một lúc, thay đổi của một quy trình sẽ được thực hiện trước và tính nhất quán của dữ liệu sẽ được duy trì. Trong trường hợp thay đổi đối với các tệp INI, các cuộc đua cập nhật như vậy có thể dẫn đến dữ liệu không nhất quán không phù hợp với cập nhật của cả hai.

### Các registry quan trọng cần giám sát: <a href="#kh5def8kizc7" id="kh5def8kizc7"></a>

**Khóa Windows Startup và Run**

* **Các khóa cần bảo vệ:**
  * HKEY\_CURRENT\_USER\Software\Microsoft\Windows\CurrentVersion\Run
  * HKEY\_LOCAL\_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
* **Lý do:** Những khóa này quy định các chương trình tự động chạy khi người dùng đăng nhập (cho CURRENT\_USER) hoặc khi hệ thống khởi động cho tất cả người dùng (cho LOCAL\_MACHINE). Phần mềm độc hại thường thêm các mục vào đây để đảm bảo nó chạy mỗi khi khởi động máy tính, làm cho những khóa này trở thành mục tiêu chính cần bảo vệ.

**Khóa bảo vệ Windows SmartScreen**

* **Các khóa cần bảo vệ:**
  * HKEY\_LOCAL\_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SmartScreenEnabled
* **Lý do:** Bộ lọc SmartScreen giúp bảo vệ máy tính của bạn chống lại các trang web lừa đảo và phần mềm độc hại, cũng như việc tải về hoặc chạy phần mềm độc hại. Thay đổi khóa này có thể cho phép kẻ tấn công vô hiệu hóa các biện pháp bảo vệ này, khiến hệ thống của bạn dễ bị tổn thương bởi nhiều mối đe dọa.

**Khóa bảo vệ Windows Security (Trước đây là Windows Defender)**

* **Các khóa cần bảo vệ:**
  * HKEY\_LOCAL\_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender
* **Lý do:** Khóa này điều khiển các cài đặt khác nhau của Windows Security (trước đây gọi là Windows Defender), một thành phần quan trọng trong việc bảo vệ hệ thống của bạn chống lại phần mềm độc hại và các mối đe dọa bảo mật khác. Sửa đổi khóa này có thể làm giảm đi khả năng phòng thủ của hệ thống.

**Khóa Task Manager**

* **Các khóa cần bảo vệ:**
  * HKEY\_LOCAL\_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr
* **Lý do:** Khóa này cho phép vô hiệu hóa Task Manager, một công cụ quan trọng để giám sát hoạt động hệ thống và chấm dứt các tiến trình đáng ngờ. Phần mềm độc hại có thể sử dụng khóa này để tránh bị phát hiện và loại bỏ bằng cách ngăn truy cập vào Task Manager. Do đó, việc giám sát và bảo vệ khóa này rất quan trọng để duy trì tính toàn vẹn và an ninh của hệ thống.

**Khóa Remote Desktop**

* **Các khóa cần bảo vệ:**
  * HKEY\_LOCAL\_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnections
* **Lý do:** Khóa registry này kiểm soát việc Remote Desktop có được bật (0) hay tắt (1) trên máy tính. Thay đổi trái phép khóa này có thể cho phép truy cập từ xa vào máy tính của bạn, tạo ra một rủi ro bảo mật đáng kể. Kẻ tấn công hoặc phần mềm độc hại có thể bật Remote Desktop để kiểm soát từ xa hệ thống của bạn. Giám sát khóa này giúp đảm bảo rằng Remote Desktop chỉ được kích hoạt khi cần thiết và bởi người dùng được ủy quyền.

### Ứng dụng MFC <a href="#urx2tpxbu7o6" id="urx2tpxbu7o6"></a>

Hệ điều hành Windows

\- Ứng dụng MFC có giao diện

\- Gồm các chức năng sau:

* Editbox nhập vào đường dẫn thư mục sẽ tìm
* Editbox nhập vào tên file cần tìm
* Button "TÌM KIẾM"
* CListCtr liệt kê danh sách các file tìm kiếm được gồm các thông tin: tên file, kích thước, đường dẫn đầy đủ, ngày sửa, ngày tạo, owner của file

Sử dụng [CFindFile](https://learn.microsoft.com/en-us/cpp/mfc/reference/cfilefind-class?view=msvc-170) Class để tìm file, lấy các thông tin gồm kích thước, đường dẫn đầy đủ, ngày sửa, ngày tạo

![](https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FM5GaoAMSpZp3fqqNuIvP%2F5.png?alt=media)

Sử dụng các hàm [GetSecurityInfo](https://learn.microsoft.com/en-us/windows/desktop/api/Aclapi/nf-aclapi-getsecurityinfo) và [LookupAccountSid](http://lookupaccountsid/) để tìm owner của file (tham khảo tại [Link](https://learn.microsoft.com/en-us/windows/win32/secauthz/finding-the-owner-of-a-file-object-in-c--))

![](https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FKU5legcTUYoSG7uorem1%2F6.png?alt=media)

**Source code**: <https://github.com/ollahneew/FileSearch>

![](https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FBhBWO6x4PJVusHkaA0FI%2F7.png?alt=media)
