建项目运行中断调试,lldb中显示寄存器看到有rax-r15, stm0-stm7, xmm0-xmm15, ymm0-ymm15,即为x64体系支持sse4。

再在lldb中查看寄存器别名得到以下对应:

rax  
rbx  
rcx arg4
rdx arg3
rdi arg1
rsi arg2
rbp fp
rsp sp
r8 arg5
r9 arg6
r10  
r11  
r12  
r13  
r14  
r15  
rip pc
rflags flags
cs  
fs  
gs  

函数传参数的方式一清二楚,不是以前ia32时代传到街知巷闻的参数从右往左依次压栈的方式(系统调用和__fastcall以及汇编函数除外),函数传参数依次使用rdi,rsi,rdx,rcx,r8,r9。除此之外还用上xmm0-xmm7寄存器。

请看下面代码:

/////////////////////////////////////////////////////////////////////
//
// SaveRegisters
//
// Pushes a stack frame and saves all registers that might contain
// parameter values.
//
// On entry:
// stack = ret
//
// On exit:
// %rsp is -byte aligned
//
///////////////////////////////////////////////////////////////////// .macro SaveRegisters push %rbp
.cfi_def_cfa_offset
.cfi_offset rbp, - mov %rsp, %rbp
.cfi_def_cfa_register rbp sub $$0x80+, %rsp // + for alignment movdqa %xmm0, -0x80(%rbp)
push %rax // might be xmm parameter count
movdqa %xmm1, -0x70(%rbp)
push %a1
movdqa %xmm2, -0x60(%rbp)
push %a2
movdqa %xmm3, -0x50(%rbp)
push %a3
movdqa %xmm4, -0x40(%rbp)
push %a4
movdqa %xmm5, -0x30(%rbp)
push %a5
movdqa %xmm6, -0x20(%rbp)
push %a6
movdqa %xmm7, -0x10(%rbp) .endmacro

除了上面提到的寄存器外,r12-r15和rbx的用途能用下面几处反汇编就明白了。

然后翻看调用栈下几个栈的反汇编:

14 - CFRunLoopRunSpecific

15 - -[UIApplication _run]

16 - UIApplicationMain

