我们在学习逆向开发之前,我们要了解一个基本的逆向原理.
- 一个应用安装到手机,可执行文件本质上是二进制文件.
- 手机本质上执行的指令是二进制,是由CPU执行的
- 逆向开发是建立在分析二进制.
接下来,我们从汇编讲起,
说到汇编语言的产生,首先要讲一下机器语言
1.机器语言
1.1什么是机器语言?
- 机器语言是机器指令的集合。
- 机器指令展开来讲就是一台机器可以正确执行的命令。
- 电子计算机的机器指令是一列二进制数字。
- 计算机转变为一列高低电平,以使计算机的电子器受到驱动,进行运算。
1.2机器语言由来
早期的程序设计均使用机器语言。程序员们将用0,1数字编成的程序代码打在纸带或卡片上,1打孔,0不打孔,再讲程序通过纸带机或卡片机输入计算机,进行运算。
1.3第一个入门程序
身为程序员,每种语言的入门程序,都是welcome to masm。这个是大家都很熟悉第一个程序。
在显示器上输出“welecom to masm”,机器语言怎么写呢?
你看到这里有啥想法?
自我感觉挺崩溃的。
上面只是一个非常简单的入门小程序,
写如此小的程序尚且如此,
一个复杂的程序更复杂了。
如果程序中0或1写错了。
估计检查也是挺麻烦的。
只看上面的一段代码,很难识别出来错误的代码。
此时就诞生了另一种语言,方便我们读写。这就汇编语言。
2.汇编语言
2.1什么是汇编语言?
- 汇编语言的主题是汇编指令
- 汇编指令和机器指令的差别在于指令的表示方法上。
- 汇编指令是机器指令便于记忆的书写格式。
2.2汇编指令案例
机器指令1000100111011000表示吧寄存器BX的内容送到AX中。
那我们怎么写汇编指令呢?
我们只需要借助mov指令就可以编写:
mov ax,bx
我们把bx的内容送到ax中,是不是挺简单的。
我们不用在写10这样的机器指令。
2.3.语言的发展
语言发展.png- 汇编语言和机器语言是一一对应的。
- 汇编语言可以通过编译得到汇编机器语言。
- 机器语言可以通过反编译得到汇编语言。
- 高级语言可以通过编译得到汇编语言或者机器语言。
- 汇编语言或者机器语言几乎不可能还原成高级语言。
2.4汇编语言特点
- 直接访问,控制各种硬件设备。(存储器,CPU)
- 能够不受编译器的限制,对生产的二级制代码进行完全的控制。
- 目标代码简短,占用内存少,执行速度快。
- 汇编语言不具备可移植性。因为每一种CPU都有自己的机器指令集和汇编指令集。
- 知识点过多,必须对CPU等硬件结构有所了解,不易编写,调试,维护,相比机器语言好了很多。
- 不区分大小写,比如mov和MOV表达的意思是一样的。
2.5汇编语言用途
- 编写驱动程序,操作系统。
- 对性能要求极高的程序或者代码片段,可与高级语言混合使用。
- 软件安全:病毒分析与防治;加壳、脱壳等。
- 弄清底层代码的本质。
2.6汇编种类
- 8086汇编-->>适合入门汇编,8086处理器是16位的CPU。
- Win32汇编
- Win64汇编
- ARM汇编(嵌入式等)
我们iPhone里面用到的是ARM汇编,但是不同的设备也有差异,因为CPU的架构不同
ARM架构2.7汇编组成
- 汇编指令:机器码的助记符,有对应的机器码。
- 伪指令:没有对应的机器码,由编译器执行,没有对应的机器码。
- 其他符号:如+ 、- 、* 、/等,由编译器识别,没有对应的机器码。
2.8学习汇编
- 如果想学习汇编,先从8086汇编开始学习,结构简介,经典。
- 要对CPU等硬件结构有一定的了解。
- 熟悉软件、程序的执行过程。
- 最关键的是需要了解CPU和内存。
2.9开始编写我们的一个程序
-
helloworld
HelloWorld.png -
运行结果
运行结果.jpg
3.汇编语言其他内容
3.1总线
CPU芯片.png- 每一个CPU芯片都有许多管脚,这些管脚和总线相连,CPU通过总线跟外部器件进行交互。
- 总线:一根根导线的集合。
3.2地址、数据、控制总线
总线.png- 地址总线:
1.CPU是通过地址总线来指定存储器单元的。
2.一个CPU有N根地址线,CPU地址总线的宽度为N。
3.最多可以寻找2的N次方个内存单元。
地址总线:宽度决定了CPU的寻址能力;8086的地址总线宽度是20,所以寻址能力是1M(2的20次方)。
- 数据总线:
1.CPU与内存或其他器件之间的数据传送通过数据总线来进行的。
2.数据总线的宽度决定了CPU和外界的数据传送速度。
8088.png 8086.png数据总线:它的宽度决定了CPU的单次数据传送量,也就是数据传送速度;8086的数据总线宽度是16,所以单次最大传递2个字节的数据。
8088的数据总线宽度是8,8086的数据总线是16。
所以8088分两次传送89D8,8086只需要一次传送。
- 控制总线:
1.CPU对外部器件的控制是通过控制总线来进行的。
2.控制总线的宽度决定了CPU对外部器件的控制能力。
3.3我们思考几个问题
- 1个CPU的寻址能力为8KB,那么他的地址总线的宽度是多少?
答案是13。-->> 2 的(13) 次方= 1024 * 8,然后13就是地址总线的宽度。 - 8080、8088,80286,80386的地址总线宽度分别为16根,20根,24根,32根,他们的寻址能力分别为(64)KB,(1)MB,(16)MB,(4)GB。
怎么计算的呢?
16根-->>2 的16次方==64KB
20根-->>2的20次方==1KB * 1024 =1MB
24根-->>2的24次方==1MB * (2的4次方)=16MB
32根-->>2的32次方==1GB * (2的2次方) =4GB - 8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根,32根。它们一次可以传送的数据为:(1)B,(1)B,(2)B,(2)B,(4)B。
- 从内存中读取1024字节的数据,8086至少要读取(512)次,8386至少要读取(256)次。
3.4存储器
存储器.png- 从读写属性上分为两类:
1.随机存储器RAM;
2.只读存储器ROM
3.随机存储器可读可写,但必须带电存储,关机后存储的内容丢失;
4.只读存储器只能读取不能写入,关机后其中的内容不丢失。 - 从功能和连接上分为两三类:
1.随机存储器:用于存放供CPU使用的绝大部分程序和数据,主随机存储器一般由两个位置上的RAM组成,装在主板上RAM和插在扩展插槽上的RAM。
2.装有BIOS的ROM
3.接口上的RAM。
3.5内存
- 内存地址空间的大小受CPU地址总线宽度的限制。
- 图中,内存地址分配:
0x00000-0x9FFFF:主存储器,可读可写。
0xA0000-0xBFFFF:向显存中写入数据,这些数据会被显卡输出到显示器,可读可写。
0xC0000-0xFFFFF:存储各种硬件,系统信息,只读。
4.总结
以上内容是对汇编的产生以及汇编中的知识层进行的介绍。
知识层继续介绍与分析,我们下一节继续进行。
通过这一篇文章,个人感觉汇编也是一种挺有魅力的语言。
很像和它做朋友,所以你必须要深入的了解一下它。
网友评论