Process and Thread

On Job Training

Process:

EPROCESS

Sơ đồ này hiển thị các thành phần chính của một đối tượng tiến trình (EPROCESS) và các mối quan hệ giữa chúng.

Dưới đây là giải thích chi tiết về các thành phần và cấu trúc dữ liệu được hiển thị trong sơ đồ:

Cấu trúc EPROCESS

  • Process Control Block (PCB): Khối điều khiển tiến trình, chứa các thông tin quản lý cơ bản của tiến trình.

  • Protection Locks: Các khóa bảo vệ để đảm bảo an toàn khi truy cập các tài nguyên.

  • Process ID and Parent Process ID: ID của tiến trình và ID của tiến trình cha.

  • Active Process Link: Liên kết tới các tiến trình đang hoạt động.

  • Process Flags: Các cờ trạng thái của tiến trình.

  • Process Creation and Exit times: Thời gian tạo và kết thúc của tiến trình.

  • Quota Information: Thông tin về hạn mức tài nguyên mà tiến trình có thể sử dụng.

  • Session Process Link: Liên kết tới phiên làm việc của tiến trình.

  • Security / Exception / Debug Ports: Các cổng bảo mật, xử lý ngoại lệ và gỡ lỗi.

  • Primary Access Token: Token truy cập chính của tiến trình.

  • Job this Process Belongs to: Công việc mà tiến trình thuộc về.

  • Handle Table: Bảng quản lý các tay cầm (handle) của tiến trình.

  • Process Environment Block (PEB): Khối môi trường tiến trình, chứa các thông tin môi trường của tiến trình.

  • Image File Name: Tên tệp hình ảnh của tiến trình.

  • Image Base Address: Địa chỉ cơ sở của tệp hình ảnh.

  • Process Counters (Memory, I/O, ...): Các bộ đếm của tiến trình (bộ nhớ, I/O, ...).

  • Thread list head: Đầu danh sách các luồng của tiến trình.

  • Sequence Number: Số thứ tự của tiến trình.

  • Win32 Process Structure: Cấu trúc tiến trình Win32.

  • Wow64 Process Structure (64 bit only): Cấu trúc tiến trình Wow64 (chỉ dành cho hệ thống 64 bit).

  • Trustlet Identity (Win 10 x64): Danh tính tin cậy (trên Windows 10 x64).

  • Energy Consumption Values (Win 10): Giá trị tiêu thụ năng lượng (trên Windows 10).

  • Pico Context (Win 10): Ngữ cảnh Pico (trên Windows 10).

  • Protection Level and Signature: Mức độ bảo vệ và chữ ký.

  • DirectX Process: Thông tin về tiến trình DirectX.

  • Working Set: Bộ làm việc của tiến trình.

  • Section Object: Đối tượng vùng nhớ của tiến trình.

Các cấu trúc liên quan

  • TOKEN: Chứa các thông tin về quyền truy cập của tiến trình.

  • EJOB: Đối tượng công việc chứa các tiến trình.

  • HANDLE_TABLE: Bảng quản lý tay cầm của tiến trình.

  • PEB: Khối môi trường tiến trình chứa các thông tin môi trường.

  • ETHREAD: Đối tượng luồng của tiến trình.

  • W32PROCESS: Cấu trúc tiến trình Win32.

  • EWOW64PROCESS: Cấu trúc tiến trình Wow64 (chỉ dành cho hệ thống 64 bit).

  • DXGPROCESS: Cấu trúc tiến trình DirectX.

  • MMSUPPORT_FULL: Hỗ trợ bộ nhớ đầy đủ.

  • SECTION: Đối tượng vùng nhớ.

PsActiveProcessHead:

  • PsActiveProcessHead là một danh sách liên kết chứa tất cả các tiến trình hiện đang hoạt động trong hệ thống. Mỗi đối tượng EPROCESS có một liên kết tới danh sách này thông qua trường Active Process Link. Điều này cho phép hệ điều hành dễ dàng duyệt qua tất cả các tiến trình hiện tại.

Liên kết giữa các đối tượng EPROCESS:

  • Trong sơ đồ, mũi tên từ Active Process Link của một đối tượng EPROCESS trỏ tới một đối tượng EPROCESS khác cho thấy rằng các tiến trình được liên kết với nhau trong một danh sách liên kết đôi. Mỗi đối tượng EPROCESS có một liên kết tới đối tượng EPROCESS trước đó và tiếp theo trong danh sách.

Danh sách liên kết đôi:

  • Active Process Link là một trường trong cấu trúc EPROCESS cho phép mỗi tiến trình được kết nối trong một danh sách liên kết đôi. Điều này có nghĩa là mỗi tiến trình biết tiến trình trước nó và tiến trình sau nó, giúp việc duyệt qua danh sách các tiến trình trở nên dễ dàng và hiệu quả hơn.

KPROCESS:

KPROCESS là cấu trúc dữ liệu được sử dụng bởi các phần của kernel (hạt nhân của hệ điều hành) như dispatcher (bộ phân phối), scheduler (bộ lập lịch), và interrupt/time accounting code (mã tính toán ngắt/thời gian). Kernel là phần chịu trách nhiệm quản lý các chức năng cấp thấp và tương tác trực tiếp với phần cứng.

