### 1. Kỹ Thuật Process Doppelganging
### 2. Các Bước Thực Hiện Process Doppelganging
:::info
* Đầu tiên, ta khởi tạo một transaction bằng API **CreateTransaction()**. Tiếp theo, ta tạo một file trong transaction này bằng API **CreateFileTransacted()**.
:::


:::info
* Sau khi tạo một transaction và mở một file trong transaction này, ta tiếp tục chèn payload độc hại vào file vừa mở bằng API **WriteFile()**.
:::


:::info
* Tiếp theo, ta tạo ra một section ở tiến trình hiện tại bằng file được chèn payload độc hại nêu trên. Quá trình này được thực hiện bằng cách gọi API **NtCreateSection()**.
:::


:::info
* Sau khi tạo một section, ta tiến hành thực hiện quá trình rollback file. Quá trình này sẽ khôi phục lại trạng thái ban đầu của file trong transaction như thể chưa có bất cứ thay đổi nào xảy ra. Quá trình này được thực hiện bởi việc gọi API **RollbackTransaction()**.
:::


:::info
* Sau đó, ta tạo một tiến trình bằng section vừa tạo được bằng API hệ thống **NtCreateProcessEx()**. Lưu ý rằng tiến trình được tạo ra là một tiến trình độc hại.
:::


:::info
* Lúc này, ở kernel space sẽ khởi tạo một process object tương ứng với tiến trình độc hại. Lưu ý rằng tất cả các tiến trình của hệ thống đều được biểu diễn bằng cấu trúc **EPROCESS**, mỗi EPROCESS sẽ được liên kết với các EPROCESS khác bằng cấu trúc **AP_LINK** để tạo thành một danh sách liên kết vòng.
:::

:::info
* **Bởi vì tiến trình của ta được tạo ra bởi API gần mức kernel là **NtCreateProcessEx()** nên nó không được chuẩn bị các tham số cần thiết khi tiến trình được tạo ra**, chính vì vậy ta phải tự đi chuẩn bị các tham số cho tiến trình được tạo ra ở user space và cập nhật các thông tin cần thiết cho khối **PEB**. Các tham số trong một tiến trình được biểu diễn bằng cấu trúc **RTL_USER_PROCESS_PARAMETERS**, cấu trúc này chứa các thông tin quan trọng của một tiến trình như đường dẫn tệp tin thực thi, tham số dòng lệnh, môi trường, thư mục làm việc, và các tùy chọn khác.
:::

:::info
* Để tạo một đối tượng của cấu trúc **RTL_USER_PROCESS_PARAMETERS**, ta sử dụng API hệ thống **RtlCreateProcessParameterEx()**. Các parameter truyền vào API này như đã nêu trên bao gồm đường dẫn tệp tin thực thi, tham số dòng lệnh, môi trường, thư mục làm việc, và các tùy chọn khác.
:::

:::info
* Sau khi tạo thành công đối tượng **RTL_USER_PROCESS_PARAMETERS** (chuẩn bị xong các tham số của tiến trình độc hại), ta cần tạo một đoạn địa chỉ ảo trên tiến trình độc hại và chèn đối tượng này vào trong đoạn địa chỉ vừa tạo. Các API được sử dụng cho quá trình này bao gồm **VirtualAllocEx()** và **WriteProcessMemory()**.
:::

:::info
* Sau khi chèn các parameter cho tiến trình độc hại thành công, ta tiếp tục tiến hành cập nhật các thông tin cho khối **PEB** của tiến trình độc hại. Các thông tin ta cần quan tâm trong cấu trúc PEB bao gồm **ImageBaseAddress**, **Ldr**, **ProcessParameters** và **Mutant**. ImageBaseAddress lưu địa chỉ bắt đầu của process image khi được tải lên trong không gian địa chỉ ảo của tiến trình. Ldr (được viết tắt của loader) là một trường có kiểu **PPEB_LDR_DATA**, nó là con trỏ của cấu trúc PEB_LDR_DATA và cấu trúc này sẽ chứa các thông tin quan trọng về những DLL được nạp vào tiến trình. Tiếp đến là trường ProcessParameters, trường này đã được giới thiệu ở trên. Cuối cùng là trường Mutant, bản chất của Mutant là một semaphore, nó được dùng để đảm bảo việc đồng bộ giữa các tiến trình hoặc tiểu trình đang thực thi.
:::

:::info
* Sau khi chuẩn bị thành công các parameter cần thiết cho tiến trình độc hại, ta cập nhật địa chỉ của nó vào trong cấu trúc PEB. Trước tiên cập nhật, ta cần phải biết được địa chỉ của khối PEB trong tiến trình độc hại, để trích xuất được thông tin này ta sử dụng API NtQueryInformationProcess(). API **NtQueryInformationProcess()** trả cho ta các thông tin cần thiết của một tiến trình trong cấu trúc **PROCESS_BASIC_INFORMATION**, ta sẽ dùng cấu trúc này để trích xuất địa chỉ của PEB.
:::

:::info
* Sau khi biết được địa chỉ của khối PEB, ta tiến hành tính toán offset của trường ProcessParameters và sau đó cập nhật địa chỉ bắt đầu của cấu trúc **RTL_USER_PROCESS_PARAMETERS** vào trong trường ProcessParameters tương ứng.
:::

:::info
* Sau khi chuẩn bị xong mọi thứ, ta chỉ cần tạo một thread để tiến hành chạy tiến trình độc hại bằng API hệ thống **NtCreateThreadEx()**.
:::

:::info
* Cuối cùng trên hệ thống của chúng ta có một tiến trình hợp lệ được tạo ra, nhưng bản chất trong tiến trình hợp lệ này lại thực hiện các tác vụ độc hại. Điều này sẽ có thể dễ qua mặt được các trình AV.
:::

### 3. Demo Process Doppelganging
:::info
* Demo sẽ thực hiện kỹ thuật process doppelganging dựa trên chương trình calc.exe và mimikatz.exe. Chương trình calc.exe là chương trình dùng để tính toán cơ bản còn mimikatz.exe lại là một công cụ về việc dò quét mật khẩu rất phổ biến trên windows. Chúng ta sẽ cố gắng thực hiện kỹ thuật process doppelganging để chạy được chương trình mimikatz.exe với vỏ bọc là chương trình calc.exe.
:::

:::info
* Cuối cùng ta kiểm tra tool process hacker để xác nhận xem quá trình tấn công được diễn ra thành công hay chưa. Ta có thể thấy quá trình tấn công được diễn ra thành công.
:::
