Anti-静态分析

1.死循环语句
类型:对付W32Dasm
平台:Windows9x 、Windows NT
原理:下面是故意在程序中插入的一个死循环,可能会使W32Dasm的某些版本停止响应:

0401000 JMP 00401005
……
00401005 JMP 00401000

对策:W32Dasm进入死循环后,用Bpx hmempcy设断,来到死循环代码处,将其跳出死循环,或用IDA来反汇编。

2.利用花指令

  花指令是对付静态分析的重要手段。以下是一段汇编源程序:

start_:

        xor    eax,1
        add    eax,2
        jmp        label1
label1:    xor    eax,3
        add    eax,4
        xor    eax,5

end start_

  此时把源程序进行编译,然后用W32Dasm进行反汇编,得到的反汇编结果完全正常。接着我们将上述源程序作如下修改:

start_:

        xor    eax,1
        add    eax,2
        jnz        label1 ;注意这里,用两句条件跳转代替了:jmp label1
        jz        label1
        db        0E8h     ;注意这个无用的字节和源程序的区别
label1:    xor    eax,3
        add    eax,4
        xor    eax,5


end start_

  再把源程序进行编译,然后用W32Dasm进行反汇编,来看一下反汇编后的结果:

:00401000 83F001
:00401003 83C002
:00401006 7503
:00401008 7401
:0040100A E883F00383
:0040100F C00483F0
xor eax, 00000001
add eax, 00000002
jne 0040100B
je 0040100B
call 83440092
rol byte ptr [ebx+4*eax], F0

  结果令人很吃惊,会发现W32Dasm反汇编的结果和事先写的汇编指令不一样,从反汇编的结果中已经无法理解程序的"真实"的功能了,W32Dasm给出了一个意想不到的答案。 这是因为上述改动是为了在W32Dasm的反汇编工作中做点手脚,从而使得它犯下错误。那么W32Dasm为什么会因此而犯下这样的错误呢?

  不同的机器指令包含的字节数并不相同,有的是单字节指令,有的是多字节指令。对于多字节指令来说,反汇编软件需要确定指令的第一个字节的起始位置,也就是操作码的位置,这样才能正确地反汇编这条指令,否则它就可能反汇编成另外一条指令了。 如果在程序中加入一些无用的字节来干扰反汇编软件的判断,从而使得它错误地确定指令的起始位置,那么也就达到了干扰W32Dasm反汇编工作的目的。

  通过前面的介绍,知道由于"无用的字节"干扰了W32Dasm对指令起始位置的判断,从而导致反汇编的错误结果,所以如果能让W32Dasm正确地识别出指令起始位置,也就达到了去除花指令的目的了。比如可以把那些无用的字节都替换成单字节指令,最常见的一种替换方法是把无用的字节替换成 NOP 指令,即十六进制数 90。

作者:Ljtt 加解密技术交流站