Bằng cách sử dụng KPROCESS cho các hoạt động liên quan đến kernel và EPROCESS cho các hoạt động liên quan đến executive, hệ điều hành có thể thay đổi hoặc nâng cấp một phần mà không ảnh hưởng đến phần còn lại. Điều này làm cho hệ điều hành trở nên mô-đun và dễ dàng bảo trì hơn.

Sơ đồ này hiển thị các thành phần chính của một đối tượng KPROCESS và các mối quan hệ giữa chúng. Đây là một phần quan trọng của hệ điều hành, giúp quản lý các tiến trình và luồng ở mức kernel.

Giải thích chi tiết các thành phần trong KPROCESS:

  1. Dispatcher Header:

    • Tiêu đề của bộ phân phối (dispatcher), chứa các thông tin cơ bản về tiến trình cần thiết cho việc lập lịch và chuyển ngữ cảnh.

  2. Process Page Directory Base:

    • Cơ sở của thư mục trang của tiến trình, dùng để quản lý không gian địa chỉ ảo của tiến trình.

  3. Kernel Time:

    • Thời gian CPU đã sử dụng trong chế độ kernel bởi tiến trình.

  4. User Time:

    • Thời gian CPU đã sử dụng trong chế độ người dùng bởi tiến trình.

  5. Cycle Time:

    • Tổng số chu kỳ CPU mà tiến trình đã sử dụng.

  6. Context Switches:

    • Số lần chuyển ngữ cảnh mà tiến trình đã trải qua.

  7. Thread List Head:

    • Đầu danh sách các luồng của tiến trình. Mũi tên từ đây trỏ tới cấu trúc KTHREAD, thể hiện danh sách các luồng thuộc về tiến trình.

  8. Process Lock:

    • Khóa bảo vệ của tiến trình, dùng để đảm bảo an toàn khi truy cập các tài nguyên liên quan đến tiến trình.

  9. Process Affinity:

    • Thiết lập về CPU affinity của tiến trình, xác định tiến trình có thể chạy trên các CPU nào.

  10. Process Flags:

    • Các cờ trạng thái của tiến trình.

  11. Ideal Node:

    • Nút lý tưởng để tiến trình chạy trên trong hệ thống NUMA (Non-Uniform Memory Access).

  12. Thread Seed:

    • Giá trị hạt giống dùng cho việc chọn luồng trong quá trình lập lịch.

  13. Base Priority:

    • Mức độ ưu tiên cơ bản của tiến trình.

  14. Process List Entry:

    • Mục trong danh sách tiến trình, liên kết các tiến trình với nhau.

  15. Instrumentation Callback:

    • Các callback được dùng cho việc đo lường và giám sát tiến trình.

  16. Secure Process ID:

    • ID bảo mật của tiến trình, dùng trong các ngữ cảnh bảo mật.

Các liên kết và mũi tên:

  • KPROCESS trỏ tới Page Directory:

    • Thể hiện liên kết giữa cấu trúc KPROCESS và cơ sở của thư mục trang của tiến trình.

  • KPROCESS trỏ tới KTHREAD:

    • Thể hiện danh sách các luồng thuộc về tiến trình. Mỗi KTHREAD đại diện cho một luồng cụ thể trong tiến trình.

PEB (Process Environment Block)

PEB là một cấu trúc dữ liệu trong bộ nhớ người dùng chứa thông tin về môi trường và trạng thái của một tiến trình. Đây là một phần quan trọng trong việc quản lý các tiến trình trong hệ điều hành.

Giải thích chi tiết về các thành phần trong PEB

  1. Image Base Address:

    • Địa chỉ cơ sở của tệp hình ảnh của tiến trình (thường là tệp .exe).

  2. Loader Database:

    • Cơ sở dữ liệu của bộ tải (loader), chứa thông tin về các module đã được tải bởi tiến trình.

    • Liên kết tới cấu trúc PEB_LDR_DATA.

  3. Thread Local Storage Data:

    • Dữ liệu lưu trữ cục bộ của luồng.

  4. Process Flags:

    • Các cờ trạng thái của tiến trình.

  5. Process Creation Parameters:

    • Thông số tạo tiến trình.

    • Liên kết tới cấu trúc RTL_USER_PROCESS_PARAMETERS.

  6. Process Heap (Pointer):

    • Con trỏ tới heap của tiến trình.

    • Liên kết tới Process heap.

  7. NT Global Flags:

    • Các cờ toàn cục của hệ điều hành.

  8. GDI Shared Handle Table (Pointer):

    • Con trỏ tới bảng tay cầm dùng chung của GDI (Graphics Device Interface).

    • Liên kết tới GDI shared handle table.

  9. Number of Processors:

    • Số lượng bộ xử lý (processors) trong hệ thống.

  10. Process Heaps Information:

    • Thông tin về các heap của tiến trình.

  11. Loader Lock:

    • Khóa của bộ tải, dùng để đồng bộ hóa.

    • Liên kết tới RTL_CRITICAL_SECTION.

  12. OS Version Information:

    • Thông tin về phiên bản hệ điều hành.

  13. AppCompat Data:

    • Dữ liệu tương thích ứng dụng.

  14. Shim Data:

    • Dữ liệu về các lớp shim (tương thích ứng dụng).

  15. Session ID:

    • ID của phiên làm việc mà tiến trình đang chạy.

  16. Fiber Local Storage Data:

    • Dữ liệu lưu trữ cục bộ của fiber.

  17. Assembly and Activation Context:

    • Ngữ cảnh của Assembly và Activation.

  18. CSRSS Shared Memory (Pointer):

    • Con trỏ tới bộ nhớ chia sẻ của CSRSS (Client/Server Runtime Subsystem).

  19. Thread Pool Information:

    • Thông tin về bộ luồng của tiến trình.

