iOS逆向001--初识汇编<二>

-- 接上节习题001--初识汇编<一>

.text           // 代码段
.global _A,_B   // 全局函数A、B
_A:
    mov x0,#0xa0        // x0 = a0
    mov x1,#0x00        // x1 = 0
    add x1, x0, #0x14   // x1 = x0 + 14 = a0 + 14 = b4
    mov x0,x1           // x0 = x1 = b4
    bl _B               // 跳转到 B函数中
    mov x0,#0x0         // x0 = 0
    ret

_B:
    add x0, x0, #0x10   // x0 = x0 + 10 = b4 + 10 = c4
    ret

Debug 命令

(lldb)register read             :读取寄存器
(lldb)register write    pc + 地址 :修改寄存器
(lldb)memory read + 地址       :读取内存
(lldb)x + 地址:(同上)       :读取内存
(lldb)memory read list      ==  x list
(lldb)x/100xb   list        : 查看100个字节,16进制显示
(lldb)x/100xw   list        : 查看100个字,16进制显示


(lldb)po/x $rip     :打印寄存器(rip 指令地址)
(lldb)p/x $rip          :打印寄存器(rip 指令地址)
(lldb)p/x $rflags       :打印寄存器(rflags 标记寄存器)
(lldb)po  $edi 
(lldb)po  $esi 
(lldb)po  *Addr 
(lldb)po  Addr 
(lldb)ni                :汇编,单步往下走
(lldb)s                 :进入函数
(lldb)p/x 对象
(lldb)p/x list
(lldb)p/x list->value
x/100xb  这个命令叫什么
读取100个字节
(lldb)help   :Debugger commands 查看命令指令

寻址能力:地址总线-数据总线

计算机中常见的数据宽度
• 位(Bit): 1个位就是1个二进制位.0或者1
• 字节(Byte): 1个字节由8个Bit组成(8位).内存中的最小单元Byte.
• 字(Word): 1个字由2个字节组成(16位),这2个字节分别称为高字节和低字节.
• 双字(Doubleword): 1个双字由两个字组成(32位)

所能存储的数据

2 ^ 10  == 1024
2 ^ 20  == 2^10 * 2^10 = 1024 * 1024 = 1M

2^16 == 2^10 * 2^6= 1KB* 64 = 64 KB
2^20 == 1M  = 1024 * 1024 
2^30 == 1G  = 1024 * 1024 * 1024
2^32 == 4G  = 1G*2^2
64位CPU:2^32 + 2^32  == 8G (2个16进制位表示一个字节)

64位CPU (64根地址总线)单次传递8个字节!! 16个16进制位来标示一个64位数据!!
例如:0xFF00 1234 5678 00FF, 2个16进制位表示一个字节 例如:FF
32位 4x8 4个字节 4G
64位 8x8 8个字节 8G

1个字 ==2个字节 == 16 bit
1Byte ==1个字节 == 8 bit(1B ==1根数据总线==1个字节 )
1Byte == 8 bit (8个二进制位 0000 0000,即8个bit位,8位1个字节)
1B
1KB == 1024 Byte = 2 ^ 10 (10根地址总线) 00 0000 0000 ~ 11 1111 1111
1MB == 1024 * 1024 Byte = 2 ^ 20 (20根地址总线) 0000 0000 0000 0000 0000 ~ 1111 1111 1111 1111 1111

16^5 == 245 == 2^(4*5) == 2 ^ 20
8086寻址能力(20根地址总线) 1M 地址方位 == 0x0000 - 0xFFFF(0x16进制,或 Hexadecimal)或 10000H ~ 1FFFFH
假设有个地址:0xCFFA7我们16位CPU没法直接接受这个数据,因为只能接受最大0xFFFF

0xCFFA7 = 0xCFFA * 16 + 0x007
0xCFFA7 = 0xCFF0 * 16 + 0x0A7
0xCFFA7 = 0xCF00 * 16 + 0xFA7
物理地址 = 段地址 * 16 + 偏移地址(地址加法器 == 高地址+ 低地址 == 基地址+ 偏移地址)
16位 : 16位
CFFA : 007
CFF0 : 0A7
CF00 : FA7
C000 : FFA7

1024:0~1023,0011 1111 1111 == 0xFFFF

地址总线宽度

8080:16根  
8088:20根  
8086:20根  
80286:24根
80386:32根

数据总线宽度

8080:8根   = 8B      8  *8b 个二进制位 
8088:8根   = 8B      8  *8b 个二进制位 
8086:16根    = 16B   16 *8b 个二进制位       2^10 * 2^6= 1KB* 64 = 64 KB
80286:16根   = 16B   16 *8b 个二进制位 
80386:32根   = 32B   32 *8b 个二进制位 

如下图:寻址方式

iOS逆向001--初识汇编<二>_第1张图片
image.png

你可能感兴趣的:(iOS逆向001--初识汇编<二>)