iOS Hacker Xcode玩转arm64汇编基础
已经熟悉了x86汇编,所以其他的理论就不多记了,主要是记录以下这些。
iphon5s以上都是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, iPad Air, iPad mini2(iPad mini with Retina Display)
最常用汇编指令
str 将数据从寄存器中读取存放到内存
ldr 将内存中的数据读取放到寄存器
bl 跳转
32位寄存器
R0-R3 //函数的前4个参数放在R0-R3中,其他的参数放到栈中,返回值在R0
R7
R9
R13 //SP寄存器
R14 //LR寄存器,保存函数返回地址
R15 //PC寄存器
32位的寄存器容量是8位,64位寄存器的容量16位的,数量也更多一些,x1,x2,x3...
---------------------------------------------------------------------
以下是64位的arm汇编的一个实例,理解arm汇编的函数调用的过程。
打开Xcode,新建ios工程,在main.m下写如下代码
#import <UIKit/UIKit.h>
#import "AppDelegate.h"int funcAdd(a,b,c,d,e,f)
{int g=a+b+c+d+e+f;return g;
}
int main(int argc, char * argv[]) {funcAdd(1, 2, 3, 4, 5, 6);@autoreleasepool {return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));}
}
在Xcode菜单栏选择Product=>Perform Action => Assemble main.m, 注意选择在真机编译才能生成arm汇编,在模拟器是x86的。
显示代码有很多.loc开头的鬼东西,为了看着方便可以删掉。
_funcAdd: ; @funcAdd
Lfunc_begin0:.loc 1 13 0 ; /Users/exchen/Desktop/armasm/armasm/main.m:13:0.cfi_startproc
; BB#0:sub sp, sp, #32 ; =32
Ltmp1:.cfi_def_cfa_offset 32str w0, [sp, #28] ;将w0寄存器的值放入sp+28,第1个参数astr w1, [sp, #24] ;将w1寄存器的值放入sp+24,第2个参数bstr w2, [sp, #20] ;将w2寄存器的值放入sp+20,第3个参数cstr w3, [sp, #16] ;将w3寄存器的值放入sp+16,第4个参数dstr w4, [sp, #12] ;将w4寄存器的值放入sp+12,第5个参数estr w5, [sp, #8] ;将w5寄存器的值放入sp+8, 第6个参数f.loc 1 14 11 prologue_end ; /Users/boot/Desktop/armasm/armasm/main.m:14:11
Ltmp2:ldr w0, [sp, #28] ;将第1个参数a放入w0寄存器ldr w1, [sp, #24] ;将第2个参数b放入w1寄存器add w0, w0, w1 ;将w0和w1的值相加并存入w0寄存器ldr w1, [sp, #20] ;将第3个参数e放入w1寄存器add w0, w0, w1 ;将w0和w1的值相加并存入w0寄存器ldr w1, [sp, #16] ;将第4个参数d放入w1寄存器add w0, w0, w1 ;将w0和w1的值相加并存入w0寄存器ldr w1, [sp, #12] ;将第5个参数e放入w1寄存器add w0, w0, w1 ;将w0和w1的值相加并存入w0寄存器ldr w1, [sp, #8] ;将最后一个参数f放入w1寄存器add w0, w0, w1 ;将w0和w1的值相加并存入w0寄存器str w0, [sp, #4] ldr w0, [sp, #4]add sp, sp, #32 ; =32ret
Ltmp3:
Lfunc_end0:
这是在真机运行的汇编代码和上面是一样的。
armasm`funcAdd:0x1000389f0 <+0>: sub sp, sp, #320x1000389f4 <+4>: str w0, [sp, #28]0x1000389f8 <+8>: str w1, [sp, #24]0x1000389fc <+12>: str w2, [sp, #20]0x100038a00 <+16>: str w3, [sp, #16]0x100038a04 <+20>: str w4, [sp, #12]0x100038a08 <+24>: str w5, [sp, #8]
-> 0x100038a0c <+28>: ldr w0, [sp, #28]0x100038a10 <+32>: ldr w1, [sp, #24]0x100038a14 <+36>: add w0, w0, w10x100038a18 <+40>: ldr w1, [sp, #20]0x100038a1c <+44>: add w0, w0, w10x100038a20 <+48>: ldr w1, [sp, #16]0x100038a24 <+52>: add w0, w0, w10x100038a28 <+56>: ldr w1, [sp, #12]0x100038a2c <+60>: add w0, w0, w10x100038a30 <+64>: ldr w1, [sp, #8]0x100038a34 <+68>: add w0, w0, w10x100038a38 <+72>: str w0, [sp, #4]0x100038a3c <+76>: ldr w0, [sp, #4]0x100038a40 <+80>: add sp, sp, #320x100038a44 <+84>: ret
main函数里调用funcAdd的过程
.globl _main.align 2
_main: ; @main
Lfunc_begin1:.loc 1 17 0 is_stmt 1 ; /Users/exchen/Desktop/armasm/armasm/main.m:17:0.cfi_startproc
; BB#0:stp x29, x30, [sp, #-16]!mov x29, spsub sp, sp, #64 ; =64
Ltmp4:.cfi_def_cfa w29, 16
Ltmp5:.cfi_offset w30, -8
Ltmp6:.cfi_offset w29, -16orr w8, wzr, #0x1 ;和mov w8,#0x1是一样的orr w9, wzr, #0x2 ;同上orr w2, wzr, #0x3orr w3, wzr, #0x4movz w4, #0x5orr w5, wzr, #0x6stur wzr, [x29, #-4]stur w0, [x29, #-8]stur x1, [x29, #-16]
mov x0, x8mov x1, x9 ;到这我们发现,函数参数1-6依次存放到w0-w5,或者说是x1-x5,这和32位是有很大区别的。bl 0x1000d09f0 ;调用funcAdd
main函数真机运行的汇编代码
armasm`main:0x1000d0a48 <+0>: stp x29, x30, [sp, #-16]!0x1000d0a4c <+4>: mov x29, sp0x1000d0a50 <+8>: sub sp, sp, #640x1000d0a54 <+12>: orr w8, wzr, #0x1 0x1000d0a58 <+16>: orr w9, wzr, #0x20x1000d0a5c <+20>: orr w2, wzr, #0x30x1000d0a60 <+24>: orr w3, wzr, #0x40x1000d0a64 <+28>: movz w4, #0x50x1000d0a68 <+32>: orr w5, wzr, #0x60x1000d0a6c <+36>: stur wzr, [x29, #-4]0x1000d0a70 <+40>: stur w0, [x29, #-8]0x1000d0a74 <+44>: stur x1, [x29, #-16]
-> 0x1000d0a78 <+48>: mov x0, x80x1000d0a7c <+52>: mov x1, x90x1000d0a80 <+56>: bl 0x1000d09f0 ; funcAdd at main.m:13
iOS Hacker Xcode玩转arm64汇编基础相关推荐
- iOS Hacker Xcode使用和内联汇编
1.在C/C++/Objective C调用汇编函数 在iOS工程里新建Assemble文件,编写代码 .text .align 4 .globl _funcAdd_arm_funcAdd_arm:a ...
- C IN ARM64 汇编基础-变量与表达式-基于The C Programming Language - Second Edition
C源代码: #include <stdio.h>/* print Fahrenheit-Celsius table for fahr = 0, 20, ..., 300 */ main() ...
- xcode armv7 armv7s arm64
armv6 armv7 armv7s arm64引起编译包翻倍增大的问题,下边来说一下关于ios这个指令集 目前ios的指令集有以下几种: armv6 iPhone iPhone2 iPhone3G ...
- iOS Hacker 重签名实现无需越狱注入动态库 dylib
iOS Hacker 重签名实现无需越狱注入动态库 dylib 一.获取 ipa 文件 iOS 的应用都是打包成 ipa 的文件格式,ipa 文件实际上就是 zip 格式的文件,通过 unzip 可以 ...
- iOS Hacker 动态库 dylib 注入
iOS Hacker 动态库 dylib 注入 很多情况下我们希望自己写的代码能够在其他应用中运行,如果代码简单的话,可以写 Tweak 或者使用 Cycript.但如果代码多的话,那最好是写一个动态 ...
- iOS Hacker 使用Theos开发tweak
iOS Hacker 使用Theos开发tweak mkdir /opt export THEOS=/opt/theos sudo git clone git://github.com/DHowett ...
- 【汇编实战开发笔记】ARM汇编基础的三大块知识
文章目录 1 前言 2 ARM知识图谱 3 ARM汇编基础三大块 3.1 寻址方式 3.1.1 立即寻址 3.1.2 寄存器寻址 3.1.3 寄存器偏移寻址 3.1.4 寄存器间接寻址 3.1.5 基 ...
- 【ios开发/Xcode】使用UITableView完成学生信息及成绩的显示
[ios开发/Xcode]使用UITableView完成学生信息及成绩的显示 设计思想 实现效果 源代码 设计思想 首先创建所有页面的故事版,包括,登录.注册与成绩页面 接着设置故事版的关联代码,如下 ...
- 【ios开发/Xcode】实现登录注册
[ios开发/Xcode]实现登录注册 实现效果 源代码 实现效果 首先进入初始界面,输入账号Linchuantao,密码Linchuantao,显示登录失败(如下左图),因此需要进行注册,点击左下角 ...
最新文章
- 物联网是怎样把世界联系起来的
- SAP PP 为工单确认时自动做收货的设置
- 计算机专业文档写作课件,计算机专业论文写作的方法.ppt
- Reading Club week 3 prepare document
- python 曲线拟合_Python实现数学模型(插值、拟合和微分方程)
- Web使用热敏打印小票(IE环境)
- Zookeeper: Zookeeper架构及FastLeaderElection机制
- 普通大学生的 Java 开发能力到什么水平才能进大厂?
- python建模大赛算法_Python数据分析kaggle-Titanic+天池-工业蒸汽量预测建模算法
- 汇编语言常见错误(转载)
- php堆栈溢出,php - 警告:php_eval() - 堆栈内存溢出
- 《自己动手写网络爬虫》读书笔记——队列与集合
- pubg解封验证计算机怎么验证,绝地求生解封教程
- 10、Linux上常见软件的安装:安装JDK、安装Tomcat、安装Eclipse
- 计算机基本办公软件应用技能有哪些,办公人员应掌握哪些办公软件技能
- 赛后复盘 - DataCastle 科大讯飞AI营销算法大赛
- java获取wps文档字数
- 国科大计算机体系结构考试专用
- windows设置路由信息
- 【JavaScript 逆向】AST 技术反混淆
热门文章
- [BZOJ 2734] 集合选数
- 【SIP协议】学习初学笔记
- iOS判断是模拟器还是真机
- 2015年第六届蓝桥杯本科B组C++省赛个人题解
- java与c++的区别-转
- 使用pthread和线程池实现B+树的并行块加载bulkload过程
- [论文阅读] (11)ACE算法和暗通道先验图像去雾算法(Rizzi | 何恺明老师)
- 【python数据挖掘课程】二十.KNN最近邻分类算法分析详解及平衡秤TXT数据集读取
- 【数据结构与算法】之深入解析“回文数”的求解思路和算法示例
- RxSwift之订阅UITableViewCell里的按钮点击事件