国产成人av人人爽人人澡-亚洲国产日韩欧美一区-好吊日视频这里只有精品-日本高清精品视频在线

您好,歡迎進(jìn)入深圳市穎特新科技有限公司官方網(wǎng)站!

您現(xiàn)在的位置:首頁(yè) 新聞資訊 >> 新聞?lì)^條 >> C語(yǔ)言程序真正的啟動(dòng)函數(shù)
新聞資訊
NEWS INFORMATION

C語(yǔ)言程序真正的啟動(dòng)函數(shù)

發(fā)布時(shí)間:2019-05-22

為什么要用”真正”這個(gè)詞?因?yàn)槲覀儚膶W(xué)C語(yǔ)言開始,都會(huì)先明白這個(gè)道理,即C語(yǔ)言有且僅有一個(gè)main函數(shù),main函數(shù)是C語(yǔ)言的入口點(diǎn)和出口點(diǎn)。ǹ梢詤⒖>http://www.dotcpp.com/wp/184.htmll)不光C語(yǔ)言如此,C++也如此,甚至無(wú)論黑窗口的控制臺(tái)程序和Windows應(yīng)用程序,都是從main函數(shù)或者WinMain函數(shù)開始執(zhí)行,這當(dāng)然沒(méi)錯(cuò),但事實(shí)上main函數(shù)僅僅是一個(gè)C語(yǔ)言語(yǔ)法規(guī)定的入口點(diǎn),而不是真正的程序入口,因?yàn)樗灿泻瘮?shù)返回值!它也需要被調(diào)用!所以,今天我們將帶大家去揭秘main函數(shù)之前的代碼,去看看真正的啟動(dòng)函數(shù)是什么!來(lái)讓大家深入理解C語(yǔ)言程序,方便大家日后的逆向?qū)W習(xí)!

由于大多數(shù)情況下,我們?cè)赩C環(huán)境下,常常C/C++混編,或控制臺(tái)程序和windows應(yīng)用程序都有接觸,同時(shí)會(huì)因?yàn)榫幋a方式的區(qū)分如ANSI或者Unicode編碼啟動(dòng)函數(shù)還各不相同,為保持簡(jiǎn)單、純粹。我們今天僅僅討論ANSI編碼控制臺(tái)程序下純C語(yǔ)言的程序入口分析。

事實(shí)上,在VC6編譯器下,ANSI編碼環(huán)境下C語(yǔ)言的真正啟動(dòng)函數(shù)名叫做mainCRTStarup,英語(yǔ)好的同學(xué)應(yīng)該可以明白一些,Starup就是初始化、啟動(dòng)的意思,其實(shí)也可以根據(jù)這點(diǎn)明白這個(gè)函數(shù)作用就是在C語(yǔ)言啟動(dòng)之前做一些必要的工作,如堆棧初始化、獲得主函數(shù)的參數(shù)等等。

還是本著我們“實(shí)踐教學(xué)”的原則,我們還是以實(shí)踐、做實(shí)驗(yàn)來(lái)驗(yàn)證和理解我們的知識(shí),由于關(guān)系到函數(shù)間調(diào)用的關(guān)系,我們應(yīng)該聯(lián)想到VC6編譯器帶給我們的;厮莨δ。有興趣的同學(xué)可以參考VC6斷點(diǎn)調(diào)試之窗口監(jiān)視(內(nèi)存監(jiān)視、寄存器和;厮荩╤ttp://www.dotcpp.com/wp/545.html)依次View – Debug Windows-> Call Stack

通過(guò)編譯器提供的棧回溯功能可以看到程序啟動(dòng)后的調(diào)用過(guò)程,如下:

通過(guò)斷點(diǎn)提示,我們看到目前程序位于main函數(shù)第四行?梢钥吹缴弦淮问潜籱ainCRTStartup函數(shù)調(diào)用,在第206行的25個(gè)字節(jié)偏移處開始調(diào)用,再之前就是KERNEL32了,它是windows系統(tǒng)三大主要文件之一。軟件系統(tǒng)層面的調(diào)用就到此為止了。

因?yàn)榇蠖鄶?shù)逆向分析工具基本都會(huì)從這里開始,所以我們也重點(diǎn)研究mainCRTStartup函數(shù)的原理。幸運(yùn)的是,VC6編譯器為我們提供了mainCRTStartup函數(shù)的源碼,但需要大家安裝完整版才可以看到,不然只能看到反匯編代碼。

這里我們摘錄一部分主要的mainCRTStartup代碼,供大家參考學(xué)習(xí):

以上語(yǔ)法依舊是C語(yǔ)言,大家可以自行對(duì)照注釋進(jìn)行理解,熟悉main函數(shù)在調(diào)用前的一些準(zhǔn)備工作,可以總結(jié)如下:

