使用C++(I386+)編譯一個純二進位制檔案 (轉)

worldblog發表於2008-01-22
使用C++(I386+)編譯一個純二進位制檔案 (轉)[@more@]

環境搭建設:namespace prefix = o ns = "urn:schemas--com::office" />

在目前,很少有關於這方面太多的資料。因此這也是我下決心來寫一些東西的原因,希望這篇文章能對大家有所幫助。在讀該篇文章前,你必須有一定的基礎。否則,在閱讀時會有很大困難,首先你要了解語言及C語言,其次,你要會使用。

首先我要先介紹一下,所需要的及環境。

1、一臺,I386構架的PC機或者更高

2、一份LINUX操作,如:紅帽子。

3、 GCC,這個C編譯器通常是LINUX自帶的。請用此命令(GCC –VERSION)來檢查以下它的版本,我這裡顯示的是2.7.2.3。也許在你哪裡可能顯示的不是這個版本,但是我想應該不會有太大的問題。

4、版本為0.97或者更高的NASM。NASM是一個免費的支援便宜多種格式的彙編編譯器,它的語法設計的的很簡單,很容易上手。到這裡尋找相應的版本http://www.ibiblio.org/pub/Linux/devel/lang/assemblers/

5、一個文字編輯器

彙編編譯器

  把從INTE上到的檔案,在一個適當的目錄下解壓,輸入下列命令:

  gunznasm-0.97.tar.gz

-vxf nasm-0.97.tar

  上面的命令會建立一個叫做nasm-0.97的目錄,進入該目錄我們開始編譯這個彙編編譯器,輸入下列命令:

  ./configure

make

  這樣會建立兩個可檔案nasm 和ndim.。你可以把這兩個檔案考備到/usr/bin,這樣就可以很容易的來執行該檔案了。接下來,你可以把剛才因為編譯而建立的目錄及目錄下所有的檔案刪除了。經過這些步驟,我們就可以開始進入真正的主題了。

開始編譯我們的第一個二進位制檔案

  使用任何一個文字編輯器,建立一個叫TEST.C的檔案,然後在輸入以下內容:

  int main () {

}

  然後我們開始編譯這個檔案。輸入以下命令:

  gcc -c test.c

ld -o test -Ttext 0x0 -e main test.o

objcopy -R .note -R .comment -S -O binary test test.bin

  請注意,這裡的test.bin檔案是一個二進位制機器碼的檔案,和我們平時在及LINUX下執行的可執行檔案不一樣。需要把二進位制機器碼經過一定格式的封裝後透過的裝載器裝載後才可以在作業系統裡執行。可執行檔案不是這篇文章的主題,在這裡我們就不做討論了。如果想學的朋友,可以在先在二進位制機器碼檔案上下下功夫,相信我這對你以後的一定會有幫助的,好了現在言歸正傳,開始介紹二進位制機器碼了。

  經過上面的步驟,我們已經建立了一個叫test.bin的二進位制機器碼檔案。我們可以用剛才編譯過的ndisasm來看我們的第一個二進位制機器碼檔案。請輸入下面的命令:

  ndisasm -b 32 test.bin

  當你按下回車後,就會在螢幕上輸出以下內容:

00000000   55  push ebp

00000001  89E5  mov ebp,esp

00000003   C9  leave

00000004   C3  ret

  我們會在螢幕上看到有三列文字,第一列是表示指令在中的地址。第二列是指令的二進位制碼,第三列就是指令的彙編程式碼。注意指令的彙編程式碼是和指令的二進位制碼一一對應的。

  你應該注意到,這是一個32位的程式碼,GNC GCC只能生成32位的程式碼。因此要執行這個也必須在32位的環境中執行。這段程式碼只是完成了一個住的,並沒有執行任何指令。EBP指標是用來儲存函式引數的。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998167/,如需轉載,請註明出處,否則將追究法律責任。

相關文章