今天在逆向的时候碰到了如下一段汇编代码,对里面的magicnumber有点好奇,研究了一下:
.text:6E06EB40 000 push ebp
.text:6E06EB41 004 mov ebp, esp
.text:6E06EB43 004 push ebx
.text:6E06EB44 008 mov ebx, ecx
.text:6E06EB46 008 mov ecx, [ebp+size]
.text:6E06EB49 008 push esi
.text:6E06EB4A 00C push edi
.text:6E06EB4B 010 mov edi, edx
.text:6E06EB4D 010 lea esi, [ecx+2]
.text:6E06EB50 010 mov eax, 0AAAAAAABh
.text:6E06EB55 010 mul esi
.text:6E06EB57 010 shr edx, 1 ;高32位逻辑右移1位
.text:6E06EB59 010 shl edx, 2 ;高32位逻辑左移2位
.text:6E06EB5C 010 cmp edi, edx
.text:6E06EB5E 010 jnb short loc_6E
其实是计算:
(ECX + 2)*(AAAAAAAB/2^32/2)*4
所以上面的汇编代码就是在计算ECX的值加上2再除以3然后再乘以4.
总结:
Mov eax, MagicNumber
mul ...
Shr edx,...
Mov reg, edx
;此后直接使用EDX的值,EAX弃而不用
当遇到以上指令序列式,基本可判定是除法优化后的代码。Mul表明是无符号计算。
参考:《c++反汇编与逆向分析技术揭秘》 钱林松 赵海旭 著