createprocess執(zhí)行過程(精簡)_第1頁
已閱讀1頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、創(chuàng)建進程的過程分成六個階段,發(fā)生于操作系統(tǒng)的三個部分中。三個部分是:1,Windows客戶端即某個應用進程的包括Kernel32.dll在內的動態(tài)連接庫2,Windows的“執(zhí)行體”、即內核(確切地說是內核的上層)3,以及Windows子系統(tǒng)的服務進程Csrss中。六個階段是:1.打開目標映像文件。2.創(chuàng)建Windows的“執(zhí)行體進程對象”,也就是內核中的“進程控制塊”數(shù)據(jù)結構。3.創(chuàng)建該進程的初始(第一個)線程,包括其堆棧、上下文、以

2、及“執(zhí)行體線程對象”,即內核中的“線程控制塊”數(shù)據(jù)結構。4.將新建進程通知Windows子系統(tǒng)。5.啟動初始線程地運行(除非因為參數(shù)中的CREATE_SUSPENDED標志位為1而一創(chuàng)建便被掛起)。6.在新進程和線程的上下文中完成用戶空間的初始化,包括裝入所需的DLL,然后開始目標程序的運行。BOOLWINAPICreateProcess(__inLPCTSTRlpApplicationName__in_outLPTSTRlpCommL

3、ine__inLPSECURITY_ATTRIBUTESlpProcessAttributes__inLPSECURITY_ATTRIBUTESlpThreadAttributes__inBOOLbInheritHles__inDWDdwCreationFlags__inLPVOIDlpEnvironment__inLPCTSTRlpCurrentDirecty__inLPSTARTUPINFOlpStartupInfo__outLPP

4、ROCESS_INFMATIONlpProcessInfmation)在打開可執(zhí)行映像之前執(zhí)行一下步驟:看書上。第一階段:打開目標映像文件第一階段:打開目標映像文件在Win32位API中,創(chuàng)建進程是由CreateProcess()完成的。這實際上是個宏定義,根據(jù)不同的情況定義成CreateProcessA()或CreateProcessW()之一,這兩個函數(shù)都在kernel32.dll中(可以用工具depends觀察)。兩個函數(shù)的區(qū)別僅

5、在于字符串的表達,前者采用II字符,而后者采用“寬字符”、即Unicode。實際上Windows的內部都采用寬字符,所以前者只是把字符串轉換成寬字符格式,然后調用后者??梢栽赪indows上運行的可執(zhí)行軟件有好幾類,處理的方法自然就不一樣:●Windows的32位.exe映像,直接運行?!馱indows的16位.exe映像,啟動ntvdm.exe,以原有命令行作為參數(shù)?!馜OS的.exe、.com、或.pif映像,啟動ntvdm.exe

6、,以原有命令行作為參數(shù)?!馜OS的.bat或.cmd批命令文件(腳本),啟動cmd.exe,以原有命令行作為參數(shù)?!馪OSIX可執(zhí)行映像,啟動posix.exe,以原有命令行作為參數(shù)。●OS2可執(zhí)行映像,啟動os2.exe,以原有命令行作為參數(shù)。這里面最重要的當然是32位的.exe映像,而最后兩類現(xiàn)在已經很少見了。從對于除映像裝入地址等等信息。PEB在用戶空間中的位置是固定的,總是在0x7ffdf000。在Windows中,用戶空間和系

7、統(tǒng)空間的分界線是2GB、即0x80000000,所以PEB在靠近用戶空間頂端的地方。所謂創(chuàng)建內核中的進程對象,實際上就是創(chuàng)建以EPROCESS為核心、為基礎的相關數(shù)據(jù)結構,這就是系統(tǒng)調用NtCreateProcess()要做的事情,主要包括:●分配并設置EPROCESS數(shù)據(jù)結構?!衿渌嚓P的數(shù)據(jù)結構的設置,例如“打開對象表”。●為目標進程創(chuàng)建初始的地址空間。●對目標進程的“內核進程塊”KPROCESS進行初始化?!駥⑾到y(tǒng)DLL的映像映射

8、到目標進程的(用戶)地址空間?!駥⒛繕诉M程的映像映射到其自身的用戶空間?!裨O置好目標進程的“進程環(huán)境塊”PEB?!裼成淦渌枰成涞接脩艨臻g的數(shù)據(jù)結構,例如與“當?shù)卣Z言支持”、即NLS有關的數(shù)據(jù)結構?!裢瓿蒃PROCESS創(chuàng)建,將其掛入進程隊列(注意受調度的是線程隊列而不是進程隊列)。這里將系統(tǒng)DLL、實際上是ntdll.dll、映射到目標進程的用戶空間是很關鍵的。這是因為,除別的、主流的功能和作用外,ntdll.dll同時也起著相當于

9、Linux中ELF“解釋器”的作用,也擔負著為目標映像建立動態(tài)連接的任務。第三階段:創(chuàng)建初始線程第三階段:創(chuàng)建初始線程如上所述,進程只是個空架子,實際的運行實體是里面的線程。所以下一步就是創(chuàng)建目標進程的初始線程,即其第一個線程。與EPROCESS相對應,線程的數(shù)據(jù)結構是ETHREAD,并且其第一個成分是數(shù)據(jù)結構KTHREAD,稱為TCB。此外,就像進程有“進程環(huán)境塊”PEB一樣,線程也有“線程環(huán)境塊”TEB,KTHREAD結構中有個指針

10、指向其存在于用戶空間的TEB。前面講過,PEB在用戶空間的位置是固定的,PEB下方就是TEB,進程中有幾個線程就有幾個TEB,每個TEB占一個4KB的頁面。NtCreateThread()調用PspCreateThread(),PspCreateThread()調用KeInitThread()。這個階段的操作是通過系統(tǒng)調用NtCreateThread()完成的,主要包括:●創(chuàng)建和設置目標線程的ETHREAD數(shù)據(jù)結構,并處理好與EPROC

11、ESS的關系(例如進程塊中的線程計數(shù)等等)?!裨谀繕诉M程的用戶空間創(chuàng)建并設置目標線程的TEB?!駥⒛繕司€程在用戶空間的起始地址設置成指向Kernel32.dll中的BaseProcessStart()或BaseThreadStart(),前者用于進程中的第一個線程,后者用于隨后的線程。用戶程序在調用NtCreateThread()時也要提供一個用戶級的起始函數(shù)(地址),BaseProcessStart()和BaseThreadStart

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論