使用ARM汇编破解iOS程序基础知识分享_IOS

一、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),栈帧寄存器就不再解释,寄存器存储区:保存非易失寄存器(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。

时间: 2024-11-03 10:58:29

使用ARM汇编破解iOS程序基础知识分享_IOS的相关文章

ARM汇编逆向iOS 实战_IOS

我们先讲一些ARM汇编的基础知识.(我们以ARMV7为例,最新iPhone5s上的64位暂不讨论) 基础知识部分: 首先你介绍一下寄存器: R0-R3:用于函数参数及返回值的传递 R4-R6, R8,R10-R11:没有特殊规定,就是普通的通用寄存器 R7:栈帧指针(Frame Pointer).指向前一个保存的栈帧(stack frame)和链接寄存器(link register, lr)在栈上的地址. R9:操作系统保留 R12:又叫IP(intra-procedure scratch),

javascript基础知识分享之类与函数化_基础知识

1.对象适合于收集和管理数据,容易形成树型结构. Javascript包括一个原型链特性,允许对象继承另一对象的属性.正确的使用它能减少对象的初始化时间和内存消耗. 2.函数它们是javascript的基础模块单元,用于代码复用.信息隐藏和组合调用.函数用于指定对象的行为.一般来说,编程就是将一组需求分解成一组函数和数据结构的技能. 3.模块我们可以使用函数和闭包来构造模块.模块是一个提供接口却隐藏实现状态和实现的函数或对象. 1.自定义类型--构造函数模式(伪类模式) 在基于类的系统中,对象是

iOS时钟开发案例分享_IOS

本文实例为大家介绍了iOS时钟开发过程,供大家参考,具体内容如下 思路就是利用CALayer的隐式动画来实现.因为UIView的非根层也就是手动创建的layer在其属性发生变化时会默认会产生动画效果,这些属性也叫作可动画属性.比如bounds.backgroundColor.position. 时钟里面表盘就是一个UIView,而三根针就是三个手动创建的layer. 先在storyboard上弄一个UIImageView,设置表盘图片 然后在viewDidLoad中初始化三根针,并设置定时器,获

ios开发基础知识 - 2

移动物体 CABasicAnimation *theAnimation; theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.translation.x"]; theAnimation.duration=1; theAnimation.repeatCount=2; theAnimation.autoreverses=YES; theAnimation.fromValue=[NSNumber numberWith

ios开发基础知识 - 1

输出 command+shift+r NSLog(@"log: %@ ", myString);  NSLog(@"log: %f ", myFloat);  NSLog(@"log: %i ", myInt); 显示图片 CGRect myImageRect = CGRectMake(0.0f, 0.0f, 320.0f, 100.0f); UIImageView *myImage = [[UIImageView alloc] initWith

Hadoop一些基础知识分享

问题描述 我的博客里写了很多Hadoop相关的文章如果可以帮助到你,请帮我在CSDN的评选中投上一票 解决方案 解决方案二:支持分享!!解决方案三:又是拉票的已投解决方案四:发现好多了啊,借分享的名义拉票啊.解决方案五:好吧,推荐一个.想学hadoop的快去吧.解决方案六:已投,我是来接分的,不会让我失望吧解决方案七:广告歌不明白解决方案八:好文章........解决方案:先投票再看.解决方案:顶一个....解决方案: 解决方案:写的很好啊,受教了.解决方案:支持分享!!解决方案:感谢分享!!!

线程池基础知识分享

线程池的好处: 降低资源消耗:避免了频繁创建和销毁线程的资源消耗: 提高相应速度:当有新的任务到达时,不必每次都新建线程就可以立即执行: 提高线程的可管理性:线程池对线程进行统一分配.调优和监控.不允许无限制的创建线程.   线程池源码分析其实现原理 当线程池接收到一个新的提交任务,线程池如何处理这个新任务,这部分主要学习线程池的针对新任务的处理流程. 当前运行的线程数小于corePoolSize,创建新线程来执行任务,该步骤需要获取全局锁: 运行的线程数等于或大于corePoolSize,则将

新手学习PHP的一些基础知识分享_php基础

一,PHP脚本代码标记 PHP的脚本是文件中一对特殊标记所包括的内容,如ASP是"<%....%>",PHP可看成是"<?...?>". 然而为了适应XML标准以将PHP嵌入到XML或XHTML中,PHP不建议使用短格式的"<?...?>",而建议使用长格式标记"<?php...?>" 此外PHP代码块还支持 <script language="php"

iOS开发基础之C语言_IOS

为何学习iOS开发要先学C语言呢,学习c语言对ios开发有何作用. 现在越来越多的iOS开发兴趣爱好者投入到了iOS培训中,有的是已经在职的员工,有的是还在就读的学生,还有一些是完全零基础的同学,那么对于他们来说就要一切从基础开始学,首先从C语言学起. 因为C语言是一门语言基础,因具备简洁.灵活等特点而被广泛应用,在多种开发环境中都起着重要作用.那么,为什么学习iOS开发要先学C语言呢? 因为在iOS开发中,会经常使用C语言和汇编的,而汇编语言相对而言要生涩繁琐些,C语言因此便成为程序员的首选.