Liên kết và Mũi tên trong sơ đồ

  • PEB_LDR_DATA: Cấu trúc dữ liệu chứa thông tin về các module được tải bởi tiến trình.

  • RTL_USER_PROCESS_PARAMETERS: Cấu trúc chứa các thông số tạo tiến trình, như các biến môi trường, đối số dòng lệnh, và thông tin cửa sổ.

  • Process heap: Con trỏ tới heap chính của tiến trình, được sử dụng để quản lý bộ nhớ động.

  • GDI shared handle table: Bảng chứa các handle GDI dùng chung giữa các tiến trình.

  • RTL_CRITICAL_SECTION: Cấu trúc dữ liệu được sử dụng để thực hiện khóa đồng bộ hóa giữa các luồng.

Ví dụ:

lkd> .process /p ffff9b800f159080; !peb ef5d21c000
Implicit process is now ffff9b80`0f159080
PEB at 000000ef5d21c000
    InheritedAddressSpace:    No
    ReadImageFileExecOptions: No
    BeingDebugged:            No
    ImageBaseAddress:         00007ff6b7270000
    NtGlobalFlag:             0
    NtGlobalFlag2:            0
    Ldr                       00007ffc05c5c4c0
    Ldr.Initialized:          Yes
    Ldr.InInitializationOrderModuleList: 00000296314a24a0 . 00000296314bf420
    Ldr.InLoadOrderModuleList:           00000296314a2610 . 00000296314bf400
    Ldr.InMemoryOrderModuleList:         00000296314a2620 . 00000296314bf410
                    Base TimeStamp                     Module
            7ff6b7270000 fe3437fc Feb 23 19:24:28 2105 C:\Windows\servicing\TrustedInstaller.exe
            7ffc05af0000 8a1bb6f3 Jun 05 06:08:35 2043 C:\Windows\SYSTEM32\ntdll.dll
            7ffc03ee0000 9ec9da27 Jun 02 22:58:31 2054 C:\Windows\System32\KERNEL32.DLL
            7ffc03330000 f7a99bd4 Sep 02 14:03:48 2101 C:\Windows\System32\KERNELBASE.dll
            7ffc03230000 81cf5d89 Jan 05 21:32:41 2039 C:\Windows\System32\ucrtbase.dll
            7ffc05670000 c16ed6b5 Nov 02 05:56:53 2072 C:\Windows\System32\combase.dll
            7ffc03ba0000 582ed2ab Nov 18 17:06:35 2016 C:\Windows\System32\RPCRT4.dll
            7ffc059d0000 56a396bf Jan 23 22:05:35 2016 C:\Windows\System32\sechost.dll
            7ffc03840000 9723b943 May 09 16:20:03 2050 C:\Windows\System32\bcrypt.dll
            7ffc042f0000 80ac807d May 30 06:32:13 2038 C:\Windows\System32\advapi32.dll
            7ffc03b00000 9bf60e04 Nov 30 22:38:44 2052 C:\Windows\System32\msvcrt.dll
            7ffbd67f0000 7180484e May 06 00:28:46 2030 C:\Windows\winsxs\amd64_microsoft-windows-servicingstack_31bf3856ad364e35_10.0.19041.4467_none_7e0f83e07c8c1985\wdscore.dll
            7ffc04460000 d42edff1 Oct 22 03:56:17 2082 C:\Windows\System32\OLEAUT32.dll
            7ffc03750000 39255ccf May 19 22:25:03 2000 C:\Windows\System32\msvcp_win.dll
            7ffc014f0000 9a866525 Feb 26 01:36:21 2052 C:\Windows\system32\dbghelp.dll
            7ffbe9ef0000 a4254c09 Apr 08 05:22:01 2057 C:\Windows\SYSTEM32\dbgcore.DLL
            7ffc01c00000 76a5b55a Jan 29 07:29:14 2033 C:\Windows\SYSTEM32\kernel.appcore.dll
            7ffc03a70000 f6d7e9ff Mar 27 12:41:19 2101 C:\Windows\System32\bcryptPrimitives.dll
            7ffc04530000 95bf155e Aug 12 03:53:50 2049 C:\Windows\System32\user32.dll
            7ffc03870000 c6e09c3a Sep 25 10:47:06 2075 C:\Windows\System32\win32u.dll
            7ffc043d0000 d8a41a47 Mar 05 19:21:27 2085 C:\Windows\System32\GDI32.dll
            7ffc03630000 4894be87 Aug 03 03:07:35 2008 C:\Windows\System32\gdi32full.dll
            7ffc04240000 05d2bc43 Feb 05 01:00:35 1973 C:\Windows\System32\clbcatq.dll
            7ffbc1e30000 292f70b5 Nov 24 16:28:21 1991 C:\Windows\servicing\CbsApi.dll
    SubSystemData:     0000000000000000
    ProcessHeap:       00000296314a0000
    ProcessParameters: 00000296314a1c30
    CurrentDirectory:  'C:\Windows\system32\'
    WindowTitle:  'C:\Windows\servicing\TrustedInstaller.exe'
    ImageFile:    'C:\Windows\servicing\TrustedInstaller.exe'
    CommandLine:  'C:\Windows\servicing\TrustedInstaller.exe'
    DllPath:      '< Name not readable >'
    Environment:  00000296314a0fe0
        ALLUSERSPROFILE=C:\ProgramData
        APPDATA=C:\Windows\system32\config\systemprofile\AppData\Roaming
        CommonProgramFiles=C:\Program Files\Common Files
        CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
        CommonProgramW6432=C:\Program Files\Common Files
        COMPUTERNAME=ANM-TRUNGPQ6
        ComSpec=C:\Windows\system32\cmd.exe
        DriverData=C:\Windows\System32\Drivers\DriverData
        LOCALAPPDATA=C:\Windows\system32\config\systemprofile\AppData\Local
        NUMBER_OF_PROCESSORS=6
        OS=Windows_NT
        Path=C:\Program Files (x86)\VMware\VMware Workstation\bin\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NetSarang\Xshell 7\;C:\Program Files (x86)\NetSarang\Xftp 7\;C:\Program Files\dotnet\;D:\Windows Kits\10\Windows Performance Toolkit\;C:\Windows\system32\config\systemprofile\AppData\Local\Microsoft\WindowsApps
        PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
        PROCESSOR_ARCHITECTURE=AMD64
        PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 158 Stepping 10, GenuineIntel
        PROCESSOR_LEVEL=6
        PROCESSOR_REVISION=9e0a
        ProgramData=C:\ProgramData
        ProgramFiles=C:\Program Files
        ProgramFiles(x86)=C:\Program Files (x86)
        ProgramW6432=C:\Program Files
        PSModulePath=%ProgramFiles%\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules
        PUBLIC=C:\Users\Public
        SystemDrive=C:
        SystemRoot=C:\Windows
        TEMP=C:\Windows\TEMP
        TMP=C:\Windows\TEMP
        USERDOMAIN=WORKGROUP
        USERNAME=ANM-TRUNGPQ6$
        USERPROFILE=C:\Windows\system32\config\systemprofile
        windir=C:\Windows
        ZES_ENABLE_SYSMAN=1
  • InheritedAddressSpace:

    • Giá trị: No

    • Mô tả: Cho biết liệu tiến trình có kế thừa không gian địa chỉ từ tiến trình cha hay không. Trong trường hợp này, tiến trình không kế thừa không gian địa chỉ.

  • ReadImageFileExecOptions:

    • Giá trị: No

    • Mô tả: Cho biết liệu các tùy chọn thực thi tệp hình ảnh đã được đọc hay chưa. Trong trường hợp này, chúng chưa được đọc.

  • BeingDebugged:

    • Giá trị: No

    • Mô tả: Cho biết liệu tiến trình có đang được gỡ lỗi hay không. Trong trường hợp này, tiến trình không bị gỡ lỗi.

  • ImageBaseAddress:

    • Giá trị: 00007ff6b7270000

    • Mô tả: Địa chỉ cơ sở của tệp hình ảnh của tiến trình (TrustedInstaller.exe).

  • NtGlobalFlag:

    • Giá trị: 0

    • Mô tả: Các cờ toàn cục của hệ điều hành cho tiến trình. Ở đây không có cờ nào được thiết lập.

  • NtGlobalFlag2:

    • Giá trị: 0

    • Mô tả: Các cờ toàn cục bổ sung của hệ điều hành cho tiến trình. Ở đây không có cờ nào được thiết lập.

  • Ldr:

    • Giá trị: 00007ffc05c5c4c0

    • Mô tả: Con trỏ đến cấu trúc PEB_LDR_DATA, chứa thông tin về các module đã được tải bởi tiến trình.

  • Ldr.Initialized:

    • Giá trị: Yes

    • Mô tả: Cho biết liệu bộ tải (loader) đã được khởi tạo hay chưa.

  • Ldr.InInitializationOrderModuleList:

    • Giá trị: 00000296314a24a0 . 00000296314bf420

    • Mô tả: Liên kết tới danh sách các module theo thứ tự khởi tạo.

  • Ldr.InLoadOrderModuleList:

    • Giá trị: 00000296314a2610 . 00000296314bf400

    • Mô tả: Liên kết tới danh sách các module theo thứ tự tải.

  • Ldr.InMemoryOrderModuleList:

    • Giá trị: 00000296314a2620 . 00000296314bf410

    • Mô tả: Liên kết tới danh sách các module theo thứ tự trong bộ nhớ.

  • Base TimeStamp và Module:

    • Danh sách các module đã được tải:

      • C:\Windows\servicing\TrustedInstaller.exe

      • C:\Windows\SYSTEM32\ntdll.dll

      • C:\Windows\System32\KERNEL32.DLL

      • C:\Windows\System32\KERNELBASE.dll

      • C:\Windows\System32\ucrtbase.dll

      • C:\Windows\System32\combase.dll

      • C:\Windows\System32\RPCRT4.dll

      • C:\Windows\System32\sechost.dll

      • C:\Windows\System32\bcrypt.dll

      • C:\Windows\System32\advapi32.dll

      • C:\Windows\System32\msvcrt.dll

      • C:\Windows\winsxs\amd64_microsoft-windows-servicingstack_31bf3856ad364e35_10.0.19041.4467_none_7e0f83e07c8c1985\wdscore.dll

      • C:\Windows\System32\OLEAUT32.dll

      • C:\Windows\System32\msvcp_win.dll

      • C:\Windows\system32\dbghelp.dll

      • C:\Windows\SYSTEM32\dbgcore.DLL

      • C:\Windows\SYSTEM32\kernel.appcore.dll

      • C:\Windows\System32\bcryptPrimitives.dll

      • C:\Windows\System32\user32.dll

      • C:\Windows\System32\win32u.dll

      • C:\Windows\System32\GDI32.dll

      • C:\Windows\System32\gdi32full.dll

      • C:\Windows\System32\clbcatq.dll

      • C:\Windows\servicing\CbsApi.dll

  • SubSystemData:

    • Giá trị: 0000000000000000

    • Mô tả: Thông tin về hệ thống con (subsystem). Ở đây không có dữ liệu hệ thống con.

  • ProcessHeap:

    • Giá trị: 00000296314a0000

    • Mô tả: Địa chỉ của heap chính của tiến trình.

  • ProcessParameters:

    • Giá trị: 00000296314a1c30

    • Mô tả: Địa chỉ của cấu trúc RTL_USER_PROCESS_PARAMETERS, chứa các thông số của tiến trình như dòng lệnh, thư mục hiện tại, và biến môi trường.

  • CurrentDirectory:

    • Giá trị: 'C:\Windows\system32'

    • Mô tả: Thư mục hiện tại của tiến trình.

  • WindowTitle:

    • Giá trị: 'C:\Windows\servicing\TrustedInstaller.exe'

    • Mô tả: Tiêu đề của cửa sổ tiến trình.

  • ImageFile:

    • Giá trị: 'C:\Windows\servicing\TrustedInstaller.exe'

    • Mô tả: Đường dẫn đến tệp hình ảnh của tiến trình.

  • CommandLine:

    • Giá trị: 'C:\Windows\servicing\TrustedInstaller.exe'

    • Mô tả: Dòng lệnh được sử dụng để khởi chạy tiến trình.

  • DllPath:

    • Giá trị: '< Name not readable >'

    • Mô tả: Đường dẫn tới thư mục chứa các tệp DLL. Ở đây không thể đọc được tên.

  • Environment:

    • Giá trị: 00000296314a0fe0

    • Mô tả: Địa chỉ của khối môi trường chứa các biến môi trường của tiến trình.

  • Danh sách các biến môi trường:

    • ALLUSERSPROFILE: C:\ProgramData

    • APPDATA: C:\Windows\system32\config\systemprofile\AppData\Roaming

    • CommonProgramFiles: C:\Program Files\Common Files

    • CommonProgramFiles(x86): C:\Program Files (x86)\Common Files

    • CommonProgramW6432: C:\Program Files\Common Files

    • COMPUTERNAME: ANM-TRUNGPQ6

    • ComSpec: C:\Windows\system32\cmd.exe

    • DriverData: C:\Windows\System32\Drivers\DriverData

    • LOCALAPPDATA: C:\Windows\system32\config\systemprofile\AppData\Local

    • NUMBER_OF_PROCESSORS: 6

    • OS: Windows_NT

    • Path: C:\Program Files (x86)\VMware\VMware Workstation\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Program Files (x86)\NetSarang\Xshell 7;C:\Program Files (x86)\NetSarang\Xftp 7;C:\Program Files\dotnet;D:\Windows Kits\10\Windows Performance Toolkit;C:\Windows\system32\config\systemprofile\AppData\Local\Microsoft\WindowsApps

    • PATHEXT: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

    • PROCESSOR_ARCHITECTURE: AMD64

    • PROCESSOR_IDENTIFIER: Intel64 Family 6 Model 158 Stepping 10, GenuineIntel

    • PROCESSOR_LEVEL: 6

    • PROCESSOR_REVISION: 9e0a

    • ProgramData: C:\ProgramData

    • ProgramFiles: C:\Program Files

    • ProgramFiles(x86): C:\Program Files (x86)

    • ProgramW6432: C:\Program Files

    • PSModulePath: %ProgramFiles%\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules

    • PUBLIC: C:\Users\Public

    • SystemDrive: C:

    • SystemRoot: C:\Windows

    • TEMP: C:\Windows\TEMP

    • TMP: C:\Windows\TEMP

    • USERDOMAIN: WORKGROUP

    • USERNAME: ANM-TRUNGPQ6$

    • USERPROFILE: C:\Windows\system32\config\systemprofile

    • windir: C:\Windows

    • ZES_ENABLE_SYSMAN: 1

CRS_PROCESS:

iải thích các thành phần trong cấu trúc CSR_PROCESS

  1. Client ID:

    • ID của tiến trình khách hàng (Client ID).

  2. Process Link:

    • Liên kết tới các cấu trúc CSR_PROCESS khác, có thể được sử dụng để tạo danh sách liên kết của các tiến trình.

  3. Thread List Head:

    • Đầu danh sách các luồng (threads) của tiến trình. Liên kết tới cấu trúc CSR_THREAD.

  4. Client Port Handle:

    • Tay cầm của cổng khách hàng (Client Port Handle).

  5. Process Handle:

    • Tay cầm của tiến trình (Process Handle).

  6. Client View Data:

    • Dữ liệu về góc nhìn của khách hàng (Client View Data).

  7. Session Data:

    • Dữ liệu về phiên làm việc (Session Data). Liên kết tới cấu trúc CSR_NT_SESSION.

  8. Process Flags:

    • Các cờ trạng thái của tiến trình (Process Flags).

  9. Reference Count:

    • Bộ đếm tham chiếu (Reference Count).

  10. Messages Data:

    • Dữ liệu về các thông điệp (Messages Data).

  11. Shutdown Level:

    • Mức độ tắt (Shutdown Level).

  12. Flags:

    • Các cờ bổ sung (Flags).

  13. Process Group Data:

    • Dữ liệu về nhóm tiến trình (Process Group Data).

  14. Server Data:

    • Dữ liệu của máy chủ (Server Data). Mỗi cái tương ứng với một CSR_SERVER_DLL.

Các mối liên kết trong sơ đồ

  • CSR_PROCESS:

    • Liên kết tới các cấu trúc CSR_PROCESS khác để tạo danh sách liên kết của các tiến trình.

  • CSR_THREAD:

    • Liên kết tới danh sách các luồng của tiến trình thông qua Thread List Head.

  • CSR_NT_SESSION:

    • Liên kết tới dữ liệu phiên làm việc của hệ thống NT, cung cấp thông tin về phiên làm việc mà tiến trình thuộc về.

  • One per CSR_SERVER_DLL:

    • Liên kết tới các dữ liệu máy chủ, mỗi cái tương ứng với một CSR_SERVER_DLL. Điều này cho thấy rằng mỗi DLL máy chủ có dữ liệu riêng trong cấu trúc này.

Ví dụ:

lkd> dt csrss!_csr_process ffff9b8012e98080
   +0x000 ClientId         : _CLIENT_ID
   +0x010 ListLink         : _LIST_ENTRY [ 0xffff9b80`12e98088 - 0xffff9b80`12e98098 ]
   +0x020 ThreadList       : _LIST_ENTRY [ 0xffff9b80`12e98098 - 0x00000001`a3c28002 ]
   +0x030 NtSession        : 0xffff9b80`08a98378 _CSR_NT_SESSION
   +0x038 ClientPort       : 0xffff9b80`08a98378 Void
   +0x040 ClientViewBase   : (null) 
   +0x048 ClientViewBounds : (null) 
   +0x050 ProcessHandle    : 0x00000000`00140001 Void
   +0x058 SequenceNumber   : 0x3f
   +0x05c Flags            : 0
   +0x060 DebugFlags       : 0
   +0x064 ReferenceCount   : 0n0
   +0x068 ProcessGroupId   : 0
   +0x06c ProcessGroupSequence : 0
   +0x070 LastMessageSequence : 0
   +0x074 NumOutstandingMessages : 0
   +0x078 ShutdownLevel    : 0
   +0x07c ShutdownFlags    : 0
   +0x080 Luid             : _LUID
   +0x088 ServerDllPerProcessData : [1] (null) 

