VulnCity

Process Injection؛ از مبانی Windows Process

نویسنده: یاسین عابدینی · دسته: RedTeam · تاریخ انتشار: ۱۴۰۵/۶/۱۴

Process Injection؛ از مبانی Windows Process تا تکنیک‌های پیشرفته Red Team

یکی از مفاهیم مهم در Windows Internals و همچنین یکی از تکنیک‌های شناخته‌شده در Malware Development و Red Team، مفهوم Process Injection است.

در یک نگاه ساده، Process Injection به مجموعه‌ای از Techniqueها گفته می‌شود که در آن یک Process تلاش می‌کند Code یا Data را وارد Address Space یک Process دیگر کند و سپس باعث اجرای آن Code در Context مربوط به Process مقصد شود.

این تعریف در ظاهر ساده است، اما پشت آن مجموعه‌ای از مفاهیم مهم Windows قرار دارد:

  • - Process و Thread
    - Virtual Address Space
    - Process Handle
    - Access Token
    - Virtual Memory
    - PE Format
    - DLL و Module Loading
    - PEB و TEB
    - Windows API
    - Native API
    - Thread Execution
    - APC
    - Remote Thread
    - WOW64
    - x86/x64 Architecture

بنابراین برای درک واقعی Process Injection، صرفاً دانستن چند API مانند:

OpenProcess()
VirtualAllocEx()
WriteProcessMemory()
CreateRemoteThread()

کافی نیست.

باید بدانیم چرا این APIها وجود دارند، چه اتفاقی در Memory می‌افتد، Thread چگونه Code را اجرا می‌کند، Processها چگونه از یکدیگر جدا می‌شوند و مهاجم چگونه این Isolation را به شکل کنترل‌شده دور می‌زند.

در Windows، هر Process دارای Virtual Address Space اختصاصی خود است و Threadهای آن Process در همان Address Space اجرا می‌شوند. در نتیجه، Thread در واقع واحدی است که توسط Scheduler برای اجرای CPU زمان‌بندی می‌شود، نه خود Process.

در این مقاله، Process Injection را از پایه تا مباحث پیشرفته بررسی می‌کنیم.


1. Process Injection چیست؟

Process Injection تکنیکی برای اجرای Code در Address Space یک Process دیگر است.

MITRE ATT&CK این Technique را با شناسه: T1055 - Process Injection دسته‌بندی می‌کند.

در نسخه فعلی MITRE ATT&CK، Process Injection شامل Sub-techniqueهای مختلفی مانند:

  • - Dynamic-link Library Injection
    - Portable Executable Injection
    - Thread Execution Hijacking
    - Asynchronous Procedure Call
    - Thread Local Storage
    - Process Hollowing
    - Process Doppelgänging
    - VDSO Hijacking
    - ListPlanting

و چند Technique دیگر است.

نکته مهم این است که:

Process Injection یک Technique واحد نیست؛ بلکه یک خانواده از Techniqueهای مختلف برای اجرای Code در Context یک Process دیگر است.


2. چرا Process Injection اهمیت دارد؟

فرض کنیم یک Malware به شکل معمولی اجرا شود:

malware.exe

در این حالت Process مربوط به Malware به صورت مستقیم در سیستم وجود دارد و رفتار آن برای Security Productها قابل مشاهده است.

اما در Process Injection، معماری می‌تواند به شکل زیر باشد:

1. malware.exe
2. inject
3. explorer.exe
4. malicious code

در این حالت Code مهاجم داخل Process دیگری اجرا می‌شود.

این موضوع می‌تواند برای موارد مختلفی استفاده شود:

Defense Evasion

مهاجم ممکن است بخواهد Execution خود را در Context یک Process معتبر انجام دهد.

Process Migration

در برخی Red Team Frameworkها، Agent می‌تواند Execution خود را به Process دیگری منتقل کند.

Access به Resources

Code تزریق‌شده در Context Process مقصد می‌تواند به Memory، Network Resources و سایر منابعی که Process مقصد به آن‌ها دسترسی دارد، دسترسی داشته باشد.

