开始逆向objc基础准备(二)我的平台是simulator-x86_64
建项目运行中断调试,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的更多相关文章
- 开始逆向objc基础准备(一)简单认识一下arm32,以及与x86汇编指令类比
ARM32体系中有31或33个通用寄存器,没有特定的某种态下有r0-r15一共16个寄存器,快速中断态下有另一组r8-r12备份寄存器,在用户态和系统态之外其它态下都各自有一组r13-r14备份寄存器 ...
- Linux基础练习题(二)
Linux基础练习题(二) 1.复制/etc/skel目录为/home/tuer1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限. [root@www ~]# cp -r ...
- Bootstrap <基础十二>下拉菜单(Dropdowns)
Bootstrap 下拉菜单.下拉菜单是可切换的,是以列表格式显示链接的上下文菜单.这可以通过与 下拉菜单(Dropdown) JavaScript 插件 的互动来实现. 如需使用下列菜单,只需要在 ...
- RequireJS基础(二)
上一篇是把整个jQuery库作为一个模块.这篇来写一个自己的模块:选择器. 为演示方便这里仅实现常用的三种选择器id,className,attribute. RequireJS使用define来定义 ...
- Servlet基础(二) Servlet的生命周期
Servlet基础(二) Servlet的生命周期 Servlet的生命周期可以分为三个阶段: 1.初始化阶段 2.响应客户请求阶段 3.终止阶段 Servlet的初始化阶段 在下列时刻Servlet ...
- 好好写,好好干-PHP基础(二)
hi 好久没写,昨儿一写,感觉还是有人看的,至少是有一两个评论的~~好好干! 每天需要坚持的就那么4件事儿:写这个,学一点法语,看会儿书,锻炼.单身狗也有好处. 1.PHP 一.PHP基础(二) 1. ...
- php基础篇-二维数组排序 array_multisort
原文:php基础篇-二维数组排序 array_multisort 对2维数组或者多维数组排序是常见的问题,在php中我们有个专门的多维数组排序函数,下面简单介绍下: array_multisort(a ...
- MySQL基础(二)——DDL语句
MySQL基础(二)--DDL语句 1.什么是DDL语句,以及DDL语句的作用 DDL语句时操作数据库对象的语句,这些操作包括create.drop.alter(创建.删除.修改)数据库对象. 2.基 ...
- Python 基础语法(二)
Python 基础语法(二) --------------------------------------------接 Python 基础语法(一) ------------------------ ...
随机推荐
- Markdown的基本使用指南
目录 1.标题 2.列表 2.1无序列表 2.1有序列表 3.引用 4.图片和链接 5.粗体和斜体 6.分割线 7.代码框和代码块 8.列表 9.可选框 10.添加目录 Markdown 是一种用来写 ...
- 百万年薪python之路 -- HTML标签
HTML标签 html标签分类 html标签又叫做html元素,它分为块级元素和内联元素(也可以叫做行内元素),都是html规范中的概念. 标题 h1 h2 h3 h4 h5 h6 列表 ol ul ...
- C# 表达式树 Expression
表达式树是定义代码的数据结构. 它们基于编译器用于分析代码和生成已编译输出的相同结构. 几种常见的表达式 BinaryExpression 包含二元运算符的表达式 BinaryExpression b ...
- Springboot 系列(十五)如何编写自己的 Springboot starter
1. 前言 Springboot 中的自动配置确实方便,减少了我们开发上的复杂性,那么自动配置原理是什么呢?之前我也写过了一篇文章进行了分析. Springboot 系列(三)Spring Boot ...
- 谷歌黑客语法(google hacking)让你的搜索更精准有效
Google Hacking的含义原指利用Google Google搜索引擎搜索信息来进行入侵的技术和行为: 现指利用各种搜索引擎搜索信息来进行入侵的技术和行为,但我们也可以利用这个在互联网上更加便捷 ...
- Flink中接收端反压以及Credit机制 (源码分析)
先上一张图整体了解Flink中的反压 可以看到每个task都会有自己对应的IG(inputgate)对接上游发送过来的数据和RS(resultPatation)对接往下游发送数据, 整个反压机制通 ...
- VB.NET 与 SAP RFC连接问题点
与SAP RFC连接,电脑上必须要安装SAP软件,否则会报错ActiveX 输入工单号,无法带出SAP内接口RFC信息. 确认原因为:RFC接口需求的工单参数需要在前面加两位00,例如:1000541 ...
- Python3获取豆瓣图书标签的前20本热门书籍(一)
介绍 第一篇主要获取豆瓣的大分类.大分类下的具体分类以及具体分类下的前20本热门书籍,第二篇对获取的数据进行分析. 准备 Python3.6.requests.BeautifulSoup4 演示 代码 ...
- COO 与 CSR 稀疏矩阵存取格式;
稀疏矩阵是指矩阵中元素大部分是0的矩阵,事实上,实际问题中大规模矩阵基本上是稀疏矩阵,很多稀疏度在90%甚至99%以上:因此我们需要有高效的稀疏矩阵存储格式. 本文参考了 https://www.cn ...
- python学习之【第二篇】:Python中的数字及其所具有的方法
1.前言 Python 数字(number)数据类型用于存储数值.数据类型是不允许改变的,这就意味着如果改变数字数据类型的值,将重新分配内存空间. 2.创建数字对象 以下实例在变量赋值时 Number ...