这次集会的重点是什么?

时间:2017-03-12 03:24:31

标签: assembly x86 reverse-engineering

我正在扭转一些恶意软件,我在反汇编中遇到了这个问题:

│           0x0040f5ec      8bd8           mov ebx, eax
│           0x0040f5ee      85db           test ebx, ebx
│       ┌─< 0x0040f5f0      7507           jne 0x40f5f9
│       │   0x0040f5f2      8bc6           mov eax, esi
│      ┌──< 0x0040f5f4      e9b3000000     jmp 0x40f6ac
│      │└─> 0x0040f5f9      57             push edi

据我了解,测试寄存器本身将始终设置零标志。然后JNE将检查零标志并跳转,如果它没有设置。如果是这种情况,为什么我们在对自己测试寄存器之后就让JNE跳了?在什么情况下会被执行?

我是否误解了TEST或JNE操作,或者我还缺少其他什么?

感谢您的帮助,如果这是一个愚蠢的问题,请抱歉。

2 个答案:

答案 0 :(得分:2)

测试执行和操作。因此,如果ebx包含3,则3为3,这不是零。但是如果ebx包含0,那么0和0都是0。 jne基于零标志,根据受测试指令影响的英特尔文档。

EDIT。

Disassembly of section .text:

0000000000000000 <.text>:
   0:   85 db                   test   %ebx,%ebx
   2:   3b 1c 25 00 00 00 00    cmp    0x0,%ebx

使用test来比较零或不是两个字节的指令。所以这可能就是为什么你会看到测试reg,reg然后是跳跃,如果相等或不相比与零比较。

答案 1 :(得分:0)

一些评论使其更容易:

       0x0040f5ec      8bd8           mov ebx, eax    ;  
       0x0040f5ee      85db           test ebx, ebx   ;  if ( eax == 0 )
   ┌─< 0x0040f5f0      7507           jne 0x40f5f9    ;  {
   │   0x0040f5f2      8bc6           mov eax, esi    ;      eax = esi;
  ┌──< 0x0040f5f4      e9b3000000     jmp 0x40f6ac    ;  } else {
  │└─> 0x0040f5f9      57             push edi        ;      // call some method

https://en.wikipedia.org/wiki/TEST_(x86_instruction)