逆向开发是建立在分析二进制指令上面,二进制指令与汇编语言一一对应。通过分析app二进制反汇编的汇编语言来推测逻辑,最后达到高级代码还原。
汇编语言的发展
机器语言
由0和1组成的机器指令.
汇编语言(assembly language)
使用助记符代替机器语言
如: mov x0,#0xa0
汇编编译器器将汇编语言转换为机器码
高级语言(High-level programming language)
C\C++\Java\OC\Swift,更加接近人类的自然语言
比如C语言: int a = b;
高级语言的编译器将高级语言转换为汇编语言
我们的代码在终端设备上是这样的过程:
高级语言--汇编语言--机器语言
- 汇编语言与机器语言一一对应,每一条机器指令都有与之对应的汇编指令
- 汇编语言可以通过编译得到机器语言,机器语言可以通过反汇编得到汇编语言
- 高级语言可以通过编译得到汇编语言 \ 机器语言,但汇编语言\机器语言几乎不可能还原成高级语言
汇编语言的种类
-
目前讨论比较多的汇编语言有
- 8086汇编(8086处理器是16bit的CPU)
- ARM汇编(嵌入式、Mac、iOS)
- X86 汇编 (Mac)
- ......
-
我们iPhone里面用到的是ARM汇编,但是不同的设备也有差异.因CPU的架构不同.
- 我们在打包App的时候,app支持的架构指令集是多种的,一般我们会选择armv7, armv7s,arm64三种架构通用,将三个可执行文件包成一个包。 QQMusice支持arm7和arm64
架构 | 设备 |
---|---|
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以后 |
- iphone 5C是最后一个arm32位版本, 5C之后都是arm64位版本
- arm32和arm64位指令集会有些不一样
几个必要的常识
要想学好汇编,首先需要了解CPU等硬件结构
APP/程序的执行过程
- 硬件相关最为重要是CPU/内存
- 在汇编中,大部分指令都是和CPU与内存相关
总线
- 每一个CPU芯片都有许多管脚,这些管脚和总线相连,CPU通过总线跟外部器件进行交互
- 总线:一根根导线的集合
- 总线分为数据总线、地址总线、控制总线
- 数据总线宽度决定了CPU的单次数据传送量,也就是数据传送速度。如 8086的数据总线宽度是16,所以单次最大传递2个字节的数据
- 地址总线宽度决定寻址能力,寻址能力直接影响能够使用多大的内存条。如8086的地址总线宽度是20,所以寻址能力是1M( 220 )
- 控制总线的宽度决定了CPU对其他器件的控制能力、能有多少种控制
内存
各类存储区的逻辑连接 各类存储器的逻辑连接-物理地址对应图 各类存储器的物理地址情况-
内存地址空间的大小受CPU地址总线宽度的限制。8086的地址总线宽度为20,可以定位2^20个不同的内存单元(内存地址范围0x00000~0xFFFFF),所以8086的内存空间大小为1MB
-
0x00000~0x9FFFF:主存储器。可读可写
-
0xA0000~0xBFFFF:向显存中写入数据,这些数据会被显卡输出到显示器。可读可写
-
0xC0000~0xFFFFF:存储各种硬件\系统信息。只读
数据的宽度
数学上的数字,是没有大小限制的,可以无限的大。但在计算机中,由于受硬件的制约,数据都是有长度限制的(我们称为数据宽度),超过最多宽度的数据会被丢弃。
int a = 0X1ffffffff;
超过最多宽度的数据被丢弃
网友评论