Privilege Context

اگر Process مقصد دارای Security Context متفاوت یا Privileged باشد، اجرای Code در آن Context می‌تواند اهمیت امنیتی زیادی داشته باشد.

البته یک نکته بسیار مهم:

Process Injection به خودی خود به معنی Privilege Escalation نیست.

اگر Process مهاجم و Process مقصد هر دو تحت یک User و سطح دسترسی مشابه باشند، Injection الزاماً باعث افزایش Privilege نمی‌شود.

MITRE نیز Process Injection را در زمینه‌هایی مانند Defense Evasion و در برخی سناریوها Privilege Escalation مرتبط می‌داند.


3. Process در Windows چگونه کار می‌کند؟

برای درک Injection ابتدا باید Process را بشناسیم.

Microsoft یک Process را مجموعه‌ای از منابع لازم برای اجرای یک Program تعریف می‌کند. این منابع شامل مواردی مانند:

  • - Virtual Address Space
    - Executable Code
    - Handles
    - Security Context
    - Process ID
    - Environment
    - Loaded Modules
    - Threads

است. هر Process حداقل یک Thread دارد.

به صورت مفهومی:

Process
│
├── Virtual Address Space
│
├── Executable Image
│
├── DLLs
│
├── Heap
│
├── Stack(s)
│
├── Handles
│
├── Security Token
│
├── PEB
│
└── Threads
     │
     ├── Thread 1
     ├── Thread 2
     └── Thread 3

نکته بسیار مهم:

CPU مستقیماً Process را اجرا نمی‌کند؛ CPU Thread را اجرا می‌کند.

به همین دلیل بخش مهمی از Process Injection در نهایت به این سؤال برمی‌گردد:

چگونه می‌توان کاری کرد که یک Thread در Process مقصد، Code موردنظر مهاجم را اجرا کند؟


4. Virtual Address Space چیست؟

هر Process در Windows دارای Virtual Address Space خودش است.

برای مثال:

Process A
+----------------------+
| Virtual Address Space|
|                      |
| Code                 |
| DLLs                 |
| Heap                 |
| Stack                |
| Data                 |
+----------------------+

Process B
+----------------------+
| Virtual Address Space|
|                      |
| Code                 |
| DLLs                 |
| Heap                 |
| Stack                |
| Data                 |
+----------------------+

این دو Address Space به صورت منطقی از یکدیگر جدا هستند.

Microsoft توضیح می‌دهد که Virtual Address Space هر Process خصوصی است و Processهای دیگر به صورت عادی نمی‌توانند آن را Access کنند.

اما Windows APIهایی فراهم می‌کند که با داشتن Permission مناسب، یک Process بتواند Memory مربوط به Process دیگر را Manipulate کند.

و این دقیقاً جایی است که Process Injection وارد می‌شود.


5. Process Handle چیست؟

برای Manipulate کردن یک Process دیگر، معمولاً ابتدا باید یک Handle به آن Process داشته باشیم.

برای مثال:

OpenProcess(...)

به صورت مفهومی:

Attacker
   |
   | OpenProcess()
   v
Target Process
   |
   v
Process Handle

Handle در Windows یک Reference به یک Object است که Process می‌تواند از طریق آن با Object مربوطه تعامل داشته باشد.

سطح دسترسی Handle اهمیت بسیار زیادی دارد.

برای مثال Operationهایی مانند:

PROCESS_VM_READ
PROCESS_VM_WRITE
PROCESS_VM_OPERATION
PROCESS_CREATE_THREAD

هرکدام Permissionهای متفاوتی ایجاد می‌کنند.

در نمونه‌ای که در فایل POC قرار دارد، Code از:

OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

استفاده می‌کند.

در محیط واقعی، استفاده از PROCESS_ALL_ACCESS الزاماً بهترین روش نیست و می‌تواند Detection را نیز ساده‌تر کند.


6. Thread چیست و چرا در Injection مهم است؟

Thread واحد Execution داخل Process است.

