原文在此:http://www.cnblogs.com/mddblog/p/4951650.html

一、Thumb指令与ARM指令

Thumb指令为16位,因此存储代码的密度高,节省存储空间。但是功能不全,它只是ARM指令(32位)集的补充,是ARM指令集下的一个子集。在初级阶段我们不需要了解这些知识,只要有个概念知道有这么个东西就可以。

二、ARM的寄存器初步了解

  R0-R3:        用于函数参数及返回值的传递,超过4个参数,其它参数存在栈中,在ARM中栈是向下生长的,R0还可以作为返回值。
  R4-R6, R8, R10-R11: 没有特殊规定,就是普通的通用寄存器
  R7:          栈帧指针,指向母函数与被调用子函数在栈中的交界。
  R9:          在iOS3.0被操作系统保留
  R12:          内部过程调用寄存器,动态链接时会用到,不必深究
  R13:          SP(stack pointer),是栈顶指针
  R14:          LR(link register),存放函数的返回地址。
  R15:          PC(program counter),指向当前指令地址。
  CPSR:         当前程序状态寄存器,在用户状态下存放像condition标志中断禁用等标志的。
  另外还有VFP(向量浮点运算)相关的寄存器,不在列举。

三、常用汇编

  助记符  说明
  ADC    带进位的加法
  ADD    加法
  AND    逻辑与
  B      分支跳转,很少单独使用
  BL          分支跳转,跳转后返回地址存入r14
  BX          分支跳转,并切换指令模式(Thumb/ARM)
  CMP        比较值,结果存在程序状态寄存器,一般用于分支判断
  BEQ        结果为0则跳转
  BNE        结果不为0跳转
  LDR        加载寄存器,从内存加载到寄存器
  LDRB      装载字节到寄存器
  LDRH      装载半字到寄存器(一个字是32位)
  LSL         逻辑左移 这是一个选项,不是指令
  LSR         逻辑右移 这是一个选项,不是指令
  MOV        传送值/寄存器到一个寄存器 
  STR         存储一个寄存器,寄存器值存到内存
  STRB       存储一个字节
  STRH       存储一个半字
  SUB         减法
  PUSH POP 堆栈操作

  更多指令请参考这里

四、函数调用

  函数的参数、局部变量、返回地址都在栈上存着,这部分栈上的内存称为栈帧。和R0~R15(不一定全部)、CPSR等一起构成了函数的运行环境。每一个函数系统都会分配一个栈帧,执行完成后系统自动收回。每个函数都以为R0~R15、CPSR等CPU相关寄存器为自己一人享有,所以要做一些必要操作。

  举个例子:假设A调用B时,那么A要保存自己的运行环境(保存现场),B执行完后,要恢复A的运行环境(恢复现场);另外A还可以通过R0—R4来传递参数,参数超过4个可以通过栈,B返回时可以通过R0传递返回值。其中主要涉及的就是栈的操作和寄存器的操作。下图为函数调用前后栈的布局,左边为调用前,右边为调用后,当B返回时应回到左边状态(A调用B之前的状态,就像没有调用B一样)。

  在上图中,一个栈帧除了已经提到的参数区域(parameter area)、链接区域(linkage area)、局部变量存储区(local storage area)外还有栈帧指针存放区域(saved frame pointer)、寄存器存储区(saved registers area),栈帧指针上面已介绍(R7);寄存器存储区:保存非易失寄存器(R4,R5,R6,R8,R10,R11),后面的汇编代码例子会介绍。

  开始调用(现场保护):

  1)LR入栈;

  2)R7入栈,包存要恢复的寄存器入栈;

  3)R7 = SP地址;

  4)将callee会修改且在返回caller时需要恢复的寄存器入栈;

  5)分配栈空间给子程序使用。

  下图为汇编代码(使用hopper disassemble反编译的代码),分析如下:

  第一行:将LR, R7, R4-R6入栈;

  第二行:r7=sp-0xc(指向old R7),之所以减去0xc因为PUSH后,r4,r5,r6占去12个字节;

  第三行:保存要恢复的寄存器;

  第四行:给当前函数开辟栈空间。

  函数返回(恢复现场):

  1)释放栈空间;

  2)恢复所保存的寄存器;

  3)恢复R7;

  4)将之前存放的LR从栈上弹出到PC,这样函数就返回了。

  下图为汇编代码(使用hopper disassemble反编译的代码),分析如下:

  第一行:释放栈空间;

  第二行:恢复保存的寄存器;

  第三行:恢复保存的寄存器,恢复R7,将之前存放的LR从栈上弹出到PC。

  更详细函数调用请参考这里

  iOS内存分区请参考这里

 

