前言

汇编语言是面向机器的程序设计语言,可以将其看成是各种 CPU 的机器指令的助记符集合。程序员可以使用汇编代码直接控制硬件系统工作,而且用汇编语言编写的程序具备执行速度快和占用内存少等优点。

在 Apple 平台上主流的汇编语言有 x86 汇编 和 ARM 汇编,

  • 在移动设备上使用的是 ARM 汇编

这主要是因为 ARM 采用的是 RISC 架构,具备功耗低的优势

  • 桌面平台使用的则是 x86 汇编。

iOS 模拟器的程序实际就是以 iOS 模拟器作为容器,运行在该容器中的 Mac OS 程序,所以它使用的汇编也是 x86 汇编。

我经常使用的 Hopper Disassemble V4 主要用来查看OC的伪代码,那Hopper是属于AT&T 还是 Intel分支?

AT&T 和 Intel

答案是:反汇编工具 Hopper Disassemble 和 IDA Pro 使用的是 Intel 汇编语法。

x86 汇编语言演变出两个语法分支: Intel和 AT&T,其中 Intel 语法在 MS-DOS 和 Windows 家族中占主导地位,而 AT&T 语法则常见于 UNIX 家族中。
值得注意的是在 Xcode 中的汇编语法使用的是 AT&T

AT&T 和 Intel的差异,主要体现在变量、常量、寄存器访问、间接寻址和偏移量

  • 操作数前缀:AT&T 汇编语法中的寄存器名称都以 % 作为前缀,立即操作数则以 $ 作为前缀,而 Intel汇编语法的寄存器和立即数均无前缀修饰
  • 操作数方向:在 AT&T 汇编语法中,第一个操作数为源操作数,第二个操作数为目的操作数,Intel 汇编语法的操作数顺序正好相反
  • 寻址方式

段式寻址,其中 segreg 是段寄存器
地址计算的公式

address = disp + base + index * scale

其中 base 为基址,disp 为偏移地址,index * scale 决定了第几个元素,scale 为元素长度,只能为 2 的幂,index 默认为 0,scale 默认为 1。
disp/base/index/scale 全部都是可选的,
最终 AT&T 汇编指令的格式是 %segreg: disp(base,index,scale)
Intel 汇编指令的格式是 segreg: [base+index*scale+disp]。

寄存器

内存(Memory)为 CPU 存放指令和数据,内存本质上就是一个字节数组
处理器在执行指令的过程中,所有数据在寄存器里面都只是临时存放的,然后又会被送往别处,这也是“寄存器”得名的原因。

x86-64

中将通用寄存器从 8 个扩展到了 16 个,正因为如此,所以可以借助寄存器来保存程序状态,而不是像原先那样通过栈来保存程序状态,这极大地减少了访问内存的次数。

图片描述

x86-64 有 16 个 64 位通用寄存器和 16 个浮点数寄存器,此外 CPU 还有一个 64 位的指令指针寄存器 rip,它存放了将要执行的下一条指令的地址。

  • 16 个通用寄存器组

除了从 IA32 的扩展而来的 64 位寄存器:rax、rcx、rdx、rbx、rsi、rdi、rsp 和 rbp,还有新增加的 8 个寄存器 r8 - r15。16 个浮点数寄存器组则为 xmm0 - xmm15。

图片描述

  • 显示所有寄存器的值