تمام Threadهای یک Process، Virtual Address Space آن Process را Share می‌کنند.

مثلاً:

Process
│
├── Thread A
├── Thread B
└── Thread C

Shared Virtual Address Space

بنابراین اگر Code جدیدی وارد Address Space یک Process شود، باید یک مکانیزم برای اجرای آن Code وجود داشته باشد.

این مکانیزم می‌تواند:

  • ایجاد Remote Thread

  • Hijacking یک Thread موجود

  • Queue کردن APC

  • تغییر Execution Context

  • استفاده از Loader

  • یا Techniqueهای دیگر

باشد.


7. مدل کلاسیک Process Injection

یکی از ساده‌ترین مدل‌های Process Injection را می‌توان در چهار مرحله خلاصه کرد:

1. Find Target Process
2. Obtain Process Handle
3. Allocate + Write Memory
4. Execute the Payload

این دقیقاً همان Flowی است که در POC ارسالی مشاهده می‌شود.

به شکل دقیق‌تر:

CreateToolhelp32Snapshot
          |
          v
Process32First / Process32Next
          |
          v
Find PID
          |
          v
OpenProcess
          |
          v
VirtualAllocEx
          |
          v
WriteProcessMemory
          |
          v
CreateRemoteThread
          |
          v
Payload Execution

این Flow یکی از مهم‌ترین Patternهایی است که یک SOC Analyst یا Threat Hunter باید بتواند تشخیص دهد.


8. مرحله اول؛ پیدا کردن Target Process

در POC اول، Processهای موجود در سیستم Enumerate می‌شوند.

Code از:

CreateToolhelp32Snapshot()

برای ایجاد Snapshot استفاده می‌کند و سپس:

Process32First()
Process32Next()

را برای پیمایش Processها به کار می‌گیرد.

در نمونه، Process موردنظر:

msedge.exe

9. مرحله دوم؛ OpenProcess

پس از پیدا کردن PID، Process مهاجم باید Handle مربوط به Target را دریافت کند.

نمونه:

OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

در فایل‌های نمونه نیز همین Pattern مشاهده می‌شود.

از دید مفهومی:

PID
 |
 v
OpenProcess()
 |
 v
HANDLE
 |
 +--> Read Memory
 +--> Write Memory
 +--> Allocate Memory
 +--> Create Thread

سطح Permission تعیین می‌کند چه Operationهایی امکان‌پذیر باشند.


10. مرحله سوم؛ VirtualAllocEx

اکنون مهاجم باید Memory در Address Space مربوط به Process مقصد ایجاد کند.

برای این کار در Classic Injection معمولاً از:

VirtualAllocEx()

استفاده می‌شود.

در نمونه:

VirtualAllocEx(
    hProcess,
    NULL,
    size,
    MEM_COMMIT | MEM_RESERVE,
    PAGE_EXECUTE_READWRITE
);

استفاده شده است.

مفهوم آن:

Attacker
    |
    | VirtualAllocEx
    v
Target Process
    |
    +---- New Memory Region

در اینجا یک نکته بسیار مهم برای Detection وجود دارد.

ترکیب:

Remote Process
+
Memory Allocation
+
Executable Permission

می‌تواند یک Signal بسیار مهم برای EDR باشد.


11. چرا PAGE_EXECUTE_READWRITE مهم است؟

در مثال POC:

PAGE_EXECUTE_READWRITE

استفاده شده است.

این Permission یعنی Memory هم:

READ
WRITE
EXECUTE

باشد.

از دید مهاجم، این کار ساده است:

Allocate
    ↓
Write
    ↓
Execute

اما از دید Defensive Security، Memory Regionای که همزمان Writable و Executable باشد، بسیار جالب است.

به همین دلیل Implementationهای مدرن‌تر ممکن است Memory را ابتدا با Permissionهای محدودتر ایجاد کنند و در زمان مناسب Permission آن را تغییر دهند.

این موضوع باعث می‌شود Detection فقط روی:

PAGE_EXECUTE_READWRITE

متمرکز نباشد.

