在逆向开发中,非常重要的一个环节就是静态分析,众所周知,手机上安装App其本质是一个二进制文件,而静态分析是建立在分析二进制上面的。所以在学习逆向之前,需要提前了解相关的汇编知识
汇编语言的发展
机器语言
是由0和1
组成的机器指令,表示特定的功能,如下所示
加:0100 0000减:0100 1000乘:1111 0111 1110 0000除:1111 0111 1111 0000
汇编语言(assembly language)
由于使用机器语言表示时不方便记忆,于是开始使用助记符
来代替机器语言,,例如下面使用助记符表示的加减乘除
加:INC EAX 通过编译器 0100 0000减:DEC EAX 通过编译器 0100 1000乘:MUL EAX 通过编译器 1111 0111 1110 0000除:DIV EAX 通过编译器 1111 0111 1111 0000
高级语言(high-level programming language)
在后期,为了更加高效的编程,在汇编语言的基础之上有了更高级的语言,例如C/C++/Java/OC/Swift
等,这些语言更加接近人类的自然语言。例如c语言表示的加减乘除
加:A+B 通过编译器 0100 0000减:A-B 通过编译器 0100 1000乘:A*B 通过编译器 1111 0111 1110 0000除:A/B 通过编译器 1111 0111 1111 0000
最终的代码在终端设备上显示的过程是这样的
作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS开发交流群:130 595 548,不管你是小白还是大牛都欢迎入驻 ,让我们一起进步,共同发展!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)
代码在终端的编译过程
有以下几点说明:
-
1、
汇编语言
与机器语言
是一一对应的,每一条机器指令都有与之对应的汇编指令 -
2、
汇编语言
可以通过编译
得到机器语言
,机器语言
可以通过反汇编
得到汇编语言
-
3、
高级语言
可以通过编译
得到汇编语言/机器语言
,但汇编语言/机器语言几乎不可能还原成高级语言(因为不同的设备,对应不同的CPU架构,而CPU架构对应不同的指令集)
汇编语言的特点
汇编语言主要有以下几个特点:
-
1、可以
直接访问、控制各种硬件设备
,例如存储器、CPU等,能最大限度的发挥硬件的功能 -
2、能够不受编译器的限制,对生成的二进制代码进行完全的控制
-
3、目标代码简洁,占用内存少,执行速度快
-
4、汇编指令是机器指令的助记符,同机器指令一一对。每一种CPU都有自己的机器指令集/汇编指令集,所以汇编语言不具备可移植性
-
5、知识点过多,要求过高,需要开发者对CPU等硬件结构有所了解,不易于编写、调试,以及维护
-
6、不区分大小写,例如mov和MOV是一样的
汇编语言的用途
按理说,汇编这么难,为什么还要学呢,以及学了能做什么?
汇编学习的目的
任何高级语言最终都会被编译成汇编,学习了解汇编的相关知识,可以更好的日常开发、学习探索中帮助我们更好的排查问题、理解底层运行的机制。大致分为有以下几点:
-
1、是理解整个计算机系统的最佳起点和最有效途径
-
2、为编写高效代码打下基础
-
3、理解代码的本质,例如:
-
函数的本质是什么?
-
++a底层是如何执行的?
-
编译器在底层到底帮我们做了哪些工作?
-
DEBUG模式和RELEASE模式到底有哪些地方是不同的,以及被我们忽略的?
汇编使用的场景
-
1、可以
编写驱动程序、操作系统
,例如Linux内核的某些关键字 -
2、对性能要求极高的程序或者代码片段,可
与高级语言混合使用
(称为内联汇编) -
3、用于
软件安全方面
-
病毒的分析与防治
-
逆向、加壳、脱壳、破解、外挂、免杀、加解密、黑客等
所以综上所述,汇编是所有程序猿都需要了解的一门非常重要的语言,这也是为什么大学中计算机相关专业学生的必修课,就好比修房子,地基稳了,高楼才能平地起
!
汇编语言的种类
目前讨论较多的婚变语言有以下几种
-
1、8086汇编(8086处理器是16bit的CPU)
-
2、Win32汇编
-
3、Win64汇编
-
4、ARM汇编(嵌入式、Mac、iOS)
-
…
在iPhone中使用的是ARM汇编,但是不同的设备之间也会因为CPU架构的不同而有所差异,下面是iPhone中不同架构所对应的设备
架构 | 设备 |
---|---|
armv6 | iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch |
armv7 | iPhone3GS, iPhone4, iPhone4S,iPad, iPad2, iPad3(The New iPad), iPad mini, iPod Touch 3G, iPod Touch4 |
armv7s | iPhone5, iPhone5C, iPad4(iPad with Retina Display) |
arm64 | iPhone5S 以后 iPhoneX , iPad Air, iPad mini2以后 |
必备常识
想要学好汇编,需要有以下几个认知
-
1、首先需要了解CPU等硬件的架构
-
2、App/程序的执行过程
App的执行过程
-
可执行文件:程序/App在本地磁盘的文件
-
image(镜像文件):可执行文件装载到内存的文件(在早期,其本质与可执行文件是一模一样的)
-
内存中除了指令,还有数据,但是都是0和1组合,CPU是如何区分的?是通过CPU上的部件PC寄存器来区分
-
3、硬件相关最为重要的是CPU/内存
-
4、在汇编中,大部分指令都是与CPU/内存相关的