一段汇编代码的分析

来源:互联网 发布:查看linux cpu核数 编辑:程序博客网 时间:2024/05/17 03:07

今天在逆向的时候碰到了如下一段汇编代码,对里面的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++反汇编与逆向分析技术揭秘》 钱林松 赵海旭 著

 

原创粉丝点击