بلکه باید Memory Permission Transitionها نیز بررسی شوند.


12. مرحله چهارم؛ WriteProcessMemory

بعد از ایجاد Memory، Payload باید وارد آن Memory شود.

در POC:

WriteProcessMemory(
    hProcess,
    allocated_mem,
    buf,
    sizeof(buf),
    NULL
);

استفاده شده است.

Microsoft این API را برای نوشتن Data در Memory یک Process مشخص تعریف کرده است و Handle باید Permissionهای لازم مانند PROCESS_VM_WRITE و PROCESS_VM_OPERATION را داشته باشد.

پس:

Local Buffer
    |
    | WriteProcessMemory
    v
Remote Process Memory

اکنون Payload در Process مقصد قرار دارد.

اما هنوز یک مشکل باقی مانده:

چگونه آن را Execute کنیم؟


13. مرحله پنجم؛ CreateRemoteThread

در Classic Injection پاسخ معمولاً:

CreateRemoteThread()

است.

Microsoft این API را برای ایجاد Threadای تعریف می‌کند که در Virtual Address Space یک Process دیگر اجرا می‌شود.

در POC:

CreateRemoteThread(
    hProcess,
    NULL,
    0,
    (LPTHREAD_START_ROUTINE)allocated_mem,
    NULL,
    0,
    NULL
);

استفاده شده است.

در نتیجه:

Remote Memory
      |
      | Start Address
      v
CreateRemoteThread
      |
      v
Target Thread
      |
      v
Execute Payload

و حالا Chain کامل شده است:

Process Enumeration
        ↓
OpenProcess
        ↓
VirtualAllocEx
        ↓
WriteProcessMemory
        ↓
CreateRemoteThread
        ↓
Payload Execution

این Chain یکی از مهم‌ترین Behavioral Patternهای Process Injection است.


14. Process Injection و DLL Injection یکی نیستند

یکی از اشتباهات رایج این است که این دو اصطلاح را کاملاً یکسان در نظر بگیریم.

Process Injection

یک Concept کلی است:

اجرای Code در Context یک Process دیگر.

DLL Injection

یکی از روش‌های انجام Process Injection است که در آن یک DLL در Process مقصد Load یا Map می‌شود.

MITRE DLL Injection را با:

T1055.001

شناخته و توضیح می‌دهد که روش کلاسیک آن می‌تواند شامل نوشتن Path مربوط به DLL در Memory مقصد و سپس فراخوانی LoadLibrary از طریق یک Thread باشد.

بنابراین:

Process Injection
│
├── DLL Injection
├── PE Injection
├── APC Injection
├── Thread Hijacking
├── Process Hollowing
├── Process Doppelgänging
└── ...

15. DLL Injection چگونه کار می‌کند؟

مدل کلاسیک:

Attacker
   |
   | OpenProcess
   v
Target
   |
   | Allocate Memory
   v
Remote Memory
   |
   | Write DLL Path
   v
DLL Path
   |
   | Execute LoadLibrary
   v
DLL Loaded

اینجا مهاجم Shellcode را مستقیماً اجرا نمی‌کند؛ بلکه باعث می‌شود Loader مربوط به Windows یک DLL را Load کند.

API مهم:

LoadLibrary

است.


16. LoadLibrary و GetProcAddress

دو API بسیار مهم در Windows Programming عبارت‌اند از:

LoadLibrary()
GetProcAddress()

LoadLibrary برای Load کردن Module و GetProcAddress برای پیدا کردن Address یک Export استفاده می‌شود.


17. PEB چیست؟

یکی از مهم‌ترین Structures در Windows Internals:

PEB
Process Environment Block

است.

PEB اطلاعات مهمی درباره Environment مربوط به Process در اختیار قرار می‌دهد و Loader Information نیز از مسیر آن قابل دسترسی است.


18. چرا Malware به PEB علاقه دارد؟

اگر Program بتواند PEB را پیدا کند، می‌تواند اطلاعاتی درباره Moduleهای Load شده به دست آورد.

در نتیجه به جای اینکه همیشه از:

