这个集会的意义何在
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
我正在逆向一些恶意软件,我在反汇编中遇到了这个:
│ 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