用二進制來寫程式這么反人類的事情,的確是很裝的事情,但是它不但是一件很裝的事情,也是掌握底層知識的基礎能力之一,聽我慢慢道來,
程式設計語言有高級語言和低級語言之分,尤其是現在各種編程語言的不斷發展,掌握高級程式設計語言的人越來越多,
但是是否可以使用二進制來寫程式呢?也許最初使用打孔帶來控制機器的人可以完成,那么現在是否仍然有人可以完成呢?答案是肯定的!
計算機可以直接運行的指令是二進制的機器碼,所有的代碼在運行之前都會變成 CPU 可以識別的二進制,對于編譯型的二進制語言,其實都是可以直接使用二進制來寫的,
比如,Windows 下使用 C 語言撰寫的程式編譯連接后可以生成一個 .exe 的可執行程式,生成的這個可執行程式就是一個二進制程式,那么,這個程式如何用二進制撰寫呢?
先來考慮幾個問題!
首先,可執行程式中并非只有代碼,而 CPU 要執行的只有代碼,
其次,CPU 執行的代碼是二進制,但是在記憶體中的資料也是二進制資料,那么如何知道哪部分是代碼,哪部分是資料呢?這是作業系統在加載程式檔案進入記憶體時,作業系統按照一定規則把不同二進制按照不同的屬性裝入了不同的記憶體分頁當中,并對記憶體設定相應的屬性,
最后,作業系統如何知道程式檔案中的二進制哪部分是資料,哪部分是代碼呢?這是在程式被編譯連接時不但把代碼和代碼所需的資料編譯到了程式中,還把管理代碼的資料也放入了程式中,而這部分管理資料決定了哪部分是資料哪部分是代碼,
因此,用二進制寫代碼就需要至少掌握兩方面,一方面是了解可執行程式的管理資料,另一方面就是了解 CPU 的機器碼,
在 Windows 下的可執行程式是 PE 格式的,那么就要了解 PE 格式的資料結構,和 CPU 的機器碼;在安卓下的可執行程式中,其格式是 DEX 格式,那么就要了解 DEX 格式的資料結構,以及安卓虛擬機的位元組碼(這個位元組碼不是 CPU 的機器碼,DEX 的位元組碼最終被虛擬機解釋成機器碼,因此手寫 DEX 檔案時了解 DEX 格式和其位元組碼即可),同樣的,Java 編譯的 Class 檔案也和安卓相同,因為它也是基于虛擬機執行的檔案,其中 PE 格式和 DEX 格式就是程式的管理資料,用于告訴作業系統或虛擬機,整個檔案中代碼、資料以及其他資源在檔案中的結構,
因為二進制的閱讀性比較差,因此人們使用了八進制和十六進制,四位二進制可以表示為一位十六進制,由于系統是 32 位或 64 位,那么剛好使用 8 個十六進制位表示 32 個二進制位,或者 16 個十六進制位表示 64 個二進制位,因此,在記憶體中查看資料時,更多的是使用十六進制,其實從本質上十六進制和二進制是沒有區別的,只是表示的方式不同,因此,真正使用二進制來寫程式時,是使用十六進制來完成的,
那么,在使用十六進制來撰寫 Windows 下的可執行程式時,首先需要使用十六進制編輯器構造 PE 檔案結構,PE 檔案結構主要告訴作業系統,程式加載入記憶體后,程式的映射起始地址是多少,程式的入口地址是多少,程式中的代碼和資料分別保存在哪里,以及它們的長度是多少,映射到記憶體中以后其地址是多少,該可執行檔案呼叫了哪些系統函式,這些系統函式分別在哪些元件中等資訊,構造完 PE 檔案結構以后,就可以使用機器碼來寫程式了,只要把機器代碼寫到 PE 檔案結構中標識程式入口的位置處就行了,當然了,機器碼寫程式是比較困難的,但是作為學習底層基礎知識來說,寫一個簡單的程式還是可以的,比如寫一個彈出對話框的“hello world”這樣的程式,用機器碼寫這樣的程式,也無需了解太多的知識,有一份 Opcode 的手冊就可以了,
這就是如何用十六進制編輯器來完成一個可執行程式的程序,關于 PE 檔案格式,可以參考 MSDN 或網上的文章,對于學習機器碼相關的知識可以查看 Intel 的指令手冊,學習這些知識對于軟體破解、病毒分析、加密解密、內核驅動開發等是相應知識的基礎,感興趣的可以了解一下,了解這些知識絕對不僅僅是用來裝 X 的,
我的微信公眾號:“碼農UP2U”

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/53213.html
標籤:其他
上一篇:除了獲取 MAC 地址還能干啥
下一篇:SQL注入:寬位元組注入
