我正在扭转一些恶意软件,我在反汇编中遇到了这个问题:
│ 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操作,或者我还缺少其他什么?
感谢您的帮助,如果这是一个愚蠢的问题,请抱歉。
答案 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