[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。

先将目标文件拖进hopper,我这里针对的是ARMv7架构的分析,选择显示segment list:

然后选择第一行,到达mach-o header区域:

ide中间显示如下:

hopper的注释已经比较详细了,在xcode下,打开mach-o/loader.h ,看下header结构的定义:

根据以上2图,对应分析:

1.magic,是mach-o文件的魔数,0xfeedface代表的是32位,0xfeedfacf代表64位

2.cputype和cupsubtype代表的是cpu的类型和其子类型,有点拗口,直接看mach/machine.h中的定义,例子中分别是c和9,定义如下:

#define CPU_TYPE_ARM((cpu_type_t) 12)

#define CPU_SUBTYPE_ARM_V7((cpu_subtype_t) 9)

加载文件的时候hopper 提示选择架构类型,就是ARMv7

3.接着是filetype,例子中的值是2,代表可执行的文件

#defineMH_EXECUTE  0x2/* demand paged executable file */

4.ncmds 指的是加载命令(load commands)的数量,例子中一共23个,编号0-22

5.sizeofcmds 表示23个load commands的总字节大小, load commands区域是紧接着header区域的。

6.最后个flags,例子中是0x00200085,按位拆分,对应如下:

#defineMH_NOUNDEFS0x1/* the object file has no undefined  references */

#define MH_DYLDLINK0x4/* the object file is input for the

dynamic linker and can‘t be staticly

link edited again */

#define MH_TWOLEVEL0x80/* the image is using two-level name

space bindings */

#define MH_ALLOW_STACK_EXECUTION 0x20000/* When this bit is set, all stacks

in the task will be given stack

execution privilege.  Only

至此,mach-o的header区域分析完毕了。

时间: 2024-10-10 15:09:43

[iOS逆向实战 之六]看懂mach-o(1)的相关文章

[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逆向实战 之三]函数之基本类型(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逆向实战 之一]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格式实现简单反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逆向实战 之二]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逆向实战 之十]动态调试利器---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逆向分析——GL脚本的提取

总结:要逆一个程序必须清楚地知道程序的结构和常用的API函数,不清楚一个程序而去逆出结果是不可能滴 首先是glsl脚本运行的全过程,第一步是为shader的运行创建一个容器GLuint glCreateProgram(void),第二步是把编译好的shader附加到程序void glAttachShader(GLuint program, GLuint shader),编译好的shader可以是多个所以第二步可以重复多步把每一个编译好的一一附加到程序,顶点shader和像素shader一一成对,