Windows核心程式設計(六)程序-2
CreateProcess函式
使用CreateProcess函式來建立一個程序,首先還是建立一個Windows應用程式,並編輯以下程式碼:
# include<Windows.h>
int main()
{
//建立程序的函式:CreateProcess
CreateProcess();
return 0;
}
其中的CreateProcess函式的結構如下:
WINAPI
CreateProcessW(
_In_opt_ LPCWSTR lpApplicationName,
_Inout_opt_ LPWSTR lpCommandLine,
_In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ BOOL bInheritHandles,
_In_ DWORD dwCreationFlags,
_In_opt_ LPVOID lpEnvironment,
_In_opt_ LPCWSTR lpCurrentDirectory,
_In_ LPSTARTUPINFOW lpStartupInfo,
_Out_ LPPROCESS_INFORMATION lpProcessInformation //建立的新程序視窗的相關資訊,用於返回
);
將游標放在該函式上,按F1鍵開啟幫助,即可看到有關該函式的說明:
網址連結
引數
現在開始對各個引數進行分析
lpApplicationName
表示要執行的模組的名稱。 在使用時填入的是該應用程式的路徑以及檔名,隨便找一個應用程式來進行實驗:,並填入到該函式的第一個引數中,同時要注意的是,由於該函式支援的是Unicode字元,所以要使用Unicode字元來進行填寫,同時要在所有的反斜槓前加上轉義字元,引數結果如下:
L"E:\\workspace\\x64dbg_2019_11_26\\release\\x96dbg.exe"
lpCommandLine
表示要執行的命令列,在編寫的時候可以直接把命令列傳進去,如果沒有命令列,就可以直接傳一個NULL,由於本次實驗的引數不需要命令列,則填寫的引數為NULL
lpProcessAttributes
該引數為一個指向程序安全特性的一個結構的指標,可以直接傳NULL,也可以傳入一個定義:
SECURITY_ATTRIBUTES psa = { sizeof(psa) };
傳入psa的地址 &psa
lpThreadAttributes
該引數與上一個引數類似,為執行緒的安全特性引數,傳輸方法同上,傳入一個定義:
SECURITY_ATTRIBUTES tsa = { sizeof(tsa) };
傳入tsa的地址&tsa
bInheritHandles
如果該引數為TRUE,則新程序將繼承呼叫程序中的每個可繼承控制代碼,如果該引數為FALSE,則不會繼承控制代碼,在本次實驗中傳入的是FALSE,不希望程式碼繼承控制代碼
dwCreationFlags
該引數為控制優先順序類別和流程建立的標誌,傳入的是給定的幾個巨集其中之一,這幾個巨集表示的是排程的優先順序以及建立的屬性,能填寫的流程建立標識連結,如果不需要的話可以傳入一個0
lpEnvironment
該引數為指向新程序的環境塊的指標,本次沒有使用到,所以傳入NULL,如果需要使用時,就需要對引數進行編寫
lpCurrentDirectory
該引數為程序當前目錄的完整路徑,如果該引數為NULL,則新程序將具有與呼叫程序相同的當前驅動器和目錄,本次傳入NULL
lpStartupInfo
該引數為指向STARTUPINFO或STARTUPINFOEX結構的指標 ,在使用時可以初始化一個結構:
STARTUPINFO si = { sizeof(si) };
傳入si的地址&si
該結構體的引數如下:
typedef struct _STARTUPINFOW {
DWORD cb; //該結構體的位元組數
LPWSTR lpReserved; //初始化為NULL
LPWSTR lpDesktop; //表示名稱,要在那個桌面上啟動應用程式
LPWSTR lpTitle; //控制檯標題,只能在控制檯介面使用
DWORD dwX; //dwX和dwY是應用程式視窗在螢幕上的位置
DWORD dwY;
DWORD dwXSize; //應用程式的高度與寬度,以畫素為單位
DWORD dwYSize;
DWORD dwXCountChars; //指定子程序控制檯視窗的一個高度與寬度
DWORD dwYCountChars;
DWORD dwFillAttribute; //子程序視窗的文字與背景色
DWORD dwFlags;
WORD wShowWindow; //window視窗的顯示
WORD cbReserved2; //保留欄位,初始化為0
LPBYTE lpReserved2; //保留欄位,初始化為NULL
HANDLE hStdInput; //這三個都是控制代碼,輸出,輸出以及錯誤的控制代碼
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFOW, *LPSTARTUPINFOW;
lpProcessInformation
該引數為指向PROCESS_INFORMATION結構的指標,表示輸出的結構,也是初始化一個結構:
PROCESS_INFORMATION pi;
並傳入pi的地址&pi
其結構如下:
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess; //程序控制代碼
HANDLE hThread; //執行緒控制代碼
DWORD dwProcessId; //程序ID
DWORD dwThreadId; //執行緒ID
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
執行結果
引數寫完之後的結果如下:
# include<Windows.h>
int main()
{
//建立程序的函式:CreateProcess
SECURITY_ATTRIBUTES psa = { sizeof(psa) };
SECURITY_ATTRIBUTES tsa = { sizeof(tsa) };
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
CreateProcess(L"E:\\workspace\\x64dbg_2019_11_26\\release\\x96dbg.exe",NULL,&psa,&tsa,FALSE,0,NULL,NULL,&si,&pi);
return 0;
}
執行結果如下:
該程式正常執行
返回值
返回值為BOOL型別,表示建立是否成功