为了能到远方,脚下的每一步都不能少.|

园龄:粉丝:关注:

2021-12-29 00:54阅读: 157评论: 0推荐: 0

除法优化识别以及还原方法

除数为无符号2的幂

快速识别

​ x >> n(无符号右移)

快速还原

x2n由于n=4,所以例子中的除法是x16

除数为无符号非2的幂

快速识别

xc=xM>>n,且使用无符号乘法时

快速还原

c=2nM

本例中n=33,M=0xAAAAAAAB

c=2330xAAAAAAAB=2.9999999996507540345598531381041

向上取整为3,所以这里的除法是x3

通用还原

由于xc=x2nc12n所以2nc=M

c=2nM=2330xAAAAAAAB=2.9999999996507540345598531381041

向上取整为3,所以这里的除法是x3

除数为无符号非2的幂第二种

快速识别

xc={[x(xM>>32)>>n1]+xM>>32}>>n2,且使用无符号乘法时

快速还原

M=2nc232,n=n1+n2+32

c=2nM+232

在本例中n=n1+n2+32=1+2+32=35,M=0x24924925

c=2nM+232=2350x24924925+232=6.9999999993888195604619552997935

向上取整为7,所以这里的除法是x7

通用还原

上面的代码所为用下面的数学公式表达

xxM2322+xM23222=x232+M235

由于xc=x2nc12n所以2nc=232+M

c=2nM+232=2350x24924925+232=6.9999999993888195604619552997935

向上取整为7,所以这里的除法是x7

除数为有符号2的幂

快速识别

如果x0,x2n=x>>n,如果x<0,x2n=[x+(2n1)]>>n

快速还原

c=2n=23=8,所以这里的除法是x8

通用还原

由于sar是向下取整,而xc为负数需要向上取整,所以需要加上2n1,为什么是加上2n1呢,因为 2n=c,而xc余数的最小值为c1c,所以加上c1就能起到加1的效果,加一后取下整,等于原来的值取上整。

除数为有符号非2的幂第一种

快速识别

如果x0,xc=xM>>n,x<0,xc=[xM>>n]+1

快速还原

c=2nM=23338E38E39=8.9999999989522621036795594143123

向上取整为9,所以这里的除法是x9

通用还原

由于xc=x2nc12n2nc=M

c=2nM=23338E38E39=8.9999999989522621036795594143123

向上取整为9,所以这里的除法是x3

除数为有符号非2的幂第二种

快速识别

如果x0,xc=[xM+x232]>>n,x<0,xc={[xM+x232]>>n}+1

快速还原

c=2nM=2350x88888889=14.999999996944097802665530336711

向上取整为9,所以这里的除法是x15

通用还原

上面的代码所为用下面的数学公式表达

xM+x232235=x(M+232)1235

由于xc=x2nc12n所以2nc=232+M

c=2nM+232=23588888889+232=2350x88888889=14.999999996944097802665530336711

注:上面的88888889是有符号数

向上取整为9,所以这里的除法是x15

除数为有符号负2幂

快速识别

如果x0,xc=(x>>n),x<0,x2n={[x+(2n1)]>>n}

快速还原

c=2n=22=4

通用还原

仔细观察,这里无非就是将除数为2的幂取负而已,只要把除数为2的幂的除数求出来,再取负就行

除数为有符号非负2的幂的第一种

快速识别

如果x0,xc=xM>>n,x<0,xc=[xM>>n]+1,但此时注意 这里的M是个负数,这一点是用来区分除数为有符号非2的幂的第一种的优化的

快速还原

c=2nM=23399999999=23366666667=4.9999999982537701732058415050132=5

所以这里的除法是x5

通用还原

由于xc=x2nc12n2nc=M

c=2nM=23399999999=23366666667=4.9999999982537701732058415050132=5

所以这里的除法是x5

除数为有符号非负2的幂的第一种Gcc版

快速识别

如果x0,xc=xM>>n,x<0,xc=[xM>>n+1]

快速还原

c=2nM=23366666667=4.9999999982537701732058415050132=5

c=5x5

通用还原

上面的代码所为用下面的数学公式表达

xM2n=xM12n

由于xc=x2nc12n2nc=M

c=2nM=23399999999=23366666667=4.9999999982537701732058415050132=5

所以这里的除法是x5

除数为有符号非负2的幂的第二种

快速识别

如果x0,xc=(xMX232)>>n,x<0,xc=[(xMX232)>>n]+1

快速还原

c=2nM232=2346DB6DB6D232=234FFFFFFFF6DB6DB6D=23492492493=6.9999999979627318686215638099758=7

$c = -7 \frac{x}{-7}$

通用还原

上面的代码所为用下面的数学公式表达

xMx2322n=x(M232)12n

由于xc=x2nc12n2nc=M232

c=2nM232=2346DB6DB6D232=234FFFFFFFF6DB6DB6D=23492492493=6.9999999979627318686215638099758=7

所以这里的除法是x7

除数为有符号非负2的幂的第二种Gcc版

快速识别

如果x0,xc=[(xM+x232)>>n],x<0,xc={[(xM+x232)>>n]+1}

快速还原

c=2nM+232=23492492493+232=2340x92492493=6.9999999979627318686215638099758=7

c=7x7

通用还原

上面的代码所为用下面的数学公式表达

xM+x2322n=x(M232)12n

由于xc=x2nc12n2nc=M232

c=2nM232=2346DB6DB6D232=234FFFFFFFF6DB6DB6D=2340x92492493=6.9999999979627318686215638099758=7

所以这里的除法是x7

至此除法优化完毕,一共有11中优化,除了2的幂(包括无符号)和-2的幂这三种,其他都是xc=x2nc12n的变种优化,通过比对代码和公式,即可还原

参考资料:c++汇编与逆向分析技术解密

本文作者:乘舟凉

本文链接:https://www.cnblogs.com/czlnb/p/15743406.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   乘舟凉  阅读(157)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起