国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

C++入口不是main?知乎上打起來了!

開發 后端
PE文件中有一個叫OEP的術語便是指的程序入口點。所謂入口點顧名思義就是主線程最開始執行的地方,許多病毒加殼技術其中一點就是對這個OEP進行處理。

[[427646]]

知乎上居然有人為了C++的入口函數到底是什么打了起來!

至于打的有多激烈我就不知道了,我們來關注這個問題本身。

你說main函數是入口,那main是被誰調用的呢?

他說mainCRTStartup是入口,那mainCRTStartup又是被誰調用的呢?

從進程創建說起

一切的一切,讓我們從創建進程開始說起。

進程創建完成后,接著會創建主線程,這是進程中第一個開始執行代碼的線程。

主線程創建后,就得到了時間片,開始參與系統的線程調度,那么程序從哪里開始執行呢?

在Windows平臺,C++代碼編譯后的可執行文件叫PE文件。

PE文件中有一個叫OEP的術語便是指的程序入口點。所謂入口點顧名思義就是主線程最開始執行的地方,許多病毒加殼技術其中一點就是對這個OEP進行處理。

現在,我們來使用工具PEID來看一個程序(VC8.0編譯)的OEP如圖:

0x00011078乃是RVA(相對虛擬地址),要看在進程地址空間中真正的起始地址,還得加上PE文件的映射基址,默認為0x00400000,不過,可以通過編譯器選項進行調整。不知道也沒關系,將程序放入OllyDbg,在內存映射中可以看到程序的映射基址:

由圖看到映射基址是0x00400000。

那么由前面所述,程序執行的第一條指令應該位于0x00400000 + 0x00011078 = 0x00411078。

沒錯,就是這樣。

切換到OllyDbg的主窗口,我們發現了,程序確實初始停在了這里,并且這里是一條jmp指令。

我們到Jmp的目的地0x00411800去看看那里是什么東東?

這是什么東西?先賣個關子,總之,這里是程序進來之后真正做的第一件事。

main函數被誰調用?

換個思路,我們打開VS2008寫一個簡單的程序,程序做什么并不重要,我們要看它的啟動原理。

注意看調用堆棧窗口,因為我是使用UNICODE編碼環境,故_tmain()就是wmain(),如果是ANSI編碼就是最開始學程序時的main()函數了。

以前寫程序就想過一個問題,我們寫的所有函數都會被我們自己直接或間接調用,但有一個函數例外,那就是main()函數。我們寫了它但從不會去調用它,事實上也不可能去調用它。

從調用堆棧看到,我們的wmain函數是被_tmainCRTStartup函數調用的,這是個什么東西?再往前推是wmainCRTStartup調用的_tmainCRTStartup。這兩個函數是做什么的,他們之間有什么關系?

雙擊調用堆棧里的項即可轉到對應的源代碼,我們可以發現,這兩個函數是在crtexe.c文件中實現的。閱讀源碼可以發現,有四個啟動函數分別是:

  • mainCRTStartup() ANSI + 控制臺程序
  • wmainCRTStartup() UNICODE + 控制臺程序
  • WinMainCRTStartup() ANSI + GUI程序
  • wWinMainCRTStartup() UNICODE + GUI程序

這一點在《windows核心編程》中也有提到。不過我們可以更進一步一窺它們的實現代碼:

就這么簡單,先調用了__security_init_cookie(),然后是我們前面看到的_tmainCRTStartup()。

第一個函數是做什么的呢?這個是微軟在VS2003后引入的防止緩沖區溢出攻擊的技術。簡單的說就是在調用函數的時候在棧里安裝一個隨機的cookie值,這一cookie值在內存的一個地方有備份,函數調用完成后需要檢測這個cookie和備份的一不一致,以此來判斷有沒有棧溢出發生。那么,這個函數就是來初始化這個備份區域的數據的。

然后第二個函數調用_initterm()進行全局變量、對象初始化。之后,我們可以看到才是真正調用了我們的main()/wmain()/WinMain()/wWinMain()的地方。饒了一大圈,回答了開始的疑問了。

這兩個函數是編譯器在生成可執行文件的時候給我們鏈接進來的。

至此,我們來看看第一個函數wmainCRTStartup的匯編代碼。如圖:

請注意和我們前面使用OllyDbg調試時的圖對比:

發現沒有?一樣的!我們之前留的那個問題的答案想必已經出來了:

