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


範例三:圖例說明MOV AL, [記憶體]的狀況

  1. 我們直接用內嵌組合語言的方式在程式中直接比對正反向的所產生的等價關係。

     

  1. 對於內嵌組合語言的方式不允許我們在32位元情況下去直接對16位元暫存器位址存取,所以我們使用本書一開始的組合語言寫法,特別去看 [si] 與 [di]的運算碼。

  繼續閱讀

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


範例二:「mov m8,r8」

  1. 打開Visual Studio使用C++並且輸入以下程式碼,設定中斷點進行驗證。

果然與原先設想的沒錯,只要是第一運算元是記憶體存取(其很自然第當然寫入8位元的資料,故稱m8),第二運算元是8位元一般暫存器,很正常地都是88開頭的運算碼,搭配記憶體 [eax] 00到 [edi] 07,但中間發生了什麼事,編碼怎麼跳開了? 繼續閱讀

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


範例一:「mov r8,r8」產生的是88還是8A

  1. 打開Visual Studio使用C++並且輸入以下程式碼,設定中斷點進行驗證。為了方便,我們不再依本章一開頭的方式慢慢驗證,而是一次就把正向及反向的程式碼都先輸入,再一次驗證:

    

發現正向產生出來的運算碼是8A C0,而反向的opcode2asm片段可以看出88 C0與8A C0都是對應mov al, al。所以可以確定在Windows平台的Visual Studio C++ 8位元暫存器的編譯都是8A開頭的。那88到底是怎麼回事呢? 繼續閱讀

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


15.3.3 x86指令格式

在這小節得先提到一個有點困難的資訊,稱之為x86指令格式。在Intel® 64 and IA-32 Architectures Software Developer’s Manual官方這份文件中有提到一個指令「最多」由這六個項目所組成的,其中只有運算碼是必須的,其他都是視情況而定,如下圖所示:

如非真的必要,我們盡量少提起複雜的部份,如果一時還不明白也沒關係,之後再回過頭來看就清楚點了。

繼續閱讀

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


15.3.2 運算元長度覆蓋

運算元長度覆蓋(Operand-size override),運算碼是66 h再與其他運算碼搭配使用,用在16位元與32位的大小切換。其實他是一個在現有編碼上面的擴充方法,怎麼說呢?

還記得上個小節裡我們故意不講的AX、CX、DX、BX嗎?是的,他就用了這個擴充碼來與32位元的EAX、ECX、EDX、EBX共用運算碼。我們用同法來追蹤一下:

繼續閱讀

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


15.3 mov指令與暫存器

由於Intel的運算碼編碼很複雜,不是三言兩語就可以說完的,而且本書只是提供一個入門法,讓學習的路更輕鬆點,也看懂怎麼去查更複雜的運算碼文件罷了。因為在反組譯的過程當中,我們到處可見mov的蹤跡,所以我們會花多點時間把這個給分析詳細點,在逆向分析之路,不求快,但求懂。

15.3.1 與立即值的搭配

上圖大致整理了x86 CPU中央處理器的內部暫存器,越高階的CPU提供越多位元特性的暫存器。其中A、C、D、B開頭的暫存器都算一般用途,只是當有特殊情況時,其會扮演特殊功能參與運作,當然還有一些旗標暫存器之類的東西。請特別留意一下,這些8位元、16位元暫存器,都是屬於16位元暫存器,只是一般用途的暫存器如AX、CX、DX、BX,可以拆成兩個8位元暫存器來使用罷了繼續閱讀

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


15.2 內嵌組合語言

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

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

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

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

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


最前言:會陸續把之前參與某書, 但因為某些因素而退出, 尚未發表的內容慢慢分享給需要的人, 就算是留給自己的一個紀錄, 電子書之後會再考量是否重編寫過全彩釋出。

第十五章 逆向分析之路-從運算碼開始

15.1 回顧

到這個章節,我們來回想一幕周星馳經典電影蘇乞兒,最後他打出的降龍十八掌最後一式是把所有前面的招式連貫起來。當然我們不是在教降龍十八掌,如果你從前面的章節讀到這裡都還能理解的話,那這章節將會讓你又回去重看一遍了。

先說些基本的東西再往下看,首先,在書中曾提過的OP或者Opcode,中文就叫運算碼或機器語言,是由一堆宣告或指令集所組成。大概就長得像下面這個樣子(下圖引自維基百科): 繼續閱讀