我正在分析一种恶意软件,该恶意软件的指令序列带有


repne


0047094C  |.  8B0D 34935E00       |MOV ECX,DWORD PTR DS:[5E9334]
00470952  |.  F2:                 |PREFIX REPNE:
00470953  |.  0F2AC1              |CVTPI2PS XMM0,MM1
00470956  |.  F2:                 |PREFIX REPNE:
00470957  |.  0F100D 88905E00     |MOVUPS XMM1,DQWORD PTR DS:[5E9088]
0047095E  |.  F2:                 |PREFIX REPNE:
0047095F  |.  0F5CC8              |SUBPS XMM1,XMM0
00470962  |.  F2:                 |PREFIX REPNE:
00470963  |.  0F2CD1              |CVTTPS2PI MM2,XMM1
00470966  |.  8915 5C925E00       |MOV DWORD PTR DS:[5E925C],EDX


是什么但是奇怪的是,在Im调试时,跳过了前缀repne之后的指令(单步执行时)。我的直觉告诉我这只是垃圾代码,但我想确保没有其他事情发生,因为我必须重写此特定函数(使用了更多的sse指令)

如果有人可以说明一点,我将不胜感激。谢谢

评论

repne是“不相等时重复”的助记符-因此,如果在执行到达该地址时将零标志设置为0,则该指令将不会执行。如果清除零标志,则最多可以执行n次,其中n为ecx的值;如果指令可以更改零标志,则重复次数可能更少。因此,如果可以确定在执行指令之前已设置ZF,则这是垃圾代码,但是指令未在单个调试器跟踪中得到执行并不意味着总是这样。

#1 楼

前缀不是垃圾-它们是原始指令的替代,以产生新指令。您的反汇编程序显然不了解SSE2指令,而是将它们分开。拆卸应如下所示:
0047094C |. 8B0D 34935E00 |MOV ECX,DWORD PTR DS:[5E9334] 00470952 |. F20F2AC1 |CVTSI2SD XMM0,ECX 00470956 |. F20F100D 88905E00 |MOVSD XMM1,DQWORD PTR DS:[5E9088] 0047095E |. F20F5CC8 |SUBSD XMM1,XMM0 00470962 |. F20F2CD1 |CVTTSD2SI EDX,XMM1 00470966 |. 8915 5C925E00 |MOV DWORD PTR DS:[5E925C],EDX

评论


你是绝对正确的!我一直忙于深入查看,以至于我什至没有注意到IDA Pro正确地分解了说明。 Olly和其他调试器似乎属于不支持SSE2并分离前缀的反汇编程序。谢谢!

– Gandolf
15年7月29日在16:35

fwiw odbg201和windbg都可以正确分解流

– blabb
15年7月29日在20:19