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


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

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

15.1 回顧

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

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

但是上面的MIPS是一種精簡指令集(RISC)的處理器架構,特別是I型指令用連續兩個5位二進制碼來表示兩個暫存器的位址,然後是一個16位二進制碼來表示的一個立即數二進制碼。我們有個概念就好了,因為我們學的是複雜指令集(CISC)的Intel架構。

換成我們書上的第一個程式實例,就像下圖:

把紅色框框放大來看,沒錯!接下來的章節我們都會一個個把常用到的組合語言的助記符號或叫做指令,找出對應的運算碼,並且整理出來。以後指令與運算碼將劃上等號,也就是說看到一堆機械碼可以想像出原始的組合語言是怎麼設計的,甚至可以猜測出如果是以C語言來寫的話,大概長甚麼樣子。

首先,我們來看下圖:

以我們這本書中都是使用Visual Studio的C++語言來寫組合語言,因此會經由內建的編譯程式來做翻譯的工作,把組合語言程式碼轉換成Intel所提供的運算碼,或稱作Opcode。然後我們可以藉由Visual Studio的反組譯功能來得知他的執行檔內容及原始程式碼。

雖然反組譯的原始碼大多會跟原來的一樣,但也可能因為編譯器的最佳化過程造成不一定與原始碼一模一樣的情況。不過,如果原本是寫C語言,經過編譯後成Opcode,很難逆向推回去得知原始碼為何,但這對於我們來說並不是很重要,因為我們大多只需要知道設計的邏輯,去修改執行檔案中的Opcode達成我們期望的目的即可。

發表留言

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