逆向课程第四讲逆向中的优化方式,除法原理,以及除法优化上
一丶为什么要熟悉除法的优化,以及除法原理
是这样的,在计算机中,除法运算对应的汇编指令分为 DIV(无符号除法指令) 以及 IDIV(有符号除法指令).
但是,除法指令的执行周期较长效率很低.所以编译器想进办法的用其它指令去代替除法指令.
比如:
DIV 指令是100个周期
计算 2 / 2
那么可能在汇编中的表现形式是这样的
CDQ 符号扩展
DIV EDX,2
好,现在100个周期没有了
减法和加法指令,指令周期是4个那么上面的公式可以演化为
mov eax,2
sub eax,2
就算mov 指令是10个指令,那么总共计算起来才14个指令,而正好完成了一个除法
如果我们把指令周期看做时间的话,那么100个指令周期是100秒,14个指令周期是14秒
那么是不是时间变快了,那么相应的软件运行速度以及启动速度也变快了.
二丶丶熟悉数学证明
在讲解除法之前,我们要熟悉一下数学公式,以及数学证明,因为在除法的优化中,和这些数学公式息息相关.
当然你不看证明也可以,但是公式一定要明白
这里我讲解的是 <<C++反汇编与逆向分析技术揭秘>> 作者: 钱林松 赵海旭
伟大的钱老师的著作. 第47页
首先我们要明白计算机中的除法
1.有符号树和无符号数混除,那么结果是无符号的
2.两个无符号整数相除,结果还是无符号的.
3.计算机中面临如何处理小数,比如 9 / 4 = 2.25
理解数学中的向下取整,以及向上取整
向下取整:
讲道理: 比如对x向下取整, x>=0 那么就是 取得不大于x的最大整数, 相反也就是说, 小于x的遇到的第一个整数
比如 x = 5
那么向下取整则是4
不大于5,那么就是小于5, 然后遇到的最大整数,也就是4
向上取整:
同理,向上取整则是 不小于x的最大整数.
除法的扩展知识:
在整数的处罚中,只有能整除和不能整除的两种情况(废话)不能整除,则会产生余数.
设 a = 被除数 b = 除数 c = 商 r = 余数
那么可以得到下面的公式:
除法原型:
a / b = c .... r
6 / 4 = 1 ...2
1. |r| < |b| : 余数的绝对值,绝对会小于除数的. 比如 6 / 4 = 1 .... 2 那么 余数2 不关是正数还是父数,绝对都是绝对会小于除数的,也就是4
2. a = c * b + r : 求被除数,被除数是商*除数+余数
3.b = (a - r)/c : 求除数,除数等于 被除数-余数 / 商
4.c = (a - r)/b : 求商: 被除数 - 余数 / 除数
5. r = a - (c * b) : 求余数 被除数 - (商 * 除数)
3.计算机中的除法
1.当除数为变量,的时候
计算机中.的汇编指令为 DIV 或者 IDIV,因为除数是不确定的
比如:
int n ;
7 / n ===> 汇编指令就用DIV 或者IDIV
没有优化的余地,看汇编代码.
除数为有符号相除
除数为无符号
当除数为变量,且分为有符号和无符号相除
有符号相除: 那么使用的汇编指令是IDIV
无符号相除: 那么使用的汇编指令是DIV
2.当除数为2的幂的时候被除数分为有符号和无符号位的时候
比如代码为:
被除数无符号的情况下,除数是2的幂次方: (也就是n是无符号)
n / 8 那么8是2^3次方
那么直接优化为 shr
左移三位
被除数有符号的情况下且大于0,除数是2的幂次方
看到汇编代码懵逼,那么上公式,证明,然后则明白
首先公式等于
当B (除数)大于0则使用上面的公式,当b < 0则使用下面的公式
比如计算机中,被除数为正数的时候,可以使用第一个公式的第一个,也可以使用第二个,不过计算机默认向0取整
比如我们计算 17 / 8
正常计算 17 / 8 = 2 .xxxx
有小数
不过计算机计算出来的结果则是2,省略小数了,那么计算机使用的则是第一个公式.
a / b 向下取整, 然后也可以 a - b + 1 / b 向上取整
我们实验一下,
代入得到
17 - 8 + 1 / 8 =
10 / 8 = 1.25 转化为后面的公式,向上取整则是2了.
那么上面的汇编代码应该能看明白了.
首先 Cdq 是符号扩展的意思,也就是EDX和EAX一起使用,变成了一个64位寄存器.
然后利用and和edx比较7, 这个7怎么的出来了,这个7就是上面我们用第一个公式计算出来的
也就是 a - b + 1 这个, 这个7则是b + 1的值.
然后 add eax,edx 被除数 + 上 and过后的值.
最后右边移动三位.
这里编译器巧妙的利用 cdq符号扩展,然后利用了公式,进行了无分支判断.
如果我们的被除数是正数,那么 符号扩展之后,edx的值则全部是0,然后and过后,结果还是0
那么我们的被除数 + 0 右移3位 然后向下取整.
比如我们计算的 n / 8
n取值为17
那么计算的出 b + 1 的值为 8 + 1
那么是正数,则edx为0,and 9之后还是0
那么下面直接 add eax,edx
eax = 原来的被除数 也就是17
edx 结果and后为0
那么结果还是17
最后 17 右移动三位则是 2.xxx 向下取整就是2了.
如果是负数,那么b+1的值还是9
那么此时 add eax,edx = -17 + b - 1 = -10
而后 -10 右移动3位 (-10 / 8) = 1.25 此时向上取整,结果还是-2
公式的话,主要看计算机,一般计算机整数相除,选择向下取整
负数相除,选择向上取整.
3.无符号是被除数的情况下, 除数为非2的幂的时候
比如高级语言
unsigned int a;
a / 3 那么汇编指令有不一样了
我们看下最后两个, /3 的,还有/ 0x87654321的
优化成了这样,还是没有看到除法
a /c C为常量的时候 a(被除数)
那么可以得出公式 am >> n位 (具体的推导公式就不写了,反正都是记公式)
其中m = 2n / c (n的取值范围看系统,如果是16位,那么n的起步就是16 ,32位则是32位起步)
那么现在
mov eax ,xxxxx xxxx是m
mul reg32
shr edx,1fh 1fh是n
那么根据上面的公式 am >> n
现在已经知道n和m了
而 m = 2n / c
那么现在可以求C了
按照最后一个求得出 n = 1f ,也就是2^1f + 2^32
为什么要加上2^32,因为 EDX和eax现在是一个64位寄存器,(看作是)符号扩展了,EDX移动一位,那么相当于eax 移动33位.
m = 0f2044d73
现在求C的值
反推即可
C = 2^n / m
转为十进制计算
9223372036854775808 / 4060368243 = 2271560480.4455111112443010011986
结果向上取整得出2271560481
转为16进制得出
顺利还原代码.
转载于:
作者:IBinary
出处:http://www.cnblogs.com/iBinary/
转载于:https://www.cnblogs.com/gd-luojialin/p/11219746.html
逆向课程第四讲逆向中的优化方式,除法原理,以及除法优化上相关推荐
- Javascript基础与面向对象基础~第四讲 Javascript中的类对象
今天来说JS中如何实现类(class),事实上本应该昨天晚上写的,可我失言了,在些说一声"抱歉"!JS中的类是JS面向对象的基础,也是我最拿手的东西,你写的代码能否提高一个层次,一 ...
- 开发人员应该对IIS理论层的知识了解的多一些~第四讲 HttpModule中的几大事件
本文主要介绍HttpModule,它在一个网页请求过程中是一个怎样的过程是我们要知道的,在网页加载过程中HttpModule在何时被执行也是我们要知道的,以及,HttpModule在网页请求过程中,所 ...
- java中过滤流_第十四讲 Java中的字节流和过滤流
第十四讲Java中的字节流和过滤流 主要内容 InputStream和FileInputStream OutputStream和FileOutputStream 文件字节IO流应用举例 过滤流类和常用 ...
- 计算机视觉课程第四讲-OpenCV4钢管检测项目下集:霍夫圆检测理论与实践
计算机视觉课程第四讲-OpenCV4钢管检测项目下集:霍夫圆检测理论与实践 本专栏将会带大家学习 <计算机视觉与图形学> 相关知识,从传统图像处理方法到最新的神经网络方法!!! 下载上面安 ...
- 【夯实Spring Cloud】Spring Cloud中使用Hystrix实现断路器原理详解(上)
本文属于[夯实Spring Cloud]系列文章,该系列旨在用通俗易懂的语言,带大家了解和学习Spring Cloud技术,希望能给读者带来一些干货.系列目录如下: [夯实Spring Cloud]D ...
- 深蓝视觉SLAM课程第四讲--相机模型,非线性优化(G2O)
课程Github地址:https://github.com/wrk666/VSLAM-Course/tree/master 0. 内容 对应于十四讲中的第5讲和第6讲 回顾十四讲P24-26 1. 针 ...
- 微信逆向分析(四)——逆向分析的工具
前言 老话,工欲善其事,必先利其器.这篇聊聊逆向分析用到的工具.不聊工具细节,自行百度学习.重要的是理清:使用工具,是为了解决什么问题. 工具 1.CE 找偏移的方法中聊到,最直接就是在内存里面搜索. ...
- 第四讲 Python3中的int型和浮点型
(1)前面我们知道,类似3,4,5这种数字,在使用的时候不需要引号,他们是一种int类型 python3的整型支持各种整形值,不管是小的整数值,还是大的整数值,Python都能轻松处理 就算 a = ...
- [SLAM]高博视觉SLAM十四讲ch4中useSophus报错
问题描述 在正常安装了Sophus库后,运行高博的代码,发现如下错误 #### #### Running command: "make -j16 -l16" in "/h ...
最新文章
- 皮一皮:女友在意的点....是包子!
- autosar can协议栈 源码解读_我用一晚上时间给女朋友讲懂CAN总线的AUTOSAR网络管理...
- 编程语言的排名取决于应用场景和主要公司的需求
- 前端页面速度统计方法
- MySQL创建和操纵数据库和表(DDL)最全总结(小白都能能懂哦)
- python中os.system.获取输出信息_python中os.system()的返回值
- 第三次学JAVA再学不好就吃翔(part79)--并发修改异常产生的原因及解决方案
- www.sirim-global.com
- 品质LOGO模板素材|想知道平面设计师如何设计徽标的秘密吗?
- 每天一道剑指offer-包含min函数的栈
- 陈纪修老师《数学分析》 第01章:集合与映射 笔记
- 使用PyTorch搭建ResNet101、ResNet152网络
- OpenG数组讲解之Filter 1D Array。
- 易烊千玺代言雀巢咖啡;美国食品科技公司获3.5亿美元C轮融资;都乐“菠萝废物”开发皮革替代品...
- android logo颜色渐变,华为悄然更新品牌Logo:无渐变色,更加扁平化
- 《人月神话(The Mythical Man-Month)》看清问题的本质:如果我们想解决问题,就必须试图先去理解它...
- php加减法计算器程序,用php简单实现加减乘除计算器
- 【Axure10基础教程】第七章 设置文本
- 【强化学习】GAIL
- 30岁运营设备10w+的工程师思考设备运营还能做什么?