抗去除花指令(一)——花指令基礎

    入門知識,高手勿讀

一、 概述

花指令是對抗反彙編的有效手段之一,正常代碼添加了花指令之後,可以破壞靜態反彙編的過程,使反彙編的結果出現錯誤。錯誤的反彙編結果會造成破解者的分析工作大量增加,進而使之不能理解程序的結構和算法,也就很難破解程序,從而達到病毒或軟件保護的目的。

 

二、花指令分類

[2.1]可執行式花指令

顧名思義,可執行式花指令指的是能夠正常運行的但又不改變原始程序邏輯性的一組無用指令。這類花指令有如下特點:①可以正常運行;②不改變任何寄存器的值;③反匯編器可以正確反彙編該指令。

例如這樣幾組花指令就屬於該類別:PUSHEAXPOPEAXNOPINCEAX&DECEAX等等。這種類別的花指令組合形式很多,常常用在病毒代碼的變形引擎中,病毒在傳播時通過變形引擎隨機產生一組該類別花指令並插入到病毒正常代碼中,可以改變病毒的特徵碼,從而起到變形的作用。

 

[2.2]不可執行式花指令(垃圾指令)

本文主要就是講這個方面,是指被插入到原始代碼中但又不改變原始程序邏輯性的一組無用字節。這類花指令有如下特點:①不可以正常運行;②不改變任何寄存器的值;③反彙編器可能會錯誤反彙編這些字節。

根據反彙編的工作原理,只有當花指令同正常指令的開始幾個字節被反彙編器識別成一條指令時,纔能有效破壞反彙編的結果。因此,插入的花指令應當是一些不完整的指令,被插入的不完整指令可以是隨機選擇的。正因爲不可執行花指令有這些特點,該類花指令才能應用到軟件保護中。

Cullen等人指出爲了能夠有效“迷惑"靜態反彙編工具,同時保證代碼的正確運行,花指令必須滿足兩個基本特徵,即:

1)垃圾數據必須是某個合法指令的一部分:

2)程序運行時,花指令必須位於實際不可執行的代碼路徑。

三、不可執行花指令的成功來自反彙編算法的缺陷

當前靜態分析中採用的反彙編算法主要可以分爲2類:線性掃描算法與行進遞歸算法。

[3.1]線性掃描反彙編算法

線性掃描算法p1從程序的入口點開始反彙編,然後對整個代碼段進行掃描,反彙編掃描過程中所遇到的每條指令。線性掃描算法的缺點在於在馮諾依曼體系結構下,無法區分數據與代碼,從而導致將代碼段中嵌入的數據誤解釋爲指令的操作碼,以致最後得到錯誤的反彙編結果。

[3.2]行進遞歸反拒綰算法

相比線性掃描算法,行進遞歸算法通過程序的控制流來確定反彙編的下一條指令,遇到非控制轉移指令時順序進行反彙編,而遇到控制轉移指令時則從轉移地址處開始進行反彙編。行進遞歸算法的缺點在於準確確定間接轉移目的地址的難度較大。

 

四、簡單不可執行花指令

    實際編程中不要簡單花指令,否則容易被去除或被認爲是病毒。

下面是的最典型形式:

 

jmp Label1

  db thunkcode1;垃圾數據

Label1:

  ……

 

解析:

1Jmp可以用callretloop等替換

2.該垃圾數據通常是一條多字節指令的操作碼,例如在thunkcode1處放入0e8h,由於0e8hcall指令的操作碼,因此對0e8h進行解碼時就會將它後面的4個字節,也就是maliciouscode的前4個字節看作是調用目標地址,從而造成反彙編過程中的錯誤,達到隱藏惡意代碼的目的。

 

五、稍複雜的花指令

[5.1]多節形式

典型形式的條件跳轉混淆可能僅僅造成幾條指令的反彙編錯誤,但是下面的多重順序嵌套的條件跳轉混淆則能夠使更多指令的反彙編得到錯誤的結果。

舉例:

  JMP Label1

  Db thunkcode1

Label1:

  ……

  JMP Label2

  Db thunkcode2

Label2:

  ……

[5.2]多層亂序

在上面的形式中,可以簡單地將條件跳轉到跳轉目的地址之間的所有字節進行填充來破解混淆,於是有了條件混淆的一種新的形式,即多層亂序嵌套:

JMP Label1

  Db thunkcode1

Label2:

  ……

  JMP Label3

  Db thunkcode3

Label1:

  …….

  JMP Label2

  Db thunkcode2

Label3:

  ……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章