1.GetVersion函數(shù):獲取當(dāng)前運(yùn)行平臺(tái)的版本號(hào)?刂婆_(tái)下則為MS-DOS的版本信息。

2._heap_inith函數(shù):用于初始化堆空間。在函數(shù)實(shí)現(xiàn)中使用HeapCreate申請(qǐng)堆空間

3.GetCommandLineA函數(shù):獲取命令行參數(shù)信息的首地址

4._crtGetEnvironmentStringA函數(shù):獲取環(huán)境變量信息的首地址

5._setargv函數(shù):此函數(shù)根據(jù)GetCommandLineA獲取命令行參數(shù)信息的首地址并進(jìn)行參數(shù)分析 注意主函數(shù)的參數(shù)就在這里獲得!

6._setenvp函數(shù):此函數(shù)根據(jù)_crtGetEnvironmentStringA函數(shù)獲取環(huán)境變量信息的首地址進(jìn)行分析。

7._cinit函數(shù):用于全局變量數(shù)據(jù)和浮點(diǎn)數(shù)寄存器的初始化。

大家可以對(duì)比代碼加注釋深入理解main函數(shù)啟動(dòng)前的準(zhǔn)備工作,來(lái)加深程序啟動(dòng)的機(jī)制理解。

通過(guò)觀察,在_cinit()函數(shù)之后,我們可以看到有主函數(shù)的調(diào)用語(yǔ)句mainret = main(_argc,_argv,_environ),現(xiàn)在知道主函數(shù)的返回值給誰(shuí)了吧?

至此,我們最熟悉的main函數(shù)就出現(xiàn)了,怎么樣,大家連起來(lái)了嗎?

如果還能理解,我們接下來(lái)做一個(gè)更改入口函數(shù)的實(shí)驗(yàn),來(lái)加深大家的學(xué)習(xí)。如下:

編譯器工具欄 Project – Setting – Link – Output 如下圖:

在入口點(diǎn)出輸入你想自定義的函數(shù)名,比如起名MyDotcpp,將替換掉mainCRTStartup函數(shù),重新被KERNEL32調(diào)用,main函數(shù)作為C語(yǔ)言語(yǔ)法入口點(diǎn),被MyDotcpp調(diào)用,如圖:

重新打開;厮莶榭凑{(diào)用情況,可以看到入口函數(shù)已經(jīng)被更改掉了:

當(dāng)然,這里我們定義的MyDotcpp函數(shù)僅僅用來(lái)測(cè)試更改入口函數(shù),正如mainCRTStartup之前描述的代碼一般,入口函數(shù)擁有更多的比如初始化堆空間、浮點(diǎn)數(shù)等功能,如果我們這里在多加一些如開辟內(nèi)存等語(yǔ)句,運(yùn)行將會(huì)報(bào)錯(cuò),大家可以親自上機(jī)嘗試。

 

 

聯(lián)系方式0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬(wàn)眾潤(rùn)豐創(chuàng)業(yè)園A棟2樓A08

欧美一区二区三区高潮菊竹| 欧美精品亚洲精品一区| 国产精品伦一区二区三区四季| 日韩精品一区二区三区含羞含羞草 | 高清不卡一卡二卡区在线| 国产又粗又硬又长又爽的剧情| 91亚洲熟女少妇在线观看| 日本免费一区二区三女| 果冻传媒精选麻豆白晶晶| 国产精品日韩精品最新| 亚洲中文字幕有码在线观看| 色播五月激情五月婷婷| 麻豆剧果冻传媒一二三区| 日本欧美一区二区三区在线播| 美女被后入福利在线观看| 日本高清一区免费不卡| 黑色丝袜脚足国产一区二区| 亚洲中文字幕有码在线观看| 中字幕一区二区三区久久蜜桃 | 国产又大又硬又粗又黄| 日韩精品福利在线观看| 日韩免费成人福利在线| 精品国模一区二区三区欧美| 亚洲最新中文字幕一区| 亚洲黄色在线观看免费高清| 91在线国内在线中文字幕| 视频一区中文字幕日韩| 国产91人妻精品一区二区三区| 国产免费一区二区三区av大片| 婷婷基地五月激情五月| 免费在线播放一区二区| 欧美成人久久久免费播放| 色婷婷成人精品综合一区| 欧美成人精品一区二区久久| 色丁香一区二区黑人巨大| 精品人妻av区波多野结依| 日本少妇三级三级三级| 正在播放玩弄漂亮少妇高潮| 在线亚洲成人中文字幕高清| 国产香蕉国产精品偷在线观看| 日韩欧美国产精品中文字幕|