GetModuleHandle()

یا APIهای مشابه استفاده کند، می‌تواند Moduleها را خودش پیدا کند.

این موضوع در Shellcode و Malwareهایی که سعی می‌کنند وابستگی مستقیم خود به Windows API را کاهش دهند بسیار مهم است.




19. Process Environment Block و Process Parameters

می‌توان بعد از دریافت PEB به: ProcessParameters دسترسی پیدا کرد و مواردی مانند:

CommandLine
ImagePathName

را دستکاری کرد.

این بخش لزوماً Process Injection نیست.

بلکه نمونه‌ای از Manipulation کردن Process Metadata است.

این تمایز بسیار مهم است:

هر تکنیکی که PEB را Manipulate کند، Process Injection محسوب نمی‌شود.


20. Shellcode چیست؟

در بسیاری از Process Injection Techniqueها، Payload به صورت:

Shellcode

در Memory قرار می‌گیرد.

Shellcode معمولاً Position-Independent Code است که می‌تواند بدون نیاز به یک PE File کامل اجرا شود.

به صورت مفهومی:

unsigned char payload[] =
{
    0xFC,
    0x48,
    0x81,
    ...
};

سپس:

payload
   ↓
WriteProcessMemory
   ↓
Remote Memory
   ↓
Execution


21. APC Injection

APC مخفف:

Asynchronous Procedure Call

است.

Windows می‌تواند Functionهایی را در APC Queue یک Thread قرار دهد.

در Process Injection، مهاجم می‌تواند از این مکانیزم برای Trigger کردن Code در Context یک Thread استفاده کند.

مدل:

Target Thread
      |
      v
APC Queue
      |
      v
Injected Function
      |
      v
Execution

MITRE این Technique را:

T1055.004

معرفی می‌کند.


22. Process Hollowing

Process Hollowing یکی از Techniqueهای معروف‌تر است.

ایده کلی:

Create Legitimate Process
          |
          v
Suspend Process
          |
          v
Replace / Unmap Image
          |
          v
Map Malicious Image
          |
          v
Resume Execution

در ظاهر Process ممکن است یک Application معتبر باشد، اما Image واقعی که در Memory اجرا می‌شود می‌تواند متفاوت باشد.

این Technique در MITRE:

T1055.012

قرار دارد.


23. Process Doppelgänging

Process Doppelgänging یک Technique پیچیده‌تر برای اجرای Code در Context یک Process است که از ویژگی‌های Transactional NTFS و Process Creation سوءاستفاده می‌کند.

این Technique نیز در خانواده Process Injection قرار دارد:

T1055.013

هدف اصلی آن ایجاد اختلاف بین آنچه روی Disk دیده می‌شود و آنچه در Memory برای Execution مورد استفاده قرار گرفته است.



24. Process Injection در Red Team چه کاربردی دارد؟

Process Injection برای Red Team یک Primitive مهم است.

برخی کاربردهای آن:

38.1 Defense Evasion

تلاش برای قرار دادن Execution در Context یک Process معتبر.

38.2 Process Migration

جابجایی Execution یک Agent از Process فعلی به Process دیگر.

38.3 C2 Agent Execution

در برخی Frameworkها Agent می‌تواند در Process دیگری اجرا شود.

38.4 کاهش Artifactهای قابل مشاهده

برخی Implementationها تلاش می‌کنند Payload را بیشتر در Memory نگه دارند و Artifactهای Disk را کاهش دهند.

38.5 استفاده از Context موجود

Process مقصد ممکن است Network Connection، Token، DLLها یا Resourceهای موردنیاز را داشته باشد.

اما باید دقت کرد:

Process Injection یک هدف نهایی نیست؛ معمولاً یک Execution Primitive در یک Attack Chain بزرگ‌تر است.



25. Process Injection از دید SOC

از دید SOC مهم‌ترین سؤال این نیست که:

آیا Process X اجرا شد؟

بلکه سؤال بهتر این است:

