这个集会的意义何在

What is the point of this assembly

我正在逆向一些恶意软件,我在反汇编中遇到了这个:

│           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 操作,还是我遗漏了什么?

感谢您的帮助,如果这是一个愚蠢的问题,我们深表歉意。

test 执行与运算。所以如果 ebx 包含一个 3,anded 和 3 是 3,它不为零。但是,如果 ebx 包含 0,则 0 与 0 的运算结果为零。 jne 基于零标志,根据受测试指令影响的英特尔文档。

编辑。

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 然后跳转如果等于或不与零比较。

一些评论使它更容易一些:

       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)