使用
native api
建立程序
最近幾個星期一直在研究這個題目。因為關於方面的資料比較多(可以看下面的參考文章),所以開始時以為很快就結束了。誰知道真正動起手來才發現有很多要考慮的地方,不過還好今天終於成功了,還是很高興的。寫下來,做個小結吧。(紙上得來終覺淺
, 須知此事要躬行。)
我們一般是使用
createprocess
來建立程序的,而使用
native api
來建立程序其實說白了就是模擬
createprocess
的實現。一開始我以為
createprocess
就是呼叫
ntcreateprocess
的(畢竟和
createprocess
名稱一樣嘛),但是讀了許多文章後才知道
ntcreateprocess
只是完成了
createprocess
一小部分工作。
createprocess
是由下面幾個步驟完成的:
1. 使用zwopenfile
開啟檔案,建立對映
zwcreatesection.
本步驟開啟檔案,並建立乙個屬性為
sec_image
的section
物件。 2.
呼叫zwcreateprocess
本步驟主要是建立程序的
peb、
eprocess
、vad
等核心核心結構。
3. 建立堆疊、
context
、程序引數等,並建立主線程
zwcreatethread(suspend) 儘管
zwcreateprocess
建立了程序物件,但是並沒有同時建立乙個主線程。主線程需要呼叫函式
zwcreatethread
來建立,這個過程同時會建立堆疊、
context
、程序的引數等等。有點要注意的是:建立的程序
createsuspended
為true
,於是執行緒建立後是不能立即執行的。
1) 堆疊的建立
一般情況我們都會從可執行檔案(
pe)檔案頭中取出需要堆疊的大小,這個大小是在程式編譯的時候指定的。
我們將需要堆疊的結構放到乙個
initial_teb
結構中:
typedef struct _initial_tebinitial_teb, *pinitial_teb;
分配堆疊記憶體後,將位址填入上面的結構中,下面是堆疊的結構:
5.
呼叫zwresumethread
恢復執行緒的執行。
上面的一切都完成了,就可以呼叫
zwresumethread
恢復執行緒的執行了。
參考文章: 1.
利用native api
建立程序
, 爐子
[0ginr], <
黑客防線
>2008.12 2.
createprocess
程序建立的核心跟蹤分析
,gz1x 3.
gloomy
——研究
createprocess 4.
**createprocess 5.
windows nt/2000
本機api
參考手冊 6.
一段createprocess
的強悍** 7.
window via c/c++
第四章process 8.
microsoft windows internals, fourth edition
(深入解析
windows
作業系統第4
版), chapter 6.
使用Native API 建立程序
使用 native api 建立程序 最近幾個星期一直在研究這個題目。因為關於方面的資料比較多 可以看下面的參考文章 所以開始時以為很快就結束了。誰知道真正動起手來才發現有很多要考慮的地方,不過還好今天終於成功了,還是很高興的。寫下來,做個小結吧。紙上得來終覺淺 須知此事要躬行。我們一般是使用 cr...
使用fork 函式建立程序
如果程式呼叫fork 成功,fork 函式會返回兩次的值,兩次的值都不相同,返回0是給子程序的,父程序返回非負整數。呼叫不成功返回 1 具體怎樣會呼叫不成功,我現在也不知道,以後學到了再來補充 include include include intmain else if repid 0 else ...
C 的程序建立和使用
最近在做乙個訊息中介軟體裡面涉及到多執行緒程式設計,由於跨平台的原因我採用了boost執行緒庫。在建立執行緒時遇到了幾種執行緒建立方式現總結如下 首先看看boost thread的建構函式吧,boost thread有兩個建構函式 1 thread 構造乙個表示當前執行執行緒的執行緒物件 2 exp...