Assembly 这次集会的目的是什么
我正在逆转一些恶意软件,我在反汇编过程中遇到了以下问题:Assembly 这次集会的目的是什么,assembly,x86,reverse-engineering,Assembly,X86,Reverse Engineering,我正在逆转一些恶意软件,我在反汇编过程中遇到了以下问题: │ 0x0040f5ec 8bd8 mov ebx, eax │ 0x0040f5ee 85db test ebx, ebx │ ┌─< 0x0040f5f0 7507 jne 0x40f5f9 │ │ 0x0040f5f2 8bc6 mov ea
│ 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
│ 0x0040f5ec 8bd8 mov ebx,eax
│ 0x0040f5ee 85db测试ebx,ebx
│ ┌─< 0x0040f5f0 7507 jne 0x40f5f9
│ │ 0x0040f5f2 8bc6 mov eax,esi
│ ┌──< 0x0040f5f4 e9b3000000 jmp 0x40f6ac
│ │└─> 0x0040f5f9 57推式edi
据我所知,用寄存器本身测试寄存器将始终设置零标志。然后JNE将检查零标志,如果未设置,则跳转。如果是这样的话,为什么我们在针对寄存器本身测试之后就有JNE跳转呢?在什么情况下执行
我是否误解了测试或JNE操作,或者我还遗漏了什么
感谢您的帮助,如果这是一个愚蠢的问题,请道歉。测试执行and操作。所以,如果ebx包含一个3,与3的AND是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
节的反汇编。文本:
0000000000000000 :
0:85 db测试%ebx,%ebx
2:3b 1c 25 00 00 cmp 0x0,%ebx
它是两个字节的指令,用于使用test来比较是否为零。因此,这可能就是为什么您会看到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测试ebx,ebx;如果(eax==0)
┌─< 0x0040f5f0 7507 jne 0x40f5f9;{
│ 0x0040f5f2 8bc6 mov eax,esi;eax=esi;
┌──< 0x0040f5f4 e9b3000000 jmp 0x40f6ac;}其他{
│└─> 0x0040f5f9 57推式edi;//调用某个方法
好的,这是表示
if(!ebx)的最佳方式jmp…
?一点也不傻!虽然之前可能在stackoverflow上问过,但这对每个人来说都不明显,然后即使理解了ANDIN,人们也想知道为什么使用测试而不是与零进行比较。xor ebx,ebx vs mov ebx,0也属于这一类。可能重复的可能重复