程序一進來從OEP處執行了jmp指令,這條指令轉向了wmainCRTStartup開始了程序真正的起點!

結論

編譯生成的exe文件,雙擊運行后,建立新進程的地址空間,然后主線程開始運行。

程序一進來通過jmp指令來到前面列出的四個啟動函數,它們再調用最終的啟動器_tmainCRTStartup。

這個啟動器干了幾件大事,分別是,使用GetStartupInfo獲取進程啟動信息,然后使用_inititem初始化全局變量和對象,最后調用我們main、wmain、WinMain、wWinMain進入我們的程序。。。

所以,從編程語言的角度來說,main函數就是入口函數,這一點毋庸置疑。至于mainCRTStartup,則是VC++這個編譯器額外增加的包含C/C++運行時庫初始化操作在內的封裝函數,可以算可執行文件的入口函數。

說明:這里談到的是使用VC2008編譯器生成的exe文件形態(不同的VC版本可能情況有所不同),至于Linux上的ELF文件,情況則更不一樣。

最后給大家留一個思考題:

進程創建后,又是從哪里進入到OEP的呢?

前面我們說了,OEP是程序運行的入口,是一切的起點。那在進入入口之前,進程又在干什么?

這個問題有點類似于:在宇宙大爆炸之前,世界是怎么樣的?

本文轉載自微信公眾號「編程技術宇宙」,可以通過以下二維碼關注。轉載本文請聯系編程技術宇宙公眾號。

 

責任編輯:武曉燕 來源: 編程技術宇宙
相關推薦

2022-03-30 10:00:22

大廠流量互聯網

2024-01-09 11:52:23

Rust開發函數

2010-01-27 13:31:10

C++ main()函

2010-01-19 14:28:41

C++ main()函

2019-11-25 11:03:19

互聯網數據技術

2018-12-13 11:32:55

知乎裁員調整

2023-11-27 16:26:20

mainC語言

2025-02-11 09:12:55

2017-06-16 21:00:02

Python爬蟲

2017-11-20 10:21:17

量子點顯示器OLED

2023-09-24 23:44:10

C++類型安全

2017-05-24 15:07:19

Python爬蟲爬取

2023-06-27 07:20:45

2023-07-18 18:14:51

云原生軟件架構

2011-04-19 17:36:12

C++

2015-03-20 10:00:34

LinuxCC++

2015-11-04 09:06:11

知乎融資騰訊

2020-06-11 18:35:23

C++編程語言

2015-07-21 15:22:20

點贊仿知乎按鈕動畫

2024-09-20 08:20:20

點贊
收藏

51CTO技術棧公眾號