iOS程序破解——ARM汇编基础的更多相关文章

  1. iOS 逆向之ARM汇编

    最近对iOS逆向工程很感兴趣. 目前iOS逆向的书籍有: <Hacking and Securing IOS Applications>, <iOS Hacker's Handboo ...

  2. GNU ARM 汇编基础

    ARM GNU汇编基础 0 前言 全文补充提醒: 笔者在阅读ARM官方文档及查阅实际的u-boot源码中的汇编代码后,发现了一些不同于ARM官方文档中的汇编语法,查阅相关资料后,才发现主要由于汇编器的 ...

  3. iOS相关的ARM汇编

    一.iOS汇编1.真机:arm64汇编寄存器指令 堆栈2.模拟器:x86汇编 二.lldb (lldb)register read x0 (lldb)register read w0 (lldb)re ...

  4. iOS程序破解——获取.ipa程序包

    原文在此 首先肯定不是获取自己的ipa包. 为什么要获取ipa包呢?比如,在仿写一些程序时,避免不了获取它的图片素材等等,那么最快也是最有效的方式就是获取原程序的ipa包.更或者,你想要逆向分析某一款 ...

  5. ARM汇编基础指令

    Cortex-A7 常用汇编指令 一.处理器内部数据传输指令 1.mov 将数据从一个寄存器拷贝到另外一个寄存器,或者将一个立即数传递到寄存器里面 MOV R0,R1 @将寄存器 R1 中的数据传递给 ...

  6. iOS程序破解——class-dump获取头文件

    原文在此:http://www.cnblogs.com/mddblog/p/4942894.html 一.简述 class-dump顾名思义,是用来dump目标对象class信息的工具.它根据oc的r ...

  7. 转载:Source Insight查看ARM汇编源程序 && 高亮显示程序 && Source Insight打开project窗口出错

    (1)Source Insight查看ARM汇编源程序.做ARM嵌入式开发时,有时得整汇编代码,但在SIS里建立PROJECT并ADD TREE的时候,根据默认设置并不会把该TREE里面所有汇编文件都 ...

  8. iOS基础 - iOS程序启动原理

    一.UIApplicationMain 在main.m的main函数中执行了UIApplicationMain这个方法,这是ios程序的入口点 int UIApplicationMain(int ar ...

  9. ARM汇编编程基础之一 —— 寄存器

    ARM的汇编编程,本质上就是针对CPU寄存器的编程,所以我们首先要弄清楚ARM有哪些寄存器?这些寄存器都是如何使用的? ARM寄存器分为2类,普通寄存器和状态寄存器 寄存器类别 寄存器在汇编中的名称 ...

随机推荐

  1. .Net 转战 Android 4.4 日常笔记(10)--ADT集成环境更新SDK

    今天下载了一份原来来参考,却发现SDK版本偏低我没有安装 用SDK Manager却一直更新不了出现 Failed to fetch URL https://dl-ssl.google.com/and ...

  2. iOS开发之SQLite--C语言接口规范(四) —— Result Values From A Query

    数据库的在上一篇博客中<SQLite之C语言接口规范(三)——Binding Values To Prepared Statements>用到了如何从查询结果中取出结果值.今天的博客就详细 ...

  3. [CUDA] CUDA to DL

    又是一枚祖国的骚年,阅览做做笔记:http://www.cnblogs.com/neopenx/p/4643705.html 这里只是一些基础知识.帮助理解DL tool的实现. “这也是深度学习带来 ...

  4. 理解HTTP协议

    在互联网时代HTTP协议的重要性无需多言,对于技术岗位的同学们来说理解掌握HTTP协议是必须的.本篇博客就从HTTP协议的演进.特性.重要知识点和工作中常见问题的总结等方面进行简单的介绍.理解掌握了这 ...

  5. gnuplot: 一种更为简洁的曲线,柱状图绘图软件

    gnuplot: 一种更为简洁的曲线,柱状图绘图软件 gnuplot: 一种更为简洁的曲线,柱状图绘图软件 Zhong Xiewei Wed Jun 25 gnuplot简单介绍 关于gnuplot的 ...

  6. 大型网站提速关键技术(页面静态化,memcached,MySql优化)(一)

    一:关键技术介绍: 衡量是否为大型网站的要素: A:PV值(page views 页面浏览量) 访问量大: 带来的问题:1:流量大 -->解决方案:增加带宽,优化程序(视频和图片较浪费带宽,尽量 ...

  7. Ionic2学习笔记(5):Provider

    作者:Grey 原文地址: http://www.cnblogs.com/greyzeng/p/5547646.html             Provider是一种为App提供数据源的方式, 举个 ...

  8. 【C#】分享带等待窗体的任务执行器一枚

    -------------201504161039更新------------- 更新内容: IWaitForm接口删除System.Windows.Forms.DialogResult Dialog ...

  9. 基于CkEditor实现.net在线开发之路(2)编写C#代码,怎么调用它。

    上一章简约的介绍了CkEditor编辑器,可以编辑js逻辑代码,css,html,C#代码,这章我根据实际例子,讲解怎么编写C#代码和怎么调用它. 大家都还记得刚刚接触程序编时的hello Word吧 ...

  10. Java中, for循环经典例子

    循环的两种应用:穷举和迭代. break跳出整个循环 一.穷举:将所有可能的情况都走一遍,用if筛选出符合条件. 百鸡百钱: 一只公鸡1文钱,一只母鸡2文钱,一只小鸡半文钱,需要买100只鸡, 正好花 ...