Windbg:

Lệnh dt:

  • Lệnh dt (Display Type) trong WinDbg được sử dụng để hiển thị thông tin chi tiết về một cấu trúc dữ liệu (data type).

  • Cú pháp cơ bản: dt [ModuleName!]TypeName [Address].

  • nt là module kernel.

Xem cấu trúc EPROCESS: dt nt!_eprocess.

Xem cấu trúc KPROCESS: dt nt!_kprocess.

Xem từng thành phần của EPROCESS: dt nt!_eprocess Pcb.

Xem đệ quy: thêm -r. Điều chỉnh độ sâu của đệ quy: -r <number>.

Lấy địa chỉ của tất cả cấu trúc EPROCESS trong hệ thống: !process 0 0.

Chỉ định program: !process 0 0 [xxx.exe].

Xem giá trị cụ thể của từng thành phần EPROCESS của một tiến trình: dt nt!_eprocess <address>.

Do KPROCESS là phần đầu của EPROCESS nên address trên cũng có thể dùng để xem KPROCESS. Hay dt nt!_kprocess <address>.

Hiển thị thông tin chi tiết về 1 tiến trình: !process [Address/PID]. (PID bằng hex)

Nếu không ghi gì, nó sẽ hiển thị thông tin về tiến trình sở hữu luồng hiện đang chạy trên CPU 0

