prefix repne: 这条指令是怎么用的呢?想了半天也想不出来.详情进来看看:

我在反编译一个程序时,见到以下代码了,里面有花指令,但F2 prefix repne:和F3 prefix repne:指令有什么用呢?哪位能指点一下!
004B2012   /EB 0F              jmp short hbdzsc.004B2023 004B2014   |B9 EB0FB8EB        mov ecx,EBB80FEB 004B2019   |07                 pop es 004B201A   |B9 EB0F90EB        mov ecx,EB900FEB 004B201F   |08FD               or ch,bh 004B2021   |EB 0B              jmp short hbdzsc.004B202E 004B2023   \F2:                prefix repne: 004B2024  ^ EB F5              jmp short hbdzsc.004B201B 004B2026  ^ EB F6              jmp short hbdzsc.004B201E 004B2028    F2:                prefix repne: 004B2029    EB 08              jmp short hbdzsc.004B2033 004B202B    FD                 std 004B202C  ^ EB E9              jmp short hbdzsc.004B2017 004B202E    F3:                prefix rep: 004B202F  ^ EB E4              jmp short hbdzsc.004B2015 004B2031    FC                 cld 004B2032  - E9 9D0FC98B        jmp 8C142FD4 004B2037    CA F7D1            retf 0D1F7

prefix repne这个F2前缀就是说当ZF=0或比较结果不相等,且CX/ECX<>0时重复,加上下面的jmp ***相当于jnz ***(不考虑ecx的情况),同理,prefix rep后面加上jmp ***相当于jz ****(同样不考虑ecx的情况),其实这就是壳或者病毒里面常用的指令变形

prefix repne 也有花指令的情况,如下:

004B5186    2BF9            sub     edi, ecx 004B5188    F2:             prefix repne: 004B5189    EB 01           jmp     short 004B518C 004B518B    F0:8D7C1F EE    lock lea edi, dword ptr [edi+ebx-12]     ; 不允许锁定前缀 004B5190    2BFB            sub     edi, ebx 004B5192    E9 3C080000     jmp     004B59D3 004B5197    B8 3A954600     mov     eax, 0046953A  
这里跳到004B518C 这个地址在004B518B  地址的指令中  跟进发现

004B518C    8D7C1F EE       lea     edi, dword ptr [edi+ebx-12] 004B5190    2BFB            sub     edi, ebx 004B5192    E9 3C080000     jmp     004B59D3 004B5197    B8 3A954600     mov     eax, 0046953A  
所以在prefix repne地址上004B5188  填充4个NOP 这个填充的个数和EB后边的数目相关 这里属于 花指令 情况 填充后如下

004B5186    2BF9            sub     edi, ecx 004B5188    90              nop 004B5189    90              nop 004B518A    90              nop 004B518B    90              nop 004B518C    8D7C1F EE       lea     edi, dword ptr [edi+ebx-12] 004B5190    2BFB            sub     edi, ebx 004B5192    E9 3C080000     jmp     004B59D3 004B5197    B8 3A954600     mov     eax, 0046953A  


EB类型的花指令

004B51EA    BE 9AF14400                  mov     esi, 0044F19A 004B51EF    3E:EB 02                     jmp     short 004B51F4 004B51F2    CD20 551BF55E                vxdcall 5EF51B55 004B51F8    C1CE CB                      ror     esi, 0CB 004B51FB    46                           inc     esi  
这个EB 就是JMP到一个地址指令里边 跟进去发现

004B51F4    55                           push    ebp 004B51F5    1BF5                         sbb     esi, ebp 004B51F7    5E                           pop     esi 004B51F8    C1CE CB                      ror     esi, 0CB 004B51FB    46                           inc     esi  
这里在004B51EF    填充5个NOP 修复完成

004B51EA    BE 9AF14400                  mov     esi, 0044F19A 004B51EF    90                           nop 004B51F0    90                           nop 004B51F1    90                           nop 004B51F2    90                           nop 004B51F3    90                           nop 004B51F4    55                           push    ebp 004B51F5    1BF5                         sbb     esi, ebp 004B51F7    5E                           pop     esi 004B51F8    C1CE CB                      ror     esi, 0CB 004B51FB    46                           inc     esi  
这里需要注意的是 EB有 带参数和不带参数两种 方法都是一样 以上是带参数的 不带参数的如下

004B52FD   /2E:EB 01                     jmp     short 004B5301 004B5300   |F0:8D740D D3                 lock lea esi, dword ptr [ebp+ecx-2D]     ; 不允许锁定前缀 004B5305    2BF1                         sub     esi, ecx  
4个NOP以后如下

004B52FD    90                           nop 004B52FE    90                           nop 004B52FF    90                           nop 004B5300    90                           nop 004B5301    8D740D D3                    lea     esi, dword ptr [ebp+ecx-2D] 004B5305    2BF1                         sub     esi, ecx