執行PE節中的Shellcode
下面以文件inject.exe分析為例。
1、打開宿主進程,獲取進程句柄。

OpenProcess用于打開一個已存在的進程對象,并返回該進程的句柄。該函數的原型如下:
HANDLE OpenProcess(
??DWORD dwDesiredAccess,
??BOOL bInheritHandle,
??DWORD dwProcessId
);
dwDesiredAccess:指定希望獲得的訪問權限。這是一個位掩碼,可以指定一個或多個訪問權限。常見的權限包括PROCESS_ALL_ACCESS(授予對所有進程對象的訪問權限)、PROCESS_VM_READ(允許讀取進程內存)、PROCESS_VM_WRITE(允許寫入進程內存)和SYNCHRONIZE(允許等待進程終止)。
bInheritHandle:指定句柄是否可由子進程繼承。如果此參數為TRUE,則子進程可以繼承該句柄;如果為FALSE,則子進程不能繼承該句柄。
dwProcessId:指定要打開的進程的進程標識符。這個標識符是唯一的,用于標識系統中的每一個進程。
如果函數執行成功,它會返回指定進程的句柄。如果函數失敗,它會返回NULL,并且可以通過調用GetLastError函數來獲取失敗的原因。
2、申請內存空間

VirtualAllocEx用于在指定進程的虛擬地址空間中分配內存。該函數的原型如下:
LPVOID VirtualAllocEx(
??HANDLE hProcess,
??LPVOID lpAddress,
??SIZE_T dwSize,
??DWORD flAllocationType,
??DWORD flProtect
);
hProcess:目標進程的句柄。這個句柄標識了需要分配內存的進程。句柄必須擁有對目標進程的適當訪問權限。
lpAddress:指向要分配的內存區域的起始地址的指針。如果此參數為NULL,則系統決定分配區域的起始地址。
dwSize:要分配的內存區域的大小,以字節為單位。實際分配的內存大小通常是系統內存頁大小的整數倍。
flAllocationType:內存分配類型。這個參數可以是一個或多個分配類型的組合,如MEM_COMMIT(提交分配)和MEM_RESERVE(保留分配)。常見的組合是僅使用MEM_COMMIT,它表示同時分配并保留內存。
flProtect:內存保護屬性。這個參數指定了內存區域的訪問權限,如PAGE_READWRITE(可讀可寫)、PAGE_EXECUTE_READWRITE(可執行、可讀可寫)等。
如果函數成功,返回指向分配的內存區域的起始地址的指針。如果函數失敗,返回NULL。可以通過調用GetLastError函數來獲取具體的錯誤代碼。
3、

WriteProcessMemory函數是Windows API中的一個重要函數,它允許一個進程將數據寫入到另一個進程的地址空間中。這個函數在需要對其他進程進行內存操作(如調試、注入代碼等)時非常有用。以下是關于WriteProcessMemory函數的詳細解析:
函數原型
在C++中,WriteProcessMemory函數的原型通常如下所示(注意,參數類型可能因不同的資料來源而略有不同,但基本含義相同):
BOOL WriteProcessMemory( HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesWritten );
- hProcess:目標進程的句柄。這個句柄必須是通過
OpenProcess函數獲得的,并且具有對目標進程的PROCESS_VM_WRITE和PROCESS_VM_OPERATION訪問權限。 - lpBaseAddress:指向目標進程中的內存地址的指針,該地址是數據將被寫入的起始位置。
- lpBuffer:指向包含要寫入目標進程內存的數據的緩沖區的指針。
- nSize:要寫入目標進程的字節數。
- lpNumberOfBytesWritten:指向一個變量的指針,該變量接收實際寫入目標進程的字節數。這個參數是可選的,如果為NULL,則忽略。
返回值
- 如果函數成功執行,返回值為非零值(TRUE)。
- 如果函數失敗,返回值為零(FALSE)。此時,可以通過調用
GetLastError函數來獲取詳細的錯誤代碼。

浙公網安備 33010602011771號