Ví dụ:

lkd> !process
PROCESS ffff9b800ab8c080
    SessionId: 2  Cid: 380c    Peb: ac54fc4000  ParentCid: 2144
    DirBase: 92465002  ObjectTable: ffffbd0cf3391b40  HandleCount: 169.
    Image: EngHost.exe
    VadRoot ffff9b8009c05960 Vads 93 Clone 0 Private 5786. Modified 1875. Locked 1.
    DeviceMap ffffbd0cfe1a8800
    Token                             ffffbd0cf3cc05f0
    ElapsedTime                       00:44:32.749
    UserTime                          00:00:00.015
    KernelTime                        00:00:00.015
    QuotaPoolUsage[PagedPool]         173312
    QuotaPoolUsage[NonPagedPool]      13424
    Working Set Sizes (now,min,max)  (9675, 50, 345) (38700KB, 200KB, 1380KB)
    PeakWorkingSetSize                11440
    VirtualSize                       2101410 Mb
    PeakVirtualSize                   2101410 Mb
    PageFaultCount                    19976
    MemoryPriority                    BACKGROUND
    BasePriority                      8
    CommitCharge                      8407
    Job                               ffff9b800386b060
  • PROCESS ffff9b800ab8c080:

    • Đây là địa chỉ của cấu trúc EPROCESS đại diện cho tiến trình EngHost.exe.

  • SessionId: 2:

    • ID của phiên làm việc (session) mà tiến trình này đang chạy.

  • Cid: 380c:

    • Client ID (CID), hay Process ID (PID) của tiến trình, ở dạng thập lục phân (hexadecimal).

  • Peb: ac54fc4000:

    • Địa chỉ của Process Environment Block (PEB), một cấu trúc dữ liệu chứa thông tin về môi trường của tiến trình.

  • ParentCid: 2144:

    • Client ID của tiến trình cha (parent process).

  • DirBase: 92465002:

    • Địa chỉ cơ sở của thư mục trang, sử dụng để quản lý không gian địa chỉ ảo của tiến trình.

  • ObjectTable: ffffbd0cf3391b40:

    • Địa chỉ của bảng đối tượng, quản lý các tay cầm (handles) của tiến trình.

  • HandleCount: 169:

    • Số lượng tay cầm (handles) mà tiến trình đang sử dụng.

  • Image: EngHost.exe:

    • Tên của tệp hình ảnh tiến trình.

  • VadRoot ffff9b8009c05960 Vads 93 Clone 0 Private 5786. Modified 1875. Locked 1:

    • VadRoot: Địa chỉ của Virtual Address Descriptor (VAD) root.

    • Vads: Số lượng VAD.

    • Clone: Số lượng không gian địa chỉ được sao chép.

    • Private: Số lượng trang bộ nhớ riêng tư.

    • Modified: Số lượng trang bộ nhớ đã bị chỉnh sửa.

    • Locked: Số lượng trang bộ nhớ bị khóa.

  • DeviceMap ffffbd0cfe1a8800:

    • Địa chỉ của Device Map, sử dụng để ánh xạ thiết bị.

  • Token ffffbd0cf3cc05f0:

    • Địa chỉ của Access Token đại diện cho quyền truy cập của tiến trình.

  • ElapsedTime 00:44:32.749:

    • Thời gian tiến trình đã chạy.

  • UserTime 00:00:00.015:

    • Thời gian CPU sử dụng ở chế độ người dùng.

  • KernelTime 00:00:00.015:

    • Thời gian CPU sử dụng ở chế độ kernel.

  • QuotaPoolUsage[PagedPool] 173312:

    • Số lượng bộ nhớ từ paged pool mà tiến trình sử dụng.

  • QuotaPoolUsage[NonPagedPool] 13424:

    • Số lượng bộ nhớ từ nonpaged pool mà tiến trình sử dụng.

  • Working Set Sizes (now,min,max) (9675, 50, 345) (38700KB, 200KB, 1380KB):

    • Kích thước bộ nhớ làm việc hiện tại, tối thiểu và tối đa.

  • PeakWorkingSetSize 11440:

    • Kích thước bộ nhớ làm việc lớn nhất đã đạt.

  • VirtualSize 2101410 Mb:

    • Kích thước bộ nhớ ảo của tiến trình.

  • PeakVirtualSize 2101410 Mb:

    • Kích thước bộ nhớ ảo lớn nhất đã đạt.

  • PageFaultCount 19976:

    • Số lần page fault (khi tiến trình cần truy cập vào bộ nhớ không có trong RAM và phải lấy từ đĩa cứng).

  • MemoryPriority BACKGROUND:

    • Ưu tiên bộ nhớ của tiến trình là nền (background).

  • BasePriority 8:

    • Mức độ ưu tiên cơ bản của tiến trình.

  • CommitCharge 8407:

    • Lượng bộ nhớ mà tiến trình cam kết sử dụng.

  • Job ffff9b800386b060:

    • Địa chỉ của đối tượng công việc (job object) nếu tiến trình là một phần của một job.