آیا یک Process غیرعادی تلاش کرده است Memory یا Execution Context یک Process دیگر را Manipulate کند؟

برای مثال:

Process A
   |
   +--> OpenProcess
   |
   +--> VirtualAllocEx
   |
   +--> WriteProcessMemory
   |
   +--> CreateRemoteThread
   |
   v
Process B

این Chain بسیار ارزشمندتر از بررسی نام Process است.


26. Detection بر اساس Behavior

یک Detection ساده ممکن است بگوید:

CreateRemoteThread detected

اما این کافی نیست.

Detection بهتر:

Process A
   |
   +-- Process Enumeration
   |
   +-- OpenProcess
   |
   +-- Remote Memory Allocation
   |
   +-- Memory Write
   |
   +-- Memory Permission Change
   |
   +-- Remote Execution

هرچه تعداد این رفتارها در یک Time Window نزدیک بیشتر شود، Confidence بالاتر می‌رود.


27. مهم‌ترین Detection Signals

برای Threat Hunting می‌توان روی این موارد تمرکز کرد:

Process Access

OpenProcess

Remote Memory Allocation

VirtualAllocEx
NtAllocateVirtualMemory

Remote Memory Write

WriteProcessMemory
NtWriteVirtualMemory

Remote Execution

CreateRemoteThread
CreateRemoteThreadEx
NtCreateThreadEx

Thread Manipulation

SuspendThread
SetThreadContext
ResumeThread

APC

QueueUserAPC
NtQueueApcThread

Memory Permission Changes

VirtualProtectEx
NtProtectVirtualMemory

این‌ها به تنهایی همیشه Malicious نیستند.

اما Chain آن‌ها بسیار مهم است.


28. چرا API Detection به تنهایی کافی نیست؟

یک مهاجم می‌تواند به جای Win32 API مستقیماً از Native API یا تکنیک‌های دیگر استفاده کند.

همچنین ممکن است:

CreateRemoteThread

اصلاً استفاده نشود.

برای مثال:

Thread Hijacking
APC Injection
Process Hollowing
Manual Mapping

می‌توانند Execution را بدون همان Chain کلاسیک انجام دهند.

بنابراین Detection باید از:

API-based Detection

به سمت:

Behavior-based Detection

حرکت کند.


29. Memory Detection

یکی از مهم‌ترین روش‌های Detection بررسی Memory است.

مثلاً Regionهایی با:

RWX

می‌توانند جالب باشند.

اما Detection صرفاً:

RWX = Malicious

نیست.

بهتر است:

RWX Memory
+
Remote Process
+
Unbacked Memory
+
Execution
+
Suspicious Parent/Source

در کنار یکدیگر بررسی شوند.


برای ادامه مطالعه مقاله فایل مربوطه در قسمت منابع به آدرس زیر را دانلود کرده و تحلیل های زیر را مطالعه کنید :

https://vulncity.com/resources/process-injection-poc

30. تحلیل POC 1

حالا می‌توانیم POC ارسالی را مرحله‌به‌مرحله خلاصه کنیم.

مرحله 1

CreateToolhelp32Snapshot

برای Process Enumeration.

مرحله 2

Process32First
Process32Next

برای پیدا کردن Target.

مرحله 3

OpenProcess

برای دریافت Handle.

مرحله 4

VirtualAllocEx

برای ایجاد Memory در Process مقصد.

مرحله 5

WriteProcessMemory

برای انتقال Payload.

مرحله 6

CreateRemoteThread

برای Trigger کردن Execution.

در نتیجه:

Enumeration
     ↓
OpenProcess
     ↓
VirtualAllocEx
     ↓
WriteProcessMemory
     ↓
CreateRemoteThread
     ↓
Execution

این دقیقاً یک نمونه آموزشی مناسب برای فهم Classic Process Injection است.


31. تحلیل Sample C++ Project

فایل دوم چند موضوع مهم را همزمان نشان می‌دهد.

Injection

OpenProcess
VirtualAllocEx
WriteProcessMemory
CreateRemoteThread

Dynamic API Resolution

