[iOS逆向实战 之三]函数之基本类型(int)参数传递

个人原创,转帖请注明来源:cnblogs.com/jailbreaker

在这[iOS逆向实战 之一]中讲到函数调用的参数传递通过r0-r3来实现,这篇帖子我们来验证下。先看一个4个参数的函数代码:

main方法简单调用compute方法,先看main的汇编代码:

明显可以看出,参数值1,2,3,4分别传递给r0-r3,然后通过b调用函数 compute,接着看下compute的汇编代码:

最后一行 是返回到 调用者的下一行,之前帖子已经学过了,前面面3条代注释如下:

add r0, r1     //r0 = r0+r1

add r0,r2     //r0 = r0+r2

subs r0,r0,r3     //r0 = r0 - r3

比较下汇编代码和源代码,就能理解r0-r3的功能,这里的被调用函数是4个参数,正好对应r0-r3  4个寄存器,如果参数是多个,又会怎么样,修改源代码如下:

还是看main汇编代码:

目前汇编的main方法 和之前的版本差异还是比较大的,行数36 - 38 ,这里可以看出开创了一个新的栈帧,而大小是12个字节,其实就是函数最后3个参数需要保存的位置,行数50 - 51,做的是针对36 - 38 开创空间的清理工作。

行数39 - 41,把实参5,7,6赋予r2,r0和r1,这里顺序其实无所谓了,因为者3个寄存器作为临时保存,后面42,43,45行的功能将这个值分别保存到[sp+0],[sp+4],[sp+8]内存位置,剩余的mov代码都能看懂了,之后调用compute,再来看下compute内部的汇编代码:

重点看下 20 ,22,24行 ldr 指令,ldr lr,[r7,#8] 的含义是将r7+8地址上的值 保存到lr里,这里为啥是+8,而不是+0,因为在16行,先后push了lr和r7(27行pop出来),正好是8字节,所以r7+8就是前面栈帧分配的参数。

时间: 2024-10-10 15:39:28

[iOS逆向实战 之三]函数之基本类型(int)参数传递的相关文章

[iOS逆向实战 之一]arm寄存器简介

个人原创,转帖请注明来源:cnblogs.com/jailbreaker [iOS逆向实战]这个系列的帖子,会涉及到arm汇编,以及调试工具的使用,加上实战解析一步步逆向,深入浅出. 这是第一篇帖子,简要说下arm的各个寄存器的功能. R0-R3:用于函数参数及返回值的传递 R4-R6, R8, R10-R11:没有特殊规定,就是普通的通用寄存器 R7:栈帧指针(Frame Pointer).指向前一个保存的栈帧(stack frame)和链接寄存器(link register, lr)在栈上的

[iOS逆向实战 之四]创建objc对象

个人原创,转帖请注明来源:cnblogs.com/jailbreaker objc是完全面向对象的语言,所以逆向的重点就是逆向类,这篇帖子通过ida的神奇的f5功能,来逆向某个对象的创建. 我们直接看ida中的main方法的逆向出来的arm代码: 基本上看不出所以然,我们使用ida的f5分析得出c语法的伪代码如下: 提一下,我在源码中,把自动内存管理ARC关掉了,为的是让代码更整洁. 在 8,9行都看到objc_msgSend,这个objc_msgSend其实是编译器生成的代码,在源码中没有的,

[iOS逆向实战 之六]看懂mach-o(1)

个人原创,转帖请注明来源:cnblogs.com/jailbreaker 在win下搞逆向需要看懂pe,同样搞iOS安全攻防必须看懂mach-o格式,水果的官方mach-o文档在此:https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachORuntime/index.html 本文中实际项目分析,来达到“看懂”的目的,使用的工具还是前一篇blog所用的hopper. 先将目标文件拖进h

[iOS逆向实战 之十]动态调试利器---gdb基础篇

个人原创,转帖请注明来源:cnblogs.com/jailbreaker 一.调试平台搭建 1.GNU Debugger.首先安装ios下的gdb调试器,添加源:cydia.radare.org .搜索 GNU Debugger,安装之.(有些源的GDB好像不能用,这个测试没问题) 2.openSSH.这个应该都会装,没装过的参考,http://www.cnblogs.com/jailbreaker/p/4142609.html 3.adv-cmds.添加源:apt.saurik.com(这个应

[iOS逆向实战 之七]看懂mach-o(2)

个人原创,转帖请注明来源:cnblogs.com/jailbreaker 接上一篇看懂mach-o(1),本文继续讲紧随mach-o的header文件的load command加载命令,看下面2张图,分别是hopper中显示的第一个load command区域和segment_command的定义: 第一张图截取的是第一个load command,从第一张图所知道,cmd类型是segment_command,就是截图的第2张图,依次分析: 1.cmd 是load command的类型,本文中值=

[iOS逆向实战 之八]看懂mach-o(3)

个人原创,转帖请注明来源:cnblogs.com/jailbreaker 之前两篇帖子分别讲了mach-o的header区和load command区中的segment,今天继续讲segment中的的setcion,一般在__TEXT和__DATA段中有section.这里注意下命名规范,大写代表segment,小写是section,例如 __TEXT.__text,指的是__TEXT段的__text节. 先看section结构定义: 再看hopper中的__TEXT.__text 描述: 根据

[iOS逆向实战 之二]mov 和 mvn

个人原创,转帖请注明来源:cnblogs.com/jailbreaker 先看2段代码: 第一段代码main里面没有任何语句,第2段代码是返回0值,这2段代码的反汇编是一样的,看下图: 一共 2行汇编代码,第2行 bx lr 代表返回到main调用之后的语句,而第一行 movs是 mov的扩展,最后字母s代表影响标志位,从汇编代码可知,如果返回int类型,没有明显的 return 语句,那默认就是返回0(返回寄存器r0).(0x代表16机制) 接着修改代码为return  -1看下反汇编 ret

[iOS逆向实战 之九]重组mach-o格式实现简单反ida

个人原创,转帖请注明来源:cnblogs.com/jailbreaker 之前3篇大致讲了下mach-o的相关知识,这篇主要讲解如何通过对mach-o文件简单的更改达到反ida静态分析的目的,此篇目的是抛砖引玉,掌握mach-o格式可以按自己的思路去更改,做到防反汇编器. mach-o文件格式的节: 1.struct section { /* for 32-bit architectures */ 2.    char        sectname[16];   /* name of this

ios逆向过程中lldb调试技巧

在ios逆向过程中,善于运用lldb,会给逆向带来很大的方便 一般的命令: 1.image list -o -f  看看各个模块在内存中的基址 2.register read r0  读取寄存器r0的值.register read  读取所有寄存器的值 3.expression(或者缩写expr)  表达式 例子: expression $r6 = 1   // 设置r6寄存器的值 expression $r6       // 查看r6寄存器的值 expression username(源代码