Trong kết quả của lệnh !process, bạn thấy thông tin sau:

ElapsedTime                       00:44:32.749
UserTime                          00:00:00.015
KernelTime                        00:00:00.015

Điều này có nghĩa là tiến trình EngHost.exe đã tồn tại trong khoảng thời gian 44 phút 32 giây, nhưng chỉ sử dụng 15 mili giây ở chế độ người dùng và 15 mili giây ở chế độ kernel. Điều này có thể xảy ra vì:

  • Tiến trình có thể chủ yếu ở trạng thái chờ hoặc ngủ.

  • Tiến trình có thể thực hiện các tác vụ rất nhẹ nhàng không đòi hỏi nhiều thời gian CPU.

  • Tiến trình có thể bị gián đoạn nhiều lần và chỉ hoạt động trong các khoảng thời gian ngắn.

Dump process handle table: !handle [Address/PID].

Pause command: Ctrl + Break hoặc Ctrl + Fn + Break.

Do PEB nằm trong không gian địa chỉ người dùng (user-mode address space), nó chỉ hợp lệ trong ngữ cảnh của tiến trình sở hữu nó. Để xem PEB của một tiến trình khác, bạn cần chuyển đổi ngữ cảnh WinDbg sang tiến trình đó. Lệnh: .process /p [Address]; !peb [PebAddress].

