加入收藏| 设为首页
黑客技术 >> 返回 您当前所在位置:首页 > 黑客技术 > 正文

花指令入门,花指令平衡原理

更新时间:2018-10-17 11:04:29点击次数:372次字号:T|T

一、概述 

    花指令是对立反汇编的有用办法之一,正常代码添加了花指令之后,能够损坏静态反汇编的进程,使反汇编的成果呈现过错。过错的反汇编成果会形成破解者的剖析作业很多添加,进而使之不能了解程序的结构和算法,也就很难破解程序,然后到达病毒或软件维护的目的。

二、花指令分类
[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:



【其二:写有“构思”的花指令


一、概述
    “jmp/call/ret+废物数据”这样的花指令已经是适当“老掉牙”了,OD的插件抵挡它们基本是“秒杀”,所以本文想说点“有点构思”的花指令,至少能抵挡OD的插件。
二、构思的核心
[2.1]花指令因何被发现
    “jmp/call/ret+废物数据”的办法之所以简单被检测,原因是“目的太显着”,详细说任何一种检测办法,都是基于以下两点:
①检测跳转结构的固定形状特征,当然这不是绝对的,假如检测机制没能预见到这种形状特征,此点能够疏忽,本文后边会说到一些这样的状况。
②用牢靠的办法直接证明,废物数据部分在任何状况下都不会被履行。应该说该点是对“不行履行花指令”的无敌检测办法,但是却难在“牢靠”二字上,现在已知的实践,只是做到“可供参考”的程度。
[2.2]构思的战略
    经过[2.1]的剖析,咱们知道要想编写“有构思的花指令”,火力应会集在①上,因而咱们经过以下战略对立:
①选用新的固定结构,许多插件还没有检测,比方下文说到的xor-cmp的结构。
②非固定结构的“伪条件跳转”代替“强制跳转”

三、一步一步学构思
[3.1]一次天真的实践——互补条件跳转
    首要,咱们来测验一种用“伪条件跳转”代替“强制跳转”的办法,称作“互补条件跳转法”,即用两个互补的条件跳转指令代替一个强制跳转指令。比方,用jz和jnz跳转到同一地址,和一个jmp是等价的。
举例:
……
  Jz Label
  Jnz Label
  Db thunkcode;废物数据
Label:
  ……
除了jz和jnz,还有许多互补跳转指令,如表1。

称号: clip_image002.gif检查次数: 949文件巨细: 7.6 KB
经过测验,只需一少部分OD插件没能辨认这类花指令,究其原因仍是这种办法形状太过固定,一旦形状特征广为人知,检测就适当简单。
[3.2]上面办法的改进版——用随机值获得断定性标志位
    上面的方面选用两个互补的条件跳转仍是显着,连一般程序都不会运用。所以,咱们应该企图只用一个条件跳转。详细办法是这样的:
经过某些荫蔽的办法,使得某个标志位有断定性的值,然后运用这个断定值,进行断定性条件跳转。比方下面的办法
Xor reg,value1
Cmp reg,value1
Jnz Label
Db thunkcode
Label:
  ……
    该办法的优点是,不管value为何值,经过了xor reg,value1和cmp reg,value这两句指令,,ZF位必定不会置位,所以jnz必定跳转。该办法有适当多的变体,该办法的核心是运用随机值,使得某标志位有断定性值。
    经过测验,OD的大部分插件都不能检测,这类花指令变种较多,插件编写简单遗失或许未预见到某些形状,可是这种办法的形状特征仍是相对固定的,只是某些还未广泛熟知,但随着时间推移,该办法的效能会越来越弱。

[3.3]运用API回来断定值
    大部分API函数的回来值是不断定的,只需有办法使得API回来断定值,那么后边接续的条件跳转,就是等价的。比方说CreateFile回来文件句柄,句柄或许是恣意值且有不断定性,但是咱们能够使得函数CreateFile回来值是断定的。
1)令CreateFile回来过错码,比方故意向CreateFile传入过错参数,还能够运用相似inc esp,使得仓库不4字节对齐,即使传入正确参数,也会回来过错码。
2)因为句柄值实践上是句柄表索引,所以CreatFile回来的正确句柄值都是4的倍数,咱们把句柄值取4的模,得0是必定的。
    相似的办法能够说是数不胜数,所以OD的插件想经过检测固定形状的办法,是无法穷举的。所以实践检测成果我不用说了吧。 



【其三:去除检测


任何技能都有被攻破的一天,没有包打天下的办法。再强的花指令也是有或许被铲除的,这时咱们也要想办法应对。所以咱们常常需求检测花指令是否被铲除,加以应对。
一、花指令被铲除后的痕迹
    咱们来看一下,下面一段简略花指令被铲除后的成果:
代码:
  jmp @F
   byte 08eH
@@:
   ret
铲除后:
称号: 4.JPG检查次数: 931文件巨细: 14.0 KB
   
二、检测    从上文咱们能够看到,花指令被替换指令NOP,这样就不用重构代码,就能够使代码正常运转。明显,咱们只需检测NOP就行了。