今天在分析一个样本的时候,发现一段代码。
1 // .text:100012DF sub esi, 0B7h // 183 2 // .text:100012E5 neg esi 3 // .text:100012E7 sbb esi, esi 4 // .text:100012EA inc esi
如果源操作数是 0,则 CF 标志清除为 0;否则设置为 1。OF、SF、ZF、AF 及 CF 标志根据结果设置。
neg求补指令:相当于按各位取反加1
现在代入三种值来进行验证:
1、esi 等于 183。则有:
sub esi, 0b7h; esi == 0; cf == 0;
neg esi; esi == 0; cf == 0;
sbb esi, esi; esi == 0; cf == 0;
inc esi; esi == 1;
最终结果为:1
2、esi 小于 183。则有:
sub esi, 0b7h; esi == 负数; cf == 1;
neg esi; esi == 正数; cf == 1;
sbb esi, esi; esi == -1; cf == 1; sbb指令带cf(进位、借位)减法.多减去一个1.则为-1
inc esi; esi == 0; cf == 1;
最终结果为:0
3、esi 大于 183。则有:
sub esi, 0b7h; esi == 正数; cf == 0;
neg esi; esi == 负数; cf == 1;
sbb esi, esi; esi == -1; cf == 1; sbb指令带cf(进位、借位)减法.多减去一个1.则为-1
inc esi; esi == 0; cf == 1;
最终结果为:0
那么遇到以上代码。则为vc编译器在02中,对逻辑跳转进行的优化。
直接还原为:
if (esi == 183)
{
return true;
}
return false;
百度到一篇文章。作者也和我遇到同样的问题。非常感谢原作者分享经验。