Nếu không xem được structure nào thì gọi lệnh đó nhưng thêm address của process sử dụng cấu trúc đó, nó sẽ tự down symbol về cho mình. Ví dụ: dt win32k!_W32PROCESS ffff9b80018f1340 or dt csrss!_csr_process ffff9b8012e98080.

Test

notepad.exe

viber.exe

linh tinh:

Stack canary là một biện pháp bảo vệ được sử dụng để phát hiện và ngăn chặn các cuộc tấn công buffer overflow. Nó hoạt động bằng cách đặt một giá trị ngẫu nhiên (gọi là canary) giữa các biến cục bộ của hàm và địa chỉ trả về của hàm. Khi hàm kết thúc, giá trị canary này sẽ được kiểm tra lại. Nếu giá trị canary đã bị thay đổi, điều này có nghĩa là có một cuộc tấn công buffer overflow đã xảy ra và chương trình sẽ kết thúc để ngăn chặn khai thác tiếp.

Position Independent Executable (PIE) và Address Space Layout Randomization (ASLR) đều là kỹ thuật bảo mật được sử dụng để làm khó khăn hơn cho các cuộc tấn công khai thác bộ nhớ, nhưng chúng hoạt động ở các cấp độ khác nhau và có các mục tiêu khác nhau. Dưới đây là sự khác biệt chính giữa PIE và ASLR:

