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

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

objc是完全面向对象的语言,所以逆向的重点就是逆向类,这篇帖子通过ida的神奇的f5功能,来逆向某个对象的创建。

我们直接看ida中的main方法的逆向出来的arm代码:

基本上看不出所以然,我们使用ida的f5分析得出c语法的伪代码如下:

提一下,我在源码中,把自动内存管理ARC关掉了,为的是让代码更整洁。

在 8,9行都看到objc_msgSend,这个objc_msgSend其实是编译器生成的代码,在源码中没有的,objc调用实例方法其实是动态的通过消息传递,只有在runtime的时候才能确定到底给哪个method去处理,也就是说编译期间根本无法确定函数地址。

objc_msgSend函数至少包括2个参数,第一个参数类型是id,也就是范型class,可以传递任何class;第2个参数类型是SEL,selector,暂时可理解method的字面声明,后面的帖子里会详细讲到selector。从第3个开始后面的参数就是SEL所指method需要的具体参数,本例中都只有2个参数。

最后看一下main 的源码:

时间: 2024-10-23 09:15:00

[iOS逆向实战 之四]创建objc对象的相关文章

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

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

[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  

iOS runtime实战应用:关联对象

在开始之前建议先阅读iOS runtime的基础理解篇:iOS内功篇:runtime 有筒子在面试的时候,遇到这样一个问题:"如何給NSArray添加一个属性(不能使用继承)",筒子立马蒙逼了,不能用继承,难道用分类?但是分类貌似只能添加方法不能添加属性啊,筒子百思不得其解,直到后来接触到了runtime才恍然大悟. 什么是关联对象 关联对象是指某个OC对象通过一个唯一的key连接到一个类的实例上.举个例子:xiaoming是Person类的一个实例,他的dog(一个OC对象)通过一根

[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(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逆向实战 之九]重组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逆向实战 之七]看懂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逆向实战 之二]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