如果一隻程式執行了非預期行為,導致系統出現異狀…

為了要更好了解程式在運行過程中的行為,我們要先知道程式到底是怎麼執行起來的?作業系統又是如何管控這些程式實現交互,幫助我們完成電腦上面的任務的?
程式是如何在電腦中執行的?
程式可以視為指令與資料的集合。在一般情況下(此處僅討論編譯型程式語言),當程式設計完成後,必須通過編譯器將其轉換為對應系統的可執行檔案格式。一旦完成轉換,當使用者啟動該檔案時,程式便開始執行。此時,作業系統會根據一系列指令的流程,協助建立程式執行所需的環境,並將程式所需的內容映射到記憶體中。在經過初始化後,程式將從進入點(Entry Point)開始執行。
Something about Process in Windows
Process, Thread, and Handle
在 Windows 系統下,程式的執行涉及到三個重要概念:行程(Process)、執行緒(Thread)、句柄(Handle)。Process
是一包含執行程式所需資源的執行容器。一個 Windows process 是由下列部分所構成(抽象角度):
- 一組 private virtual address space,即 process 可以使用的虛擬記憶體位址空間
- 一個可以執行的程式,定義最初映射到虛擬記憶體位址空間內的程式與資料。
- 各種系統資源的 handles,例如:通訊埠、檔案等,process 內的所有 threads 都能共享這些資源。
- 一組安全環境(security context),稱為 access token,描述 process 的使用者身分、安全群組、權限等以及與執行程式的使用者帳戶有關的有限資訊。
- 一個唯一的識別碼,稱為 PID(Process ID)。
- 至少一個可執行的 thread(Main Thread)。
在 Windows 系統中,行程優先權(Process Priority)決定作業系統中分配 CPU 資源的優先程式,不同的優先級別會影響獲得 CPU 時間的頻率,從而影響其執行速度與作業系統整體效能。

- Idle:只在系統閒置、沒有其他行程需要執行時才會獲得 CPU 資源,常見於後台執行、對性能要求不高的任務。
- Below Normal:適用於對即時性要求不高的應用程式。在有可用資源時執行,而不太會影響其他行程。
- Normal:預設優先權,適用於大部分應用程式。在資源分配上與其他優先級的行程公平競爭。
- Above Normal:用於需要比普通應用程式更快反應的行程,例如多媒體應用或需要及時處理的程式。
- High:會比大多數應用獲得更多的 CPU 時間,常用於更加需要即時反應的任務,如音頻處理或即時資料處理。
- Realtime:最高優先級,適用於極端情況下需要及時處理的任務,例如硬體相關的行程。使用時須謹慎小心,因為其可以壓制其他行程,甚至系統關鍵行程,導致整個系統不穩定。
wikiHow - How to Change Process Priorities in Windows Task Manager
When you set a 100% CPU program to real-time priority, you get what you asked for
- 工作管理員
- tasklist
- Process Explorer

Thread
作業系統中的基本執行單位,由 Process 所創建的子任務。每個 Process 包含至少一個 Thread。一個 Thread 是由下列部分所構成(基本元件):
- 一組 CPU 暫存內容,代表處理器的狀態。
- 兩組 Stack,一組給 kernel mode 執行時使用;另一組 user mode 執行時使用。
- 一組私有儲存空間,稱為 Thread-Local Storage(TLS),讓子系統、執行時期函式庫、DLLs 使用。
- 一組唯一識別碼,即 thread ID(process IDs 與 thread IDs 是從同一個命名空間產生的,所以兩者不會重複)。
- Thread 有時擁有自己的安全環境,讓 multithreaded 的伺服器程式可以獨立管控各個客戶端的安全層級。
Handle
是一個指向物件的參考,用來存取物件的資訊。在 Windows 系統中,用於標識某個資源的結構體,應用程式之間可以透過 Handle 進行交互。 Process Handles and Identifiers
Application Process, Windows Process, 與 Background Process
在 Windows 中,行程大可以致分類為以下:- 若有一個可視的視窗 → Application Process:是指由一個使用者啟動的應用程式,通常有可視的使用者介面(UI),並且可能提供交互功能。
- 若被標記為 Critical → Windows Process:是指由 Windows 作業系統啟動或管理的核心行程,負責執行系統級的操作,例如:管理硬體資源、提供系統服務。被標記為 Critical 是表示系統穩定運行所需的行程,一旦被終止,系統可能因此崩潰。
- 其餘則為 → Background Process:是指不需要與使用者直接交互的行程,通常在後台執行,提供應用程式或系統的支持功能。
How does Task Manager categorize processes as App, Background Process, or Windows Process?
Windows API
Windows API(Windows Application Programming Interface)是 Microsoft 提供的一套函數與工具,允許使用者與 Windows 作業系統進行互動。 依照功能可以劃分為幾個類別:- User interface
- Windows environment (Shell)
- User input and messaging
- Data access and storage
- Diagnostics
- Graphics and multimedia
- Devices
- System services
- Security and identity
- Application installation and servicing
- System admin and management
- Networking and internet
- …
惡意程式常見 API 可以參考以下:
https://malapi.io/

