180302 逆向-抵御静态分析(1)

1625-5 王子昂 总结《2018年3月2日》 【连续第517天总结】
A. 抵御静态分析(1)
B.
静态分析是逆向工程中常用的手段。
因此抵御静态分析也是一个很值得深入的话题。

花指令

在反汇编的过程中,存在着几个关键的问题。
其中之一就是数据与代码的区分问题。
汇编指令长度、多种多样的间接跳转实现形式,反汇编算法必须对这些情况作出恰当的处理,保证反汇编结果的正确性。

目前主要的两类反汇编算法是线性扫描算法(Linear Sweep)和递归行进算法(Recursive traversal),它们都有着广泛的应用。

线性扫描算法

相对而言技术含量并不高,反汇编器依次逐个将整个模块中的每一个指令都反汇编成汇编指令。
没有对所反汇编的内容进行任何判断,而是将遇到的机器码都作为代码(指令)来处理。
因此无法正确地将代码和数据区分开,数据也将被作为代码来进行解码,从而导致反汇编出现错误。
而这种错误将影响下一条指令正确识别,会使得整个反汇编都错误。

递归行进算法

按照代码可能的执行顺序来反汇编程序,对每条可能的路径都进行扫描。
当解码出分支指令后,反汇编器就将把这个地址记录下来,并分别反汇编各个分支中的指令。
采用这种算法可以一定程度上避免将代码中的数据作为指令来解码,比较灵活。但是对于刻意插入的花指令则无能为力。

巧妙地在代码之间插入数据,就可以使得反汇编器误将数据当成代码,进而毁掉整个程序的分析。
这些用来干扰反汇编软件判断的无用数据就被称为“花指令”

针对线性扫描算法的花指令很简单,只需要在正确指令之前加入一个其他多字节指令的起始字节即可。
在花指令之前通过jmp之类的指令跳过它,使得花指令不影响程序的正常运行。
使用线性扫描的反汇编器遇到花指令时会将其作为正常指令分析,破坏掉后面指令的顺序。

递归行进算法由于会估计代码可能的执行顺序,因此在花指令之前存在jmp时,反汇编器就会将花指令置之不理。
针对递归行进算法也很简单,通过一些永不会执行的跳转即可将“单纯”的反汇编器引到错误的花指令上。
例如jmp后放置的jmp,if(False)式的永假判断等等

应对方法

由于花指令只是针对静态分析的,因此这些垃圾数据不能干扰到程序流的正常执行。因此通过调试器来记录执行顺序即可发现花指令的存在,如果有特征的话,通过脚本将它们处理为NOP(0x90)即可使反汇编器正常工作。
如果没有特征的话,大概只能通过调试器的脚本来记录路径了吧╮(╯_╰)╭目前还没有见过这种花指令,猜想标记执行过的地址也许是条可行的方法。

C. 明日计划
抵御静态分析(2)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值