在学习 andorid 逆向的过程中,发现无论是哪种编译器,生成哪个平台的代码,其优化思路在本质上如出一辙,在 windwos 平台所使用的技巧,在安卓平台仍然适用,不外乎乘法除法计算的优化,swtich 判定树的优化,对 if 条件句的优化,while 循环的优化等等,编写本文的目的也就是为了对已学的知识进行总结。
这里强烈推荐老钱和老张写的《c++反汇编与逆向分析技术揭秘》,本文大部分知识点都将以此书作为参考,我个人是不太喜欢看直播和视屏教程的,因为有些关键知识点可能老师一句话就带过去了,要想回来看还得来回拉进度条,但是书不一样,遇到读不懂的地方可以停下来仔细思考,想回头看也就是翻几页的事情,遇到那种写的特别细的作者,那读起来更是一种享受。
本文列举的代码和汇编只是为了更好的说明思路,并不代表实际代码,好了话不多说,进入正题。
优化方向编译速度优化执行速度优化程序体积优化对于 debug 版程序,编译器为了满足单步调试需求,不会对无意义的代码进行优化。无意义的意思是没有发生传递,没有赋值到内存空间。
一
常见的优化类型
常量折叠更像是预处理,编译器会将所有可预见的值直接写成立即数。
int n = 2 + 3 * 6;// 编译器在处理这段代码时会直接将变量赋予立即数+// mov n, 20常量传播是常量折叠的“进阶版”,编译器会扫描整个代码段,对所有非变量运算直接计算出结果。
int n = 2 + 3 * 6;int m = n * 10;// mov m, 200减少变量未使用即是无意义,无意义的代码都会被优化,上述的两个示例,在实际编译中是会直接被优化掉的,因为并未被用于函数传参和其他操作。
编译虽然能通过,但不会产生任何代码,因为没有传递结果,对后续的代码执行不会造成任何影响。
int funtion1() { int n = 2 + 3 * 6; int m = n * 10; return 0;}// 无意义的变量,这个函数被编译为汇编也将只有一句代码// mov eax, 0int funtion2() { int n = 2 + 3 * 6; int m = n * 10; return m;}// 有意义的变量,但因为常量传播,也只有一句代码// mov eax, 200## 分支优化对于所有不可达的分支也会直接被裁剪。
if(false) { printf(you can't find me);}在书中还有更多优化示例,这里不做过多列举,其根本就是以上几种优化方式,无意义的代码将被删除,冗余的代码将会被精简,照着这种思路想就对了。得益于编译器的强大,使得再烂的代码也能保持高效。
二
数学计算上对算法的优化我将会穿插使用 x86 和 arm 汇编,主要指令都大差不差,理解意义即可。
加法加法没有任何优化空间,一个 add 指令所需的 cpu 周期本就很短,除了上述的常量折叠外,一般不会对其进行改动。
减法理论上加法和减法的指令周期是一致的,也不排除有些编译器会将减数转成补码进行相加,遇到补码也能一眼看出来,直接就可以认定这条指令为减法。
乘法
深圳比克电池有限公司简介
汽车前照灯智能化控制的研究
OPPO R9的5个隐藏功能, 你用过吗?
海信空调舒适到家 全方位打造好空气
OPPO智能电视S1成为大众焦点
编译器如何对代码进行优化(上)
安防领域“新秀“”维安达斯对射式微波雷达探测器
Google Photos Android应用程序的最新更新带来了一项新功能
Vishay推出新系列卡扣式功率铝电容器
黑芝麻智能亮相2023慕尼黑国际车展
金其利国产工控机,赋能“新基建”千行百业
物联网的基本特征以及发展中的关键要素是什么
用好FMEA工具,企业风险管理事半功倍
三星以创新理念引领CES 2022发展新势,携手共创未来
锤子T3最新消息:锤子手机T3确定8月发布,也是骁龙835,售价3000起
青铜剑第三代半导体产业基地奠基仪式在深圳坪山举行
海尔冰箱从降低能耗方面来升级消费者品质生活 省出30万家庭年用电量
Qualcomm将802.11ad Wi-Fi优势展至企业和室外环境
ROG Z590I主板曝光,支持英特尔即将发布的11代酷睿处理器
日益更新的大安防市场 不确定性成共同挑战