1. 程式人生 > >逆向分析之花指令1

逆向分析之花指令1

一、 概述

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

二、花指令分類

[2.1]可執行式花指令

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

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

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

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

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

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

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

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

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

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

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

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

[3.2]行進遞迴反拒綰演算法

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

四、簡單不可執行花指令

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

下面是的最典型形式:

jmp Label1

  db thunkcode1;垃圾資料

Label1:

  ……

解析:

1.Jmp可以用call,ret,loop等替換

2.該垃圾資料通常是一條多位元組指令的操作碼,例如在thunkcode1處放入0e8h,由於0e8h是call指令的操作碼,因此對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:

  ……