亚洲国产精品毛片| 蜜桃av在线| 国产大陆精品国产| 精品一区二区国产| 日韩影院二区| 午夜精品久久久久久久男人的天堂| 婷婷六月国产精品久久不卡| 日韩欧美一级二级三级| 99青草视频在线播放视| 精品国产老师黑色丝袜高跟鞋| 福利视频网站| 国产精品全国免费观看高清| 精品国产成人av在线免| 99视频在线观看一区三区| 成人一级生活片| 国产乱人伦偷精品视频不卡| 欧美性大战久久久久| 国产亚洲永久域名| 久久狠狠久久综合桃花| 99在线精品视频在线观看| 国产麻豆乱码精品一区二区三区 | 欧美在线日韩精品| 久久综合伊人| 久久综合一区二区三区| 久久精品30| 熟女视频一区二区三区| 国产不卡在线一区| 一本久道综合色婷婷五月| 国产喷白浆一区二区三区| 日本爱爱免费视频| 亚洲色欲色欲www在线观看| 女人裸体免费网站| 亚洲高清不卡在线| 色网站在线看| 亚洲第一级黄色片| 亚洲精品555| 久久久久久久久久久久久久久久久久av | 污香蕉视频在线观看| 色综合天天在线| 日本视频在线| 国产一区二区av在线| 久久青草精品视频免费观看| 国产精品手机在线播放| 国产精品一国产精品最新章节| 美女视频一区免费观看| 国产午夜精品视频一区二区三区| a在线欧美一区| 日本成本人片免费观看| 91九色最新地址| 中文字幕乱码在线播放| 欧美高清视频免费观看| 99精品在线| 香蕉精品视频在线| 亚洲国产岛国毛片在线| 成人影视在线播放| 欧美国产禁国产网站cc| 黄页免费在线观看| www国产精品av| 国产精品99久久99久久久二8| 欧美成人tv| 成人短视频在线看| 中文字幕人成不卡一区| 91在线视频免费看| 深夜福利国产精品| 99精品在线免费在线观看| 一区二区不卡在线视频 午夜欧美不卡' | 亚洲a一区二区三区| 午夜一区二区三区| 中文字幕成人av| 国产专区在线播放| 最近中文字幕日韩精品| 牛夜精品久久久久久久99黑人| 精品国产三级a∨在线| 亚洲永久精品国产| 一区二区乱码| 国产欧美一区二区白浆黑人| 国产一区二区免费视频| 四虎精品在永久在线观看| 亚洲日韩欧美视频一区| 久久精品国产大片免费观看| av免费观看国产| 欧美精品久久久久久久多人混战 | 亚洲欧美精品一区| 欧美高清在线| 亚洲综合清纯丝袜自拍| 超免费在线视频| 国产成人精品久久二区二区91| 韩国精品免费视频| 日本电影一区二区在线观看| 久久在线精品视频| 亚洲免费中文| 在线一区二区三区精品| 欧美成人免费网| 久久国产乱子精品免费女| 免费人成黄页在线观看忧物| 午夜欧美不卡精品aaaaa| 加勒比av一区二区| yjizz视频网站在线播放| 羞羞色国产精品| 成人午夜激情影院| 在线āv视频| 91一区二区三区| 亚洲一区二区四区蜜桃| 1769国产精品视频| 日韩av新片网| 日韩国产精品亚洲а∨天堂免| 亚洲国产精品第一区二区三区| 22288色视频在线观看| 久久久久久欧美| av一区二区三区黑人| free性护士videos欧美| 国产在线精品一区| 色婷婷综合久久| 婷婷久久一区| 日本19禁啪啪吃奶大尺度| 毛片精品免费在线观看| 国产成人av电影在线观看| 26uuu亚洲电影在线观看| 国产二区一区| 日韩欧美在线中文字幕| 日韩大片在线| 宅男午夜电影| 国产在线播放91| 欧美天天综合色影久久精品| 欧美一级精品片在线看| 国产精品视频一区二区图片| 欧美精品久久一区二区| 久久亚洲二区三区| 亚洲高清国产拍精品26u| 黄色特一级视频| 中文字幕视频一区二区在线有码| 国产久卡久卡久卡久卡视频精品| 男人的天堂免费在线视频| 性欧美18一19内谢| 国产丝袜精品第一页| 国产精品一区一区| 99久久亚洲国产日韩美女| 欧美视频在线观看网站| 久久韩剧网电视剧| 欧美激情综合五月色丁香| 亚洲黄页网站| 在线国产视频| 国产精品亚洲综合| 日韩欧美在线1卡| 青椒成人免费视频| 亚洲成av在线| 999香蕉视频| 国产精品爱啪在线线免费观看| 五月激情综合色| 99亚洲一区二区| 亚洲优女在线| 一本久道中文无码字幕av| 日韩**中文字幕毛片| 成人中文字幕在线观看| 91国偷自产一区二区三区成为亚洲经典| 天堂久久一区二区三区| 国产精品99久久| 久久爱.com| 国产精品yjizz视频网| 天天色综合6| www视频在线免费观看| 国产精品第100页| 精品国产一级| 成人三级av| 亚洲xxx大片| 日韩欧美资源站| 99视频精品在线| av伊人久久| 久久五月精品中文字幕| 国内外免费激情视频| 国产主播喷水一区二区| 欧美精品一区二区三区在线播放| 成人av网站在线观看免费| 免费观看久久av| 成人三级网址| 777米奇影视第四色| 国产日韩在线一区| 精品sm捆绑视频| 欧美激情综合五月色丁香小说| 91精品推荐| 三上悠亚亚洲一区| 免费av播放| 亚洲欧美在线网| 欧洲精品毛片网站| 欧美成人一区二区三区片免费| 国产午夜一区二区三区| 欧美有码视频| 久久精品国产福利| 色资源在线观看| 中国丰满熟妇xxxx性| 91免费欧美精品| 在线观看成人黄色| 亚洲动漫第一页| 精品在线播放免费| 久久视频精品| 国产精品1区| 蜜乳av一区| 玖玖在线免费视频| 免费看又黄又无码的网站| 国产嫩草一区二区三区在线观看|