blog.csdn.net/20180519103243489?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Rlc3RfYmFubmVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/85)
3. 節(jié)表
節(jié)表是可執(zhí)行文件中的一個(gè)數(shù)據(jù)結(jié)構(gòu),它記錄了文件中所有的節(jié)(Section)的信息,如節(jié)的名稱(chēng)、大小、起始位置等等。在Windows操作系統(tǒng)中,節(jié)表是為了方便程序員進(jìn)行內(nèi)存管理而存在的。每個(gè)節(jié)都有自己的一塊內(nèi)存空間,程序員可以在其中存儲(chǔ)代碼、數(shù)據(jù)等信息。
4. 節(jié)數(shù)據(jù)
節(jié)數(shù)據(jù)是可執(zhí)行文件中實(shí)際存儲(chǔ)的代封裝網(wǎng)頁(yè)生成器電腦軟件碼和數(shù)據(jù),它們按照節(jié)表中的描述分別存儲(chǔ)在不同的節(jié)中。
二、生成PE格式的可執(zhí)行文件
在Windows平臺(tái)上,我們可以使用多種編程語(yǔ)言來(lái)生成PE格式的可執(zhí)行文件,如C、C++、C#等等。這里以C語(yǔ)言為例,簡(jiǎn)要介紹如何生成PE格式的可執(zhí)行文件。
1. 編寫(xiě)代碼
首先,我們需要編寫(xiě)程序代碼。在C語(yǔ)言中,我們可以使用標(biāo)準(zhǔn)庫(kù)函數(shù)來(lái)實(shí)現(xiàn)各種功能。下面是一個(gè)簡(jiǎn)單的示例程序,它實(shí)現(xiàn)了從命令行讀取一個(gè)字符串并輸出到屏幕上。
“`
#include
int main(int argc, char *argv[])
{
char str[100];
printf(“Enter a string: “);
scanf(“%s”, str);
printf(“You entered: %s\n”, str);
return 0;
}
“`
2. 編譯代碼
編寫(xiě)好程序代碼后,我們需要用編譯器將其編譯成可執(zhí)行文件。在Windows平臺(tái)上,我們可以使用Microsoft Visual Studio等集成開(kāi)發(fā)環(huán)境來(lái)編譯代碼。在Visual Studio中,我們可以創(chuàng)建一個(gè)控制臺(tái)應(yīng)用程序項(xiàng)目,將上面的代碼復(fù)制到項(xiàng)目中,并點(diǎn)擊“生成”按鈕即可生成可執(zhí)行文件。編譯后的可執(zhí)行文件默認(rèn)會(huì)存儲(chǔ)在項(xiàng)目目錄下的“bin”文件夾中。
3. 生成PE格式的可執(zhí)行文件
編譯后的可執(zhí)行文件默認(rèn)是以COFF格式存儲(chǔ)的,我們需要使用工具將其轉(zhuǎn)換成PE格式的可執(zhí)行文件。在Windows平臺(tái)上,有多種工具可以實(shí)現(xiàn)這個(gè)功能,如objcopy、objdump等等。這里我們介紹一種比較常用的工具——Microsoft的link.exe。
link.exe是Visual Studio自帶的鏈接器,它可以將COFF格式的可執(zhí)行文件轉(zhuǎn)換成PE格式的可執(zhí)行文件。我們可以使用link.exe的命令行界面來(lái)進(jìn)行操作。打開(kāi)命令提示符,進(jìn)入到可執(zhí)行文件所在的目錄,執(zhí)行以下命令即可生成PE格式的可執(zhí)行文件。
“`
link /subsystem:console /entry:main /out:myapp.exe myapp.obj
“`
其中,/subsystem參數(shù)指定了程序的子系統(tǒng)類(lèi)型,這里我們選擇了控制臺(tái)應(yīng)用程序;/entry參數(shù)指定了程序的入口點(diǎn),這里我們選擇了main函數(shù);/out參數(shù)指定了輸出文件的名稱(chēng),這里我們選擇了myapp.exe;myapp.obj是編譯后的目標(biāo)文件。
執(zhí)行完上述命令后,我們就生成了一個(gè)PE格式的可執(zhí)行文件myapp