Introduction to Process Injection
Process Injection 是一種惡意程式常使用的技術,是指濫用合法手段在目標行程或其他行程內部的記憶體空間執行任意程式碼的功能,從而達到隱藏行為、繞過防禦機制或獲得目標行程的權限等目的。
MITRE ATT&CK 是這樣描述的
https://attack.mitre.org/techniques/T1055/#ProcedureExamples
Adversaries may inject code into processes in order to evade process-based defenses as well as possibly elevate privileges. Process injection is a method of executing arbitrary code in the address space of a separate live process. Running code in the context of another process may allow access to the process's memory, system/network resources, and possibly elevated privileges. Execution via process injection may also evade detection from security products since the execution is masked under a legitimate process.
實現 Process Injection 方法有很多種,其被歸類在 MITRE ATT&CK Process Injection 的 Sub-Techinques,以下是幾個常見的手法
- T1055.001 - Dynamic-link Library Injection
- T1055.003 - Thread Execution Hijacking
- T1055.004 - Asynchronous Procedure Call
- T1055.012 - Process Hollowing
- …
本篇從此處開始關於建立 shellcode 的方式就不再做贅述了,不了解的可以至上篇(從刮痕開始的惡意程式開發 - Part 2)。
CreateRemoteThread Shellcode Injection
Shellcode Injection 是指將 shellcode 注入到目標行程(Process)的技術,再通過開啟新的 Thread 呼叫 shellcode,從而達到目標操作,例如:reverse shell、提權等。

在實現之前,我們可能會需要知道一些會使用到的 Windows API
Local Thread Injection
Local Thread Injection 是指透過注入至同一行程(自身)實現。
Remote Thread Injection
Remote Thread Injection 是指將 shellcode 注入到另一個行程當中實現。

Dynamic-Link Library Injection
是指通過手段將 Dynamic-Link Library (DLL) 注入至正在運行的行程(Process)中,以此執行特定行為,從而達成目標。

在軟體開發過程中,當需要實現跨不同程式或模組的相同功能時,「重造輪子」(即每個程式獨立開發相同的功能)顯然是低效且容易出錯的方式。
那該怎麼做呢?

Dynamic-Link Library
動態連結函式庫(Dynamic-Link Library,DLL)是微軟公司在 Windows 系統中實現共享函數函式庫概念的一種實作方式。
簡單來說,就是可以定義共享函式的函式庫,通過動態連結的機制,當執行檔呼叫到DLL檔內的函式時,Windows作業系統才會把DLL檔載入記憶體內。
dynamic-link-library#dll-development
接下來,我們可以先嘗試建立一個簡單的 DLL 檔
- 首先,通過 Microsoft Visual Studio 開啟一個新的專案
- 轉換組態類型為動態程式庫(.dll)
- 編寫 DLL 檔程式內容(malicious.dll)
Run a DLL
rundll32:用於執行 32 位動態連結程式庫 (DLL)的工具。(仍可執行 64位元 DLL)
語法:rundll32.exe

DLL Injector
再來就可以嘗試實作 DLL Injector 了。
首先,還是要先了解一下會使用到的 Windows API。
以下是常見 kernel32.dll 中用於 DLL Injection 的 API
DLL Injector
現在嘗試注入 DLL 至指定行程

Conclusion
本篇探討了 Process Injection 的手法,並嘗試實作了 Shellcode Injection 及 DLL Injection,這些方法都是野外非常常見的惡意程式利用手法。 透過這些技術,惡意程式可以在目標行程中執行任意程式碼,從而達到隱藏行為、繞過防禦機制或獲得目標行程的權限等目的。
References
- Raymond Chen How does Task Manager categorize processes as App, Backgroun…
- wikiHow How to Change Process Priorities in Windows Task Manager: 10…
- Raymond Chen When you set a 100% CPU program to real-time priority, you g…
- Karl-Bridge-Microsoft Process Handles and Identifiers - Win32 apps
- Raymond Chen How does Task Manager categorize processes as App, Backgroun…
- GrantMeStrength Windows API index - Win32 apps
- MalAPI.io
- Process Injection, Technique T1055 - Enterprise | MITRE ATT&…
- Mark Lester Dampios A Technical Deep Dive: Comparing Anti-Cheat Bypass and EDR B…
- Process Injection | Crow's Nest