register read -a 或 register read --all
(lldb) register read -a
General Purpose Registers:
       rax = 0x00007ffee58c87a8
       rbx = 0x00000000000000c1
       rcx = 0x000000011c0b2000  
       rdx = 0x00007ffee58c81a0
       rdi = 0x0000000000000000
       rsi = 0x00000000000000c1
       rbp = 0x00007ffee58c87c0
       rsp = 0x00007ffee58c8190
        r8 = 0x00007ffee58ca048
        r9 = 0x0000000000000000
       r10 = 0x00007ffee58c8800
       r11 = 0x0000000000000001
       r12 = 0x0000000000000000
       r13 = 0x00000000000000c1
       r14 = 0x00007ffee58c8e30
       r15 = 0x0000b958139a179c
       rip = 0x000000010e533fcf  dyld`_dyld_debugger_notification + 1
    rflags = 0x0000000000000246
        cs = 0x000000000000002b
        fs = 0x0000000000000000
        gs = 0x0000000000000000
       eax = 0xe58c87a8
       ebx = 0x000000c1
       ecx = 0x1c0b2000
       edx = 0xe58c81a0
       edi = 0x00000000
       esi = 0x000000c1
       ebp = 0xe58c87c0
       esp = 0xe58c8190
       r8d = 0xe58ca048
       r9d = 0x00000000
      r10d = 0xe58c8800
      r11d = 0x00000001
      r12d = 0x00000000
      r13d = 0x000000c1
      r14d = 0xe58c8e30
      r15d = 0x139a179c
        ax = 0x87a8
        bx = 0x00c1
        cx = 0x2000
        dx = 0x81a0
        di = 0x0000
        si = 0x00c1
        bp = 0x87c0
        sp = 0x8190
       r8w = 0xa048
       r9w = 0x0000
      r10w = 0x8800
      r11w = 0x0001
      r12w = 0x0000
      r13w = 0x00c1
      r14w = 0x8e30
      r15w = 0x179c
        ah = 0x87
        bh = 0x00
        ch = 0x20
        dh = 0x81
        al = 0xa8
        bl = 0xc1
        cl = 0x00
        dl = 0xa0
       dil = 0x00
       sil = 0xc1
       bpl = 0xc0
       spl = 0x90
       r8l = 0x48
       r9l = 0x00
      r10l = 0x00
      r11l = 0x01
      r12l = 0x00
      r13l = 0xc1
      r14l = 0x30
      r15l = 0x9c

Floating Point Registers:
     fctrl = 0x037f
     fstat = 0x0000
      ftag = 0x00
       fop = 0x0000
     fioff = 0x00000000
     fiseg = 0x0000
     fooff = 0x00000000
     foseg = 0x0000
     mxcsr = 0x00001f80
  mxcsrmask = 0x0000ffff
     stmm0 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xff 0xff}
     stmm1 = {0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xff 0xff}
     stmm2 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
     stmm3 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
     stmm4 = {0x00 0x00 0x00 0x00 0x00 0x00 0xbc 0x87 0x0b 0xc0}
     stmm5 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
     stmm6 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 0x07 0x40}
     stmm7 = {0x00 0x00 0x00 0x00 0x00 0x00 0x60 0xc0 0x0a 0x40}
      ymm0 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xff 0xff 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
      ymm1 = {0x74 0x72 0x6f 0x73 0x70 0x65 0x63 0x74 0x69 0x6f 0x6e 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
      ymm2 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
      ymm3 = {0x70 0x7a 0x76 0x74 0x2f 0x42 0x75 0x69 0x6c 0x64 0x2f 0x50 0x72 0x6f 0x64 0x75 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
      ymm4 = {0x63 0x74 0x73 0x2f 0x44 0x65 0x62 0x75 0x67 0x2d 0x69 0x70 0x68 0x6f 0x6e 0x65 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
      ymm5 = {0x73 0x69 0x6d 0x75 0x44 0x65 0x62 0x75 0x67 0x2d 0x69 0x70 0x68 0x6f 0x6e 0x65 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
      ymm6 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
      ymm7 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
      ymm8 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
      ymm9 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
     ymm10 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
     ymm11 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
     ymm12 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
     ymm13 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
     ymm14 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
     ymm15 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
      xmm0 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xff 0xff}
      xmm1 = {0x74 0x72 0x6f 0x73 0x70 0x65 0x63 0x74 0x69 0x6f 0x6e 0x00 0x00 0x00 0x00 0x00}
      xmm2 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
      xmm3 = {0x70 0x7a 0x76 0x74 0x2f 0x42 0x75 0x69 0x6c 0x64 0x2f 0x50 0x72 0x6f 0x64 0x75}
      xmm4 = {0x63 0x74 0x73 0x2f 0x44 0x65 0x62 0x75 0x67 0x2d 0x69 0x70 0x68 0x6f 0x6e 0x65}
      xmm5 = {0x73 0x69 0x6d 0x75 0x44 0x65 0x62 0x75 0x67 0x2d 0x69 0x70 0x68 0x6f 0x6e 0x65}
      xmm6 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
      xmm7 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
      xmm8 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
      xmm9 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
     xmm10 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
     xmm11 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
     xmm12 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
     xmm13 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
     xmm14 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
     xmm15 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}

Exception State Registers:
    trapno = 0x00000001
       err = 0x00000000
  faultvaddr = 0x00007ffee58c8190

iOS逆向
44 声望15 粉丝

引用和评论

0 条评论