Address Space Layout Randomization (ASLR)

  1. Mục tiêu:

    • ASLR được thiết kế để ngẫu nhiên hóa vị trí của các vùng bộ nhớ chính trong không gian địa chỉ của một quá trình, bao gồm stack, heap, các thư viện chia sẻ (shared libraries), và các phân đoạn của chương trình (như text segment, data segment).

  2. Cách thức hoạt động:

    • Mỗi lần một chương trình được chạy, vị trí của các thành phần này sẽ thay đổi ngẫu nhiên trong không gian địa chỉ.

    • Ví dụ, địa chỉ base của các thư viện chia sẻ (như libc) sẽ thay đổi mỗi lần chương trình khởi động lại.

  3. Lợi ích bảo mật:

    • Làm khó khăn hơn cho kẻ tấn công dự đoán các địa chỉ cụ thể trong bộ nhớ, từ đó làm cho việc thực hiện các cuộc tấn công như buffer overflow hoặc return-oriented programming (ROP) trở nên khó khăn hơn.

Position Independent Executable (PIE)

  1. Mục tiêu:

    • PIE cho phép chính bản thân mã thực thi của chương trình (executable code) có thể được tải vào bất kỳ vị trí nào trong không gian địa chỉ bộ nhớ.

  2. Cách thức hoạt động:

    • Chương trình được biên dịch với các tùy chọn để trở thành một "position-independent executable". Điều này có nghĩa là mọi địa chỉ bên trong chương trình đều được tính toán tương đối thay vì tuyệt đối.

    • Kết quả là chương trình có thể chạy tại bất kỳ vị trí nào trong bộ nhớ mà không cần phải sửa đổi mã nguồn của nó.

  3. Lợi ích bảo mật:

    • Kết hợp với ASLR, PIE làm cho địa chỉ base của chính bản thân mã thực thi chương trình thay đổi mỗi lần chương trình chạy.

    • Điều này có nghĩa là không chỉ các thư viện chia sẻ, mà còn cả chính mã thực thi của chương trình cũng thay đổi vị trí trong không gian địa chỉ, làm tăng tính ngẫu nhiên và độ khó cho các cuộc tấn công khai thác bộ nhớ.

Sự khác biệt chính:

  • ASLR: Áp dụng cho toàn bộ không gian địa chỉ của quá trình, bao gồm cả stack, heap, và các thư viện chia sẻ. Mục tiêu là ngẫu nhiên hóa vị trí của các thành phần trong bộ nhớ để làm khó khăn cho việc dự đoán địa chỉ cụ thể.

  • PIE: Áp dụng cho chính mã thực thi của chương trình. Mục tiêu là làm cho chính mã chương trình có thể chạy tại bất kỳ vị trí nào trong không gian địa chỉ, thường kết hợp với ASLR để ngẫu nhiên hóa vị trí base của chương trình.

Last updated