二進制來寫程序這么反人類的事情,的確是很裝的事情,但是它不但是一件很裝的事情,也是掌握底層知識的基礎能力之一。聽我慢慢道來。
程序設計語言有高級語言和低級語言之分,尤其是現(xiàn)在各種編程語言的不斷發(fā)展,掌握高級程序設計語言的人越來越多。
但是是否可以使用二進制來寫程序呢?也許最初使用打孔帶來控制機器的人可以完成,那么現(xiàn)在是否仍然有人可以完成呢?答案是肯定的!
計算機可以直接運行的指令是二進制的機器碼,所有的代碼在運行之前都會變成 CPU 可以識別的二進制。對于編譯型的二進制語言,其實都是可以直接使用二進制來寫的。
比如,Windows 下使用 C 語言編寫的程序編譯連接后可以生成一個 .exe 的可執(zhí)行程序,生成的這個可執(zhí)行程序就是一個二進制程序。那么,這個程序如何用二進制編寫呢?
先來考慮幾個問題!
首先,可執(zhí)行程序中并非只有代碼,而 CPU 要執(zhí)行的只有代碼。
其次,CPU 執(zhí)行的代碼是二進制,但是在內存中的數(shù)據也是二進制數(shù)據,那么如何知道哪部分是代碼,哪部分是數(shù)據呢?這是操作系統(tǒng)在加載程序文件進入內存時,操作系統(tǒng)按照一定規(guī)則把不同二進制按照不同的屬性裝入了不同的內存分頁當中,并對內存設置相應的屬性。
最后,操作系統(tǒng)如何知道程序文件中的二進制哪部分是數(shù)據,哪部分是代碼呢?這是在程序被編譯連接時不但把代碼和代碼所需的數(shù)據編譯到了程序中,還把管理代碼的數(shù)據也放入了程序中,而這部分管理數(shù)據決定了哪部分是數(shù)據哪部分是代碼。
因此,用二進制寫代碼就需要至少掌握兩方面,一方面是了解可執(zhí)行程序的管理數(shù)據,另一方面就是了解 CPU 的機器碼。
在 Windows 下的可執(zhí)行程序是 PE 格式的,那么就要了解 PE 格式的數(shù)據結構,和 CPU 的機器碼;在安卓下的可執(zhí)行程序中,其格式是 DEX 格式,那么就要了解 DEX 格式的數(shù)據結構,以及安卓虛擬機的字節(jié)碼(這個字節(jié)碼不是 CPU 的機器碼,DEX 的字節(jié)碼最終被虛擬機解釋成機器碼,因此手寫 DEX 文件時了解 DEX 格式和其字節(jié)碼即可),同樣的,Java 編譯的 Class 文件也和安卓相同,因為它也是基于虛擬機執(zhí)行的文件。其中 PE 格式和 DEX 格式就是程序的管理數(shù)據,用于告訴操作系統(tǒng)或虛擬機,整個文件中代碼、數(shù)據以及其他資源在文件中的結構。
因為二進制的閱讀性比較差,因此人們使用了八進制和十六進制。四位二進制可以表示為一位十六進制,由于系統(tǒng)是 32 位或 64 位,那么剛好使用 8 個十六進制位表示 32 個二進制位,或者 16 個十六進制位表示 64 個二進制位。因此,在內存中查看數(shù)據時,更多的是使用十六進制,其實從本質上十六進制和二進制是沒有區(qū)別的,只是表示的方式不同。因此,真正使用二進制來寫程序時,是使用十六進制來完成的。
那么,在使用十六進制來編寫 Windows 下的可執(zhí)行程序時,首先需要使用十六進制編輯器構造 PE 文件結構,PE 文件結構主要告訴操作系統(tǒng),程序加載入內存后,程序的映射起始地址是多少,程序的入口地址是多少,程序中的代碼和數(shù)據分別保存在哪里,以及它們的長度是多少,映射到內存中以后其地址是多少,該可執(zhí)行文件調用了哪些系統(tǒng)函數(shù),這些系統(tǒng)函數(shù)分別在哪些動態(tài)鏈接庫中等信息。構造完 PE 文件結構以后,就可以使用機器碼來寫程序了。只要把機器代碼寫到 PE 文件結構中標識程序入口的位置處就行了。當然了,機器碼寫程序是比較困難的,但是作為學習底層基礎知識來說,寫一個簡單的程序還是可以的,比如寫一個彈出對話框的“hello world”這樣的程序。用機器碼寫這樣的程序,也無需了解太多的知識,有一份 Opcode 的手冊就可以了。
這就是如何用十六進制編輯器來完成一個可執(zhí)行程序的過程,關于 PE 文件格式,可以參考 MSDN 或網上的文章,對于學習機器碼相關的知識可以查看 Intel 的指令手冊。學習這些知識對于軟件破解、病毒分析、加密解密、內核驅動開發(fā)等是相應知識的基礎。
-
cpu
+關注
關注
68文章
11288瀏覽量
225200 -
二進制
+關注
關注
2文章
809瀏覽量
43055 -
WINDOWS
+關注
關注
4文章
3702瀏覽量
94106
發(fā)布評論請先 登錄
二進制 GPU 驅動程序需要什么才能啟動?
CDx4HC283與CDx4HCT283:4位二進制全加器的技術解析與應用指南
德州儀器4位二進制全加器:SN54/74系列的技術剖析
探索CD54/74AC283與CD54/74ACT283:高效4位二進制加法器的奧秘
CDx4HC283和CDx4HCT283:高速CMOS邏輯4位二進制全加器的詳細解析
解析CD54/74AC283與CD54/74ACT283:4位二進制加法器的卓越之選
深入剖析CD54/74AC283與CD54/74ACT283:高性能4位二進制加法器
CD54/74AC283與CD54/74ACT283:高性能4位二進制加法器的全面解析
SN54F283與SN74F283:4位二進制全加器的技術剖析
德州儀器4位二進制全加器:SN54/74283系列深度解析
二進制查找(Binary Search)介紹
如何在vivado上基于二進制碼對指令運行狀態(tài)進行判斷
二進制數(shù)據處理方法分享
如何使用二進制寫程序
評論