最近准备学习汇编,而后在B站上看到叫iOS小贤的做者发的视频挺不错,打算跟着学,文章是看视频的笔记,最后有原视频连接,想看视频的能够看看经过连接查看视频。sass
**注:**机器指令最终转换成电信号。安全
咱们的代码在终端设备上是这样的过程:bash
**注:**高级语言根据不一样的平台编译成对应的汇编语言,汇编语言在编译成机器语言,最终执行的是机器语言,ax
和bx
是寄存器,mov ax, bx
是将ax
寄存器的值放入bx
中,mov ax, bx
在CPU底层就是1000100111011000
,在作逆向开发过程当中有个概念叫反汇编,安装到手机上是加密或者加壳的机器语言,经过工具能够砸壳,砸壳以后就能获得机器语言,而后能够反汇编成汇编语言(由于一条汇编指令和一条机器指令是一一对应的),可是汇编语言不能反编译成高级语言,由于不一样平台下有不一样的汇编指令,因此同一条C/OC语言会可能生成不一样的汇编代码,也有可能会生成一样的汇编代码。markdown
高级语言是在汇编语言之上的,作了一层包装,因此咱们看到的汇编语言有不少代码是用来配置一些环境的,来支持高级语言的一些语法特性,好比面向对象的特性。架构
- 汇编语言与机器语言一一对应,每一条机器指令都有与之对应的汇编指令
**注:**汇编能够直接访问CPU,寄存器属于CPU的,能够最大限度发挥硬件的功能,并且不受编译器的限制。好比用汇编写一些病毒或者作安全相关的东西,为何能作这些事情呢?由于用高级语言作一些开发的时候,有不少功能是受限制的,可是因为汇编是直接访问CPU的,由于操做系统也是指令集,操做系统能作的事情咱们也能作。“执行速度快”是相对高级语言,一条高级语言代码生成的汇编语言可能会很是多,由于高级语言要搭一个环境,好比面向对象的语言特性,用不少汇编指令才能支撑,因此直接写汇编语言“目标代码简短,占用内存少,执行速度快”。再说一下“标代码简短,占用内存少”,咱们所写的代码在执行的过程当中须要加载进内存,叫装载的过程,高级语言可能你写的代码不多,但生成的汇编不少,因此占用的内存就会大。并且高级语言最终转变的二进制,由于要环境搭建,要绕不少弯,连接不少库,比方说NSLog
,须要连接不少系统的库,因此最终生成的二进制有不少二进制的东西,因此最终转成的机器码比较大。iphone
下面来新建一个项目Assembly001,而后在Debug中把Debug Workflow设置成Always Show Disassembly,这样打了断点会显示反汇编代码ide
执行程序函数
刚刚看到的是X86汇编,movl %eax, -0x14(%rbp)
在LLDB中输入memory read 0x10cc7f795
能够获得这条指令所在的地址,这些都是16进制的,0x10cc7f798
减去0x10cc7f795
为4,也就是在内存中占有4个字节,32位。工具
0x10cc7f795: 89 45 ec e8 e9 02 00 00 8b 7d f8 48 8b 75 f0 48 .E.......}.H.u.H 0x10cc7f7a5: 8b 0d cd 24 00 00 48 8b 15 be 24 00 00 89 7d e8 ...$..H...$...}. 复制代码
输入memory read 0x10cc7f795
,48 83 ec 30
这4个字节就是subq $0x30, %rsp
这个指令的意思。oop
0x10cc7f774: 48 83 ec 30 c7 45 fc 00 00 00 00 89 7d f8 48 89 H..0.E......}.H. 0x10cc7f784: 75 f0 bf 01 00 00 00 be 02 00 00 00 e8 bb ff ff u............... 复制代码
再输入s挑战到test
目前讨论比较多的汇编语言有
咱们iPhone里面用到的是ARM汇编,可是不一样的设备也有差别.因CPU的架构不一样.
架构 | 设备 |
---|---|
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 | iPhone6s, iphone6s plus, iPhone6, iPhone6 plus, iPhone5S, iPad Air, iPad mini2 |
由于学习因此建议先从最为经典的8086开始
**注:**手机安装的App中有不少文件,Mach-O是可执行文件,可执行文件须要装载进内存。本地图片,bundle, nib文件不属于执行文件,属于数据,也须要加载进内存,只不过在使用的时候才加载,可是执行文件首先加载进内存。加载进内存后,CUP经过地址总线读指令,读到对应指令以后会经过控制总线控制终端设备的屏幕每一个像素点是RGBA,每一个值是0到255,255的二进制是1111 1111
,8个二进制位,也就是一个字节,内存中最小单元是一个字节。