使用C++(I386+)編譯一個純二進位制檔案 (轉)
環境搭建設: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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- c++ 二進位制儲存檔案C++
- [golang] cgo專案如何編譯便攜版二進位制檔案Golang編譯
- UltraEdit--二進位制檔案編輯功能
- C++ 讀取二進位制檔案到char*C++
- C/C++ 二進位制讀寫 png 檔案C++
- 使用UltraEdit 拷貝二進位制檔案
- 二進位制陣列實戰 - 純前端匯出Excel檔案陣列前端Excel
- 二進位制陣列實戰 – 純前端匯出Excel檔案陣列前端Excel
- 用shell處理二進位制檔案(轉)
- 二進位制檔案複製
- php寫二進位制檔案PHP
- 二進位制檔案拷貝
- C++讀二進位制檔案 及 C++設定double精度C++
- C++中的檔案輸入/輸出(5):二進位制檔案的處理 (轉)C++
- Oracle建立二進位制檔案索引的方法(轉)Oracle索引
- 二進位制檔案視覺化(二)視覺化
- 檔案操作(二進位制拷貝)
- Git處理二進位制檔案Git
- MySQL二進位制檔案(binlog)MySql
- 教你如何在C++二進位制檔案中注入git資訊C++Git
- od 轉儲 二進位制檔案常用命令
- Go1.18 新特性:編譯後的二進位制檔案,將包含更多資訊Go編譯
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制
- 二進位制發行包還是編譯安裝編譯
- 二進位制轉十進位制快速方法
- 二進位制轉十進位制快速轉換方法
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- 文字檔案與二進位制檔案的區別
- 二進位制、十進位制與十六進位制相互轉化
- Python讀寫二進位制檔案Python
- Java二進位制Class檔案格式解析Java
- C#的二進位制檔案操作C#
- ORACLE使用函式對二進位制、十進位制、十六進位制數互相轉換Oracle函式
- 什麼是二進位制?二進位制如何轉換?
- 整數轉化成八進位制、十六進位制、二進位制,以及轉回
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換