您的位置:首页 > 其它

逆向工程之表达式优化识别(4)-除法(下)

2016-07-05 11:02 260 查看

除法优化

继续说除法,之前说了除数为正数的除法,现在再来说除数为负的除法,其实基本思路都已经差不多了,区别在于关于取整时候的定理。



这里在理解的时候其实和之前类似,讨论a的大小即可,我这里只列出了向上取整的转换,因为默认是向下取整的,我们不需要向下取整的转换。向上取整也只需要讨论a<0的情况,因为只有这样才需要转换,所以只需要举例做简单思考,基本上和上一节除法的思考过程一样。

1 除数为负2的幂

说明:和除数为正2的幂情况一样,区别在于需要加一个符号而已。

示例:

mov eax, VAL
cdq
and edx, 7
add eax, edx
sar eax, 3
neg eax


neg之前的代码和前一节除数为正2的幂的时候一样,最后取负即可,比较简单。

2 除数为负的非2的幂

说明:



在有了这样的前提下,其余过程基本类似,主要是注意区分识别,因为这里的n也会相应较大,区分和除数大于0时候的n较大情况。

示例:

mov ecx, VAL
mov eax, 99999999h
imul ecx
sar edx, 1
mov eax, edx
shr eax, 1Fh
add edx, eax


这里是x/(-5)的代码,在识别了负数调整之后,剩下的代码也就只有前4句,将前四句对应表达式写下来并化简,可得到edx = (ecx * m)/2^33。再由理论得到的公式,即可算出来y约等于5。(主要是区分取n大于32时的除数为正数的除法,区别在于imul之后没有add语句,相当于虽然n大于32,但是这里的形式同上一届示例1,n大于32说明了是负数)

示例2:

mov ecx, VAL
mov eax, 6DB6DB6Dh
imul ecx
sub edx, ecx
sar edx, 2
mov eax, edx
shr eax, 1Fh
add edx, eax


这里是x/(-7)的代码,基本上也和上一节的n大于32情况处理是一样的,对称思考,这里的n是小于32的,对应上一节n大于32,其实也就是一个对整体取符号的过程。最后推导也是一样的,写出表达式,可得到

x/y = ecx * (ecx - 2^32)/2^34



这样就和我们得到的表达式形式一致了,将新的magic number代入即可得到除法原型了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数学 优化