GetModuleBaseAddress
GetExportAddress
LoadLibraryA
GetProcAddress

Native API

NtQueryInformationProcess

PEB Manipulation

ProcessInformation.PebBaseAddress

و دسترسی به:

ProcessParameters

پس این پروژه برای مطالعه Windows Internals بسیار ارزشمندتر از یک POC ساده Injection است.


32. تحلیل Run32On64

فایل Run32On64 یک موضوع پیشرفته‌تر را نشان می‌دهد:

Cross-Architecture Execution

در آن از ساختارهایی مانند:

WOW64CONTEXT

استفاده شده و Routineهایی برای Migration بین x86 و x64 وجود دارند.

همچنین Flow کلی:

Find Process
   ↓
OpenProcess
   ↓
VirtualAllocEx
   ↓
WriteProcessMemory
   ↓
WOW64-specific Execution

قابل مشاهده است.

این موضوع نشان می‌دهد که در سطح Advanced، Process Injection دیگر صرفاً مسئله چند API نیست و باید Windows Architecture را نیز درک کرد.



33. نقشه ذهنی Process Injection

در نهایت می‌توان کل موضوع را این‌گونه خلاصه کرد:

                    Process Injection
                           |
        +------------------+------------------+
        |                  |                  |
     Target             Memory            Execution
        |                  |                  |
        |                  |                  |
 Process Enum        Allocate Memory      Remote Thread
 OpenProcess         Write Memory         APC
 Handle Access       Change Protection    Thread Hijack
        |                  |                  |
        +------------------+------------------+
                           |
                           v
                    Code Execution
                           |
              +------------+------------+
              |            |            |
         Shellcode       DLL          PE
              |            |            |
              +------------+------------+
                           |
                           v
                     Red Team Use
                           |
              +------------+------------+
              |            |            |
          Evasion         C2       Migration

34. جمع‌بندی نهایی

Process Injection یکی از مهم‌ترین مباحث برای کسی است که می‌خواهد در حوزه‌های:

Red Team
Malware Analysis
Threat Hunting
EDR Engineering
SOC
Windows Internals

به سطح Advanced برسد.

برای درک واقعی این موضوع باید چند Layer را همزمان یاد گرفت:

Windows Process Model
        ↓
Thread Model
        ↓
Virtual Memory
        ↓
Windows API
        ↓
PE Format
        ↓
PEB / TEB
        ↓
DLL Loader
        ↓
Native API
        ↓
x86 / x64 / WOW64
        ↓
Process Injection
        ↓
EDR Detection
        ↓
Threat Hunting

POCهای ارائه‌شده نیز دقیقاً همین مسیر را نشان می‌دهند.

POC اول یک نمونه ساده و شفاف از:

Process Enumeration
→ OpenProcess
→ VirtualAllocEx
→ WriteProcessMemory
→ CreateRemoteThread

است.

نمونه C++ دوم این موضوع را به مباحث پیشرفته‌تری مانند:

Dynamic API Resolution
PE Export Parsing
PEB
NtQueryInformationProcess

متصل می‌کند.
و نمونه Run32On64 نیز نشان می‌دهد که در سطح بالاتر، مسائل:

x86
x64
WOW64
Cross-Architecture Execution

به بخش مهمی از موضوع تبدیل می‌شوند.

در نهایت، برای یک Red Team یا Threat Hunter حرفه‌ای، مهم‌ترین نکته این نیست که فقط بداند چگونه یک Process را Inject کند؛ بلکه باید بتواند کل Lifecycle آن را از انتخاب Target و دسترسی به Handle، تا Memory Manipulation و Execution، و سپس از دید EDR/SOC Detection تحلیل کند.

به همین دلیل Process Injection را می‌توان یکی از بهترین موضوعات برای اتصال سه حوزه دانست:

Windows Internals
        +
Offensive Security
        +
Defensive Security

و دقیقاً همین نقطه است که یک Security Analyst را از سطح صرفاً Alert Monitoring به سمت Threat Hunting و Advanced Red Team Analysis هدایت می‌کند.