iOS可执行文件的简单反ida

ida就不用我就废话了,这篇主要讲解如何通过对mach-o文件简单的更改达到反ida静态分析的目的。

先说一下mach-o文件格式的节。

?

?

  1. struct?section?{?/*?for?32-bit?architectures?*/??
  2. ????char????????sectname[16];???/*?name?of?this?section?*/??
  3. ????char????????segname[16];????/*?segment?this?section?goes?in?*/??
  4. ????uint32_t????addr;???????/*?memory?address?of?this?section?*/??
  5. ????uint32_t????size;???????/*?size?in?bytes?of?this?section?*/??
  6. ????uint32_t????offset;?????/*?file?offset?of?this?section?*/??
  7. ????uint32_t????align;??????/*?section?alignment?(power?of?2)?*/??
  8. ????uint32_t????reloff;?????/*?file?offset?of?relocation?entries?*/??
  9. ????uint32_t????nreloc;?????/*?number?of?relocation?entries?*/??
  10. ????uint32_t????flags;??????/*?flags?(section?type?and?attributes)*/??
  11. ????uint32_t????reserved1;??/*?reserved?(for?offset?or?index)?*/??
  12. ????uint32_t????reserved2;??/*?reserved?(for?count?or?sizeof)?*/??
  13. }; ?

属性的主要作用是告诉加载,本节要加载到内存的虚拟地址(addr),大小(size),及节在文件物理地址的偏移(offset)。

实际上mach-o文件格式详细的指导了加载器如何加载文件到内存,但是ios并没有完全按照格式来加载,对可执行文件合法性的验证只是做到了segment一层,对于节section一层并没有验证,加载器只是简单的将段地址线性的映射到内存,粒度很大,没有细化到节,所以节属性在加载的时候没有用,但是ida是个好学生,完全依靠mach格式来分析文件,bug就出现了。(实际上在win下,od也有类似的bug),那么下面我们来手动更改文件,达到ida不能加载,ios却能正常运行的效果。

实验1:更改节的物理地址偏移。

1,首先将文件拖到ida,我们看到TEXT段下面的2个节。

“__text"与"__stub_helper"

HEADER:0000408C DCB "__text",0,0,0,0,0,0,0,0,0,0; sectname

HEADER:0000408C DCB "__TEXT",0,0,0,0,0,0,0,0,0,0; segname

HEADER:0000408C DCD 0xAD00 ; addr

HEADER:0000408C DCD 0xD6938 ; size

HEADER:0000408C DCD 0x6D00 ; offset

HEADER:0000408C DCD 3 ; align

HEADER:0000408C DCD 0 ; reloff

HEADER:0000408C DCD 0 ; nreloc

HEADER:0000408C DCD 0x80000400 ; flags

HEADER:0000408C DCD 0 ; reserved1

HEADER:0000408C DCD 0 ; reserved2

HEADER:000040D0 DCB "__stub_helper",0,0,0; sectname

HEADER:000040D0 DCB "__TEXT",0,0,0,0,0,0,0,0,0,0; segname

HEADER:000040D0 DCD 0xE1638 ; addr

HEADER:000040D0 DCD 0xE88 ; size

HEADER:000040D0 DCD 0xDD638 ; offset

HEADER:000040D0 DCD 2 ; align

HEADER:000040D0 DCD 0 ; reloff

HEADER:000040D0 DCD 0 ; nreloc

HEADER:000040D0 DCD 0x80000400 ; flags

HEADER:000040D0 DCD 0 ; reserved1

HEADER:000040D0 DCD 0 ; reserved2

?

“__text”节的的内存加载地址为 0xad00,文件偏移为0x6d00

"__stub_helper"节的的内存加载地址为 0xE1638,文件偏移为0xDD638

2,我们将“__text”的的文件偏移更改为"__stub_helper"的文件偏移,修改后保持文件,继续拖到ida下分析,如下图:

?

HEADER:0000408C DCB "__text",0,0,0,0,0,0,0,0,0,0; sectname

HEADER:0000408C DCB "__TEXT",0,0,0,0,0,0,0,0,0,0; segname

HEADER:0000408C DCD 0xAD00 ; addr

HEADER:0000408C DCD 0xD6938 ; size

HEADER:0000408C DCD 0xDD638 ; offset

HEADER:0000408C DCD 3 ; align

HEADER:0000408C DCD 0 ; reloff

HEADER:0000408C DCD 0 ; nreloc

HEADER:0000408C DCD 0x80000400 ; flags

HEADER:0000408C DCD 0 ; reserved1

HEADER:0000408C DCD 0 ; reserved2

HEADER:000040D0 DCB "__stub_helper",0,0,0; sectname

HEADER:000040D0 DCB "__TEXT",0,0,0,0,0,0,0,0,0,0; segname

HEADER:000040D0 DCD 0xE1638 ; addr

HEADER:000040D0 DCD 0xE88 ; size

