逆向分析之路-從運算碼開始-02


15.2 內嵌組合語言

各位準備回去從頭翻一遍書了嗎?這是一定要的!但這節我們要介紹一種新寫法,直接就在C語言裡寫組合語言。這種特定的語法可是Microsoft限定的喔,而且內嵌組合語言已內建於Visual Studio編譯器了。組合語言有很多用途,例如改善程式速度、減少記憶體需求,以及控制硬體。您可以使用內嵌組合語言或稱內嵌組驛碼,直接在C和C++原始程式中內嵌組譯語言指令,而不需要額外的元件、組譯和連結步驟。

換句話說,就是不見得需要用各別的編譯器去編譯各別的組合語言檔和C語言檔,然後再各別參考或呼叫,這樣就變得很方便很有彈性了。

寫法很簡單,當要用到組合語言的語法時,就要在程式中用關鍵字 __asm 來呼叫內嵌組譯工具,而且可以出現C或C++的任何合法的地方。所以,回到1.1節的例子如下:

用內嵌寫法重現就會是下面這個樣子:

是不是清爽許多了?既然要證明這之間是存在等價的關係,那一定得證明原始碼會得到機械碼成立,且機械碼得到原始碼也成立,那才能確定等價。如果對這等價的觀念不知道也沒關係,就這樣,日後有興趣可以去網路上搜尋一下定義。

在開始之前我們留意一下這種用法的限制:

ARM 和 x64 處理器不支援內嵌組合語言,此方式只能搭配 x86 處理器使用 Visual C/C++ 內嵌組合語言(Inline Assembly)。

簡單的來說就是,下圖必須選編譯成 x86,雖然我們的CPU處理器現在大多已經是64位元,但仍能選擇跑 x86 或 x64。

當不小心選擇了目標是 x64,就會出現下圖的情況,其實很好分辨。

準備好了嗎?我們開始往下看了。

在這章節中,主要探討x86中的16位元及32位元等暫存器運算碼,64位元以上的已經過於複雜,已不在本書的探討範圍。

發表留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料