UIKit`UIApplicationMain:
0x10f0c1bf6 <+>: pushq %rbp
0x10f0c1bf7 <+>: movq %rsp, %rbp
0x10f0c1bfa <+>: pushq %r15
0x10f0c1bfc <+>: pushq %r14
0x10f0c1bfe <+>: pushq %r13
0x10f0c1c00 <+>: pushq %r12
0x10f0c1c02 <+>: pushq %rbx
0x10f0c1c03 <+>: pushq %rax
0x10f0c1c04 <+>: movq %rcx, %rbx
0x10f0c1c07 <+>: movq %rsi, %r15
0x10f0c1c0a <+>: movl %edi, %r12d
UIKit`-[UIApplication _run]:
0x10f0bce26 <+>: pushq %rbp
0x10f0bce27 <+>: movq %rsp, %rbp
0x10f0bce2a <+>: pushq %r15
0x10f0bce2c <+>: pushq %r14
0x10f0bce2e <+>: pushq %r12
0x10f0bce30 <+>: pushq %rbx
0x10f0bce31 <+>: movq %rdi, %rbx
0x10f0bce34 <+>: callq 0x10fb23e34 ; symbol stub for: objc_autoreleasePoolPush
0x10f0bce39 <+>: movq %rax, %r14
0x10f0bce3c <+>: xorl %eax, %eax
0x10f0bce3e <+>: callq 0x10f4c6d50 ; _UIAccessibilityInitialize
0x10f0bce43 <+>: movq 0xc68766(%rip), %rsi ; "_registerForUserDefaultsChanges"
0x10f0bce4a <+>: movq 0xce632f(%rip), %r15 ; (void *)0x000000010e344800: objc_msgSend
0x10f0bce51 <+>: movq %rbx, %rdi
CoreFoundation`CFRunLoopRunSpecific:
0x10e7d7c40 <+>: pushq %rbp
0x10e7d7c41 <+>: movq %rsp, %rbp
0x10e7d7c44 <+>: pushq %r15
0x10e7d7c46 <+>: pushq %r14
0x10e7d7c48 <+>: pushq %r13
0x10e7d7c4a <+>: pushq %r12
0x10e7d7c4c <+>: pushq %rbx
0x10e7d7c4d <+>: subq $0xe8, %rsp
0x10e7d7c54 <+>: movl %edx, -0xec(%rbp)
0x10e7d7c5a <+>: movsd %xmm0, -0xe8(%rbp)
0x10e7d7c62 <+>: movq %rsi, %r14
0x10e7d7c65 <+>: movq %rdi, %r12
0x10e7d7c68 <+>: movq 0x311459(%rip), %rax ; (void *)0x00000001114c0070: __stack_chk_guard
0x10e7d7c6f <+>: movq (%rax), %rax
0x10e7d7c72 <+>: movq %rax, -0x30(%rbp)

代码的共通点都是在函数开始运算之前将r12-r15以及rbx压入栈,r12-r15以及rbx主要用于函数局部变量或临变量。在UIApplicationMain函数中一开始入栈保存后,马上将输入参数传送到rbx,r15,r12进行运算。

已经约模弄清楚了一条路了,下面就开始反汇编逆向分析,但我的平台是simulator x64。

ps:后面还会介绍objc其它传参方式, 以及windows和linux(也就是vc与gcc)在x64平台的传参方式。

开始逆向objc基础准备(二)我的平台是simulator-x86_64的更多相关文章

  1. 开始逆向objc基础准备(一)简单认识一下arm32,以及与x86汇编指令类比

    ARM32体系中有31或33个通用寄存器,没有特定的某种态下有r0-r15一共16个寄存器,快速中断态下有另一组r8-r12备份寄存器,在用户态和系统态之外其它态下都各自有一组r13-r14备份寄存器 ...

  2. Linux基础练习题(二)

    Linux基础练习题(二) 1.复制/etc/skel目录为/home/tuer1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限. [root@www ~]# cp -r ...

  3. Bootstrap <基础十二>下拉菜单(Dropdowns)

    Bootstrap 下拉菜单.下拉菜单是可切换的,是以列表格式显示链接的上下文菜单.这可以通过与 下拉菜单(Dropdown) JavaScript 插件 的互动来实现. 如需使用下列菜单,只需要在 ...

  4. RequireJS基础(二)

    上一篇是把整个jQuery库作为一个模块.这篇来写一个自己的模块:选择器. 为演示方便这里仅实现常用的三种选择器id,className,attribute. RequireJS使用define来定义 ...

  5. Servlet基础(二) Servlet的生命周期

    Servlet基础(二) Servlet的生命周期 Servlet的生命周期可以分为三个阶段: 1.初始化阶段 2.响应客户请求阶段 3.终止阶段 Servlet的初始化阶段 在下列时刻Servlet ...

  6. 好好写,好好干-PHP基础(二)

    hi 好久没写,昨儿一写,感觉还是有人看的,至少是有一两个评论的~~好好干! 每天需要坚持的就那么4件事儿:写这个,学一点法语,看会儿书,锻炼.单身狗也有好处. 1.PHP 一.PHP基础(二) 1. ...

  7. php基础篇-二维数组排序 array_multisort

    原文:php基础篇-二维数组排序 array_multisort 对2维数组或者多维数组排序是常见的问题,在php中我们有个专门的多维数组排序函数,下面简单介绍下: array_multisort(a ...

  8. MySQL基础(二)——DDL语句

    MySQL基础(二)--DDL语句 1.什么是DDL语句,以及DDL语句的作用 DDL语句时操作数据库对象的语句,这些操作包括create.drop.alter(创建.删除.修改)数据库对象. 2.基 ...

  9. Python 基础语法(二)

    Python 基础语法(二) --------------------------------------------接 Python 基础语法(一) ------------------------ ...

随机推荐

  1. Java8新特性 - Stream API

    Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.使用Stream API对集合进行操作,就类似与使用SQL执行的数据库 ...

  2. Mybaits 源码解析 (二)----- 根据配置文件创建SqlSessionFactory(Configuration的创建过程)

    我们使用mybatis操作数据库都是通过SqlSession的API调用,而创建SqlSession是通过SqlSessionFactory.下面我们就看看SqlSessionFactory的创建过程 ...

  3. python问题:IndentationError:expected an indented block

    Python语言是一款对缩进非常敏感的语言,给很多初学者带来了困惑,即便是很有经验的Python程序员,也可能陷入陷阱当中.最常见的情况是tab和空格的混用会导致错误,或者缩进不对,而这是用肉眼无法分 ...

  4. The usage of Markdown---列表

    目录 1. 序言 2. 有序列表 3. 多级有序列表 3. 无序列表 4. 多级无序列表 5. 列表中的转义字符 6. 无效化 7. 任务列表 更新时间:2019.09.14 1. 序言   其实我昨 ...

  5. Redis(二)数据结构与键管理

    一.基础知识 1.全局命令 keys *   :查看所有键 dbsize:返回当前数据库中键的总数 exists key:检查键是否存在 del key ... :删除键 expire key sec ...

  6. 二叉树,红黑树,B树,B+树

    1.不要认为红黑树仅仅是在二叉树的节点上涂上颜色,他们最根本的区别是,红黑树根据节点涂色的约束限制,最终形成的树的结构与普通二叉树不同,最重要的是,其树的高度大大缩短,从而在查找.增删改等方面提高效率 ...

  7. docker安装sshd

    基础镜像: ubuntu:14.04 启动并安装sshd //启动 docker run -it ubuntu:14.04 /bin/bash //更新apt-get apt-get update / ...

  8. 【原创】go语言学习(十一)package简介

    目录 Go源码组织方式 main函数和main包 编译命令 自定义包 init函数以及执行行顺序 _标识符 Go源码组织方式 1. Go通过package的方式来组织源码 package 包名 注意: ...

  9. Web for pentester_writeup之XML attacks篇

    Web for pentester_writeup之XML attacks篇 XML attacks(XML攻击) Example 1 - XML外部实体注入(XXE) Payload http:// ...

  10. 文件 File

    文件 1. 文件的一些常用方法 package com.ljw.study; import java.io.File; import java.util.Arrays; import java.uti ...