HEADER:000040D0 DCD 0xDD638 ; offset

HEADER:000040D0 DCD 2 ; align

HEADER:000040D0 DCD 0 ; reloff

HEADER:000040D0 DCD 0 ; nreloc

HEADER:000040D0 DCD 0x80000400 ; flags

HEADER:000040D0 DCD 0 ; reserved1

HEADER:000040D0 DCD 0 ; reserved2

?

两个节的物理偏移都为0xDD638。

双击“__text”节,进入代码的。如图:

可以看到左下角,物理地址为0xdd638,实际上这是错误的,物理地址应该为0x6D00。我们可以得出结论,ida直接使用了节的物理地址,偷懒了,实际上应该使用段地址来计算。

实验2:给节的物理偏移更改为一个远超文件大小的数。

HEADER:0000408C ; Sections

HEADER:0000408C DCB "__text",0,0,0,0,0,0,0,0,0,0; sectname

HEADER:0000408C DCB "__TEXT",0,0,0,0,0,0,0,0,0,0; segname

HEADER:0000408C DCD 0xAD00 ; addr

HEADER:0000408C DCD 0xD6938 ; size

HEADER:0000408C DCD 0xFFFFFFFF ; offset

HEADER:0000408C DCD 3 ; align

HEADER:0000408C DCD 0 ; reloff

HEADER:0000408C DCD 0 ; nreloc

HEADER:0000408C DCD 0x80000400 ; flags

HEADER:0000408C DCD 0 ; reserved1

HEADER:0000408C DCD 0 ; reserved2

?

更改后保存文件,拖到ida,如图:

时间: 2024-10-14 22:37:42

iOS可执行文件的简单反ida的相关文章

[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可执行文件瘦身方法

缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大,又因为AppStore会对可执行文件加密,导致可执行文件的压缩率低,压缩后可执行文件占整个APP安装包的体积比例大约有80%~90%,还是挺值得优化的.下面介绍一下在研究可执行文件过程中发现的可以优化的点.研究的过程使用了linkmap,linkmap的介绍跟生成可以参考另一篇文章—iOS可执行文

iOS可执行文件格式初探

Mach-O (Mach object) file format? 这种格式的中文资料很少,最详细的还是苹果的官方文档,本文不重复解释mach-o文件格式的内容,只叙述在用ida逆向ios应用程序时的经验. mach-o详细文档参考:https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachORuntime/index.html ?mach-o格式可以包含多个目标平台的可执行代码,比如同

iOS Block原理简析

Block的语法 Block是iOS闭包的实现方式,能够获取局部变量的匿名函数. Block的OC声明 返回值类型 (^Block变量名字)(参数列表) = (参数列表){}; 例子 int (^add)(int a,int b) = ^(int a, int b) { return a + b; }; int sum = add(1,4); NSLog(@"sum = %d",sum); NSString* (^getFullName)(NSString *first,NSStrin

iOS:知识点简答

1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memory leak. 2.数组和链表什么区别? 答:数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素. 链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起. 3.delegate和notification什么区别,什么情况使用? 答:Delegate:消息的发送者(sender)告知接收者(

iOS strong & weak 简析

不用arc的话strong weak 相当于: strong 用来修饰强引用的属性: @property (strong) SomeClass * aObject; 对应原来的 @property (retain) SomeClass * aObject; 和 @property (copy) SomeClass * aObject; weak 用来修饰弱引用的属性:@property (weak) SomeClass * aObject; 对应原来的 @property (assign) So

iOS编码规范(简版)

1. 总体指导原则 [规则1-1]首先是为人编写程序,其次才是计算机. 说明:这是软件开发的基本要点,软件的生命周期贯穿产品的开发.测试.生产.用户使用.版本升级和后期维护等长期过程,只有易读.易维护的软件代码才具有生命力,所以提倡写代码之前多思考,特别是逻辑复杂或者技术难点较高的地方,个人思考不清楚的,可以和团队成员进行沟通. [规则1-2]保持代码的简明清晰,避免过分的编程技巧. 说明:简单是最美.保持代码的简单化是软件工程化的基本要求.不要过分追求技巧,否则会降低程序的可读性. [规则1-

iOS 参考的简书作者

第三方框架 插件 博客:http://www.jianshu.com/p/e4ffa5808ad6 查阅的资料:http://www.jianshu.com/p/2c779b1d1102

iOS开发常用三方库、插件、知名博客等等

TimLiu-iOS   Swift版本点击这里 欢迎加入QQ交流群: 594119878 介绍 这是一个用于iOS开发的各种开源库.开源资料.开源技术等等的索引库. github排名 https://github.com/trending,github搜索:https://github.com/search 使用方法 根据目录关键字搜索,记得包含@,以保证搜索目录关键字的唯一性. 问题反馈 期待大家和我们一起共同维护,同时也期望大家随时能提出宝贵的意见(直接提交issues即可).请广大网友只