2017-08-19 135 views
2

我嘗試瞭解Michael Sikorski所着的書「實用惡意軟件分析」的示例。有一個關於反拆卸技術的例子,我不理解。它說一種常見的技術是創建兩條條件指令,即如果跳轉到零(JZ)並跳轉(如果不是零)(JNZ),它們一起考慮實際上只是一個無條件指令(這對我來說很清楚)。以下是反彙編程序創建的兩個可能結果的圖形。x86彙編對同一目標的兩個跳轉指令

wrong interpretation

right interpretation

下面引用指的是圖中1

在本例中,緊接在兩個條件跳轉指令的指令似乎是在一個調用指令(調用),從字節0xE8開始。這是不是這樣的,但是,因爲這兩個條件跳轉指令實際上指向一個字節超出了0xE8字節

那是什麼意思?爲什麼跳位置loc_4011C4 + 1(其中從自帶+1) ?並在圖2它是loc_4011C5?有人可以提供更詳細的解釋嗎?

+1

跳轉目標在調用指令內部是1個字節。爲什麼?因爲這就是程序員編寫它的原因,大概是爲了混淆目的。圖2顯示了將要執行的實際指令。 C4 + 1 = C5 – Jester

回答

6

彙編代碼編譯的結果是一段本地代碼,更具體地說是一個字節序列,其中該序列的不同部分對應於來自原始程序集的指令。英特爾x86處理器有一個所謂的CISC指令集,基本上意味着指令長度以字節爲單位可以從1變化到12,並且不考慮現在可用的指令集擴展。所提出的技術利用了這個事實。

重點在於誤導那些潛在的惡作劇的人。第二個例子的代碼(pop eaxretn)就是我們要執行的內容以及執行的內容。然而,因爲我們在pop eax指令的前面插入了一個假字節,所以反彙編代碼將不會被關注,就好像內存中的某個位置出現了call一樣,因爲大多數不太明亮的反彙編器會自動假定機器代碼爲二進制沒有差距。

這種技術並非萬無一失。更復雜的裝配者將揭示作者的真實意圖。還要注意,如果試圖闖入代碼的人在調試環境中運行它,這種技術將再次無用。