韦德国际1946英国 > 计算机网络 > 程序启动那些事,的一些笔记

原标题:程序启动那些事,的一些笔记

浏览次数:158 时间:2019-11-30

招来差别版本的SDK对iOS程序的震慑

欢迎加QQ群讨论:157672725

mach-o 格式文件

 

生机勃勃律的代码,使用不一致版本的SDK来编写翻译,会耳濡目染MachO头中的值, 进而使程序表现出分裂的外观。

iOS开荒中,main函数是我们以为的入口,但实在从程序运营到main方法被调用之间,还爆发了数不完事务。譬喻runtime的开头化、动态库的加载链接等。想要真正通晓程序运行,须求驾驭程序的内部布局。由此,本章将从解析程序的组织开始,到main函数被调用深入分析程序的启航。

mach-o 的文件类型

图片 1

image.png

能够在xnu源码中,查看到Mach-O格式的详实定义(https://opensource.apple.com/tarballs/xnu/)
EXTERNAL_HEADERS/mach-o/fat.h
EXTERNAL_HEADERS/mach-o/loader.h

代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIScreen *mainScreen = [UIScreen mainScreen];
    CGRect frm = [mainScreen bounds];
    UIWindow *win = [[UIWindow alloc] initWithFrame:frm];
    win.backgroundColor = [UIColor blueColor];
    self.window = win;
    [win release];
    [self.window makeKeyAndVisible];
    return YES;
}

图片 2ipa

mach-o 的中坚结构

图片 3

image.png

五个Mach-O文件蕴涵3个重大区域

  • Header
    文件类型、目的结构类型等

  • Load commands
    陈述文件在编造内部存款和储蓄器中的逻辑结构、结构

  • Raw segment data
    在Load commands中定义的Segment的庐山面目目数据

官方描述: https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/MachOTopics/0-Introduction/introduction.html

问题:

如上的代码特别轻便,未有其他作用, 分别选择 xcode v4.6.3 与 v5.0.2 编写翻译, 然后装置到iOS8的装置上,表现却今是昨非, 主要便是iOS6与iOS7之间关于状态条的反差,如下图: 图片 4__________图片 5
代码都以平等的,只是利用了差异的SDK进行编写翻译, 差距具体在哪个地方?

iTunesArtwork: 高分别率Logo,平日为JPG图像文件iTunesMetadata.plist:属性列表文件App:App的可施行文件

查看 mach-o 相关新闻的工具

  • file
    • file 文件路线
  • otool
    • 查看 mach-o 特定部分和段的剧情(具体可以选择 help 查看卡塔尔国
  • lipo
    • 对于多构造的 mach-o 文件管理 归总/导出/查看布局音信
  • MachOView
    • GUI 版本的 mach-o 文件消息查看器

说明:

xcode版本:4.6.3 VS 5.0.2 设备:黑莓 5s,iOS 8.0 可试行文件名: APIDiff-SDK61意味着使用iOS SDK 6.1 编写翻译出的可施行文件 APIDiff-SDK70表示使用iOS SDK 7.0编写翻译出的可实施文件 IPA文件名: APIDiff-SDK61.ipa表示iOS SDK 6.1编译出的安装包 APIDiff-SDK70.ipa表示iOS SDK 7.0编写翻译出的安装包

进程是独特文件在内部存款和储蓄器中加载得到的结果。这种文件必须利用操作系统能够领略的格式,那样操作系统工夫解析、创设信任、早先化并最早进行。这种特殊文件正是可履行文件。在UNIX中,大家可以运用chmod x将文件标记为可试行文件,但不能够确定保证该公文能够举办,因为标记只是报告操作系统内核将文件读入内部存款和储蓄器,然后搜索多少个头具名,这几个头签字平时称得上“魔数”。当文件读入时,通过“魔数”可补助剖断文件的二进制格式,假使是被扶植的二进制格式,才会调用加载器函数。种种平台都有友好的可实行文件格式,Mach-O则是 OS X 与 iOS 系统上的可试行文件格式。上面大家以QQ为例,依附MachOView来解析Mach-O文件。

Universal Binary(通用二进制文件, 也叫胖二进制文件 也叫 Fat Binary卡塔尔(قطر‎

还要适用于三种布局的二进制文件
满含了多样分裂布局的单身的二进制文件

注意

  • 因为须要仓储各个构造的代码,通用二进制文件平常比纯粹平台二进制的次序要大
  • 是因为二种结构有协同的少年老成部分能源,所以并不会落得单风度翩翩版本的两倍之多
  • 鉴于推行进度中,只调用某些代码,运营起来也无需万分的内部存款和储蓄器

分析:

在OS X上,可试行文件的标记有这么多少个魔数:

怎么着搜索系统动态库的可执行文件

从iOS3.1方始,为了坚实质量,绝大部分的体系动态库文件都卷入存放到了一个缓存文件中(dyld shared cache)
缓存文件路径:/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX

浅析生机勃勃:确认是可执路程序引起

证实际景况势:

用APIDiff-SDK70.ipa中的可执路程序替换APIDiff-SDK61.ipa中的可执路程序,

接下来接受codesign命令重新签名,

装进,安装到手机上后意识事态条是透明的,

证实差异确实在可执路程序中。

再也签字方法:

codesign -f -s 证书名 --resource-rules Payload/*.app/ResourceRules.plist Payload/*.app
  • cafebabe
  • feedface
  • feadfacf
  • ...cafebabe正是跨微处理机布局的通用格式,feedface和feedfacf则分别是某风姿浪漫甩卖器布局下的Mach-O格式。

什么样从动态库分享缓存抽出动态库

# 可以使用dyld源码中的launch-cache/dsc_extractor.cpp
# 将#if 0前面的代码删除(包括#if 0),把最后面的#endif也删掉

# 编译dsc_extractor.cpp
clang   -o dsc_extractor dsc_extractor.cpp

# 使用dsc_extractor
./dsc_extractor  动态库共享缓存文件的路径   用于存放抽取结果的文件夹

解析二:相比较二进制差异

既然如此在可推行文件中, 首先想到的是接纳二进制相比较工具来拜候相互的反差, 结果如下图:
图片 6

能够看见差距太大,那样比较没什么意思, 那条路不可行。

图片 7QQ Mach-O

Mac/iOS 系统怎么着加载动态库

利用/usr/lib/dyld 程序加载动态库

注意
dyld 只好加载以下两种mach-o文件

  • MH_EXECUTE
  • MH_DYLIB
  • MH_BUNDLE

dyld 归属 DILINKEEvoque 类型, 所以不可能协和加载本人

深入分析三:相比较代码差距

既然比较二进制没什么意思, 那大家就相比下反汇编代码, 看看是否编写翻译器做了怎么着动作,
图片 8

可以看出双方的代码大概一模二样, 具体的一些差异, 也是由分歧版本的编写翻译器变成的, 逻辑是相近的,因并非代码引起的程序外观差别。 其余,代码里不曾读什么全局变量, 表达不是因为UI基特中有怎么着私下认可值被编写翻译到程序中, 进而引起状态条的外观不一样。

Mach-O 三拾贰位魔数是 0xfeedfaceMach-O 陆12人魔数是 0xfeedfacfQQ帮忙ARM32&64于是能够看来八个Mach Header

应用程式 是从开辟到安装到手机的进程

工程 -> 编写翻译,链接,具名 生成.app (可施行文件由源代码生成卡塔尔(قطر‎ -> zip 压缩为 IPA 包

深入解析四:相比较UIKit版本号对前后相继的影响

既是代码未有异样,

小编们第一会想到是或不是出于UIKit版本不相同而引起的程序外观分裂。

虽说前后相继是动态链接的UIKit,

同有时候配备上独有两个本子的UI基特库,

只是大家依旧要注脚下。

首先明确双方的歧异,如下图:
图片 9

能够看看两方的版本号确实有反差, 不过同盟版本都以1.0, 理论上讲不是因为这些造成程序差距。 理论是论战,大家前几天正值选择清除法鲜明难题原因, 照旧要实打实的验证。 验证方法:将APIDiff-SDK61中的UIKit版本号改成2903.23.0。 改善章程:这些值在二进制文件中的偏移为:0x6EC, 必要专心下小端难点。 校正后,重新具名,打包安装到手机上, 发掘事态条未有发生变化, 由此原因不是UIKit版本号的差异。

图片 10Mach-O 32图片 11Mach-O 64图片 12Match-O

逆向的思路

  • 分界面深入分析

    • Cycript、
    • Reveal
  • 代码深入分析
    对Mach-O文件的静态剖判

    • MachOView、
    • class-dump、
    • Hopper Disassembler、
    • ida等
  • 动态调治
    对运营中的APP举行代码调节和测量试验

    • debugserver、
    • LLDB
  • 代码编写

    • 流入代码到应用软件中
    • 必备时还或者需求重新具名、打包ipa

拆解深入分析五:使用MachOView逐项比较

走到这里,多少有些江淹才尽了,

主题素材就在这里而我们却找不到原因。

那就上最原始的工具:体力劳动,使用MachOView后生可畏项风流浪漫项的对照。

从__LINKEDIT

--->LC_DYLD_INFO_ONLY

--->LC_LOAD_DYLINKER

--->LC_VERSION_MIN_IPHONEOS

在LC_VERSION_MIN_IPHONEOS中发觉了四个保留值的分裂:
图片 13

倍感有望那正是主题材料的缘由, 举行表明:校勘APIDiff-SDK61,偏移地址0x69C, 将值改为00070000, 重新签字,打包安装到手机, 开掘事态条产生透明了,难点就在那!

  • Header:CPU类型和子类型、文件类型、加载命令的条数和分寸、动态连接器标记等
  • LoadCommands:加载命令。举个例子文件的段与经过地址映射、 调用dyld、开启Mach线程等
  • Data:数据

任何的小手艺

  • 将可实践文件复制到/usr/local/bin 目录下,zsh 会有智能提示
  • zshrc 文件的方式定义与 shell 相近, 获取格局参数 使用$1 来获取第八个, $2赢得第四个 ,依此类推
  • killall SpringBoard 能够用来重启桌面

本文由韦德国际1946英国发布于计算机网络,转载请注明出处:程序启动那些事,的一些笔记

关键词: iOS 进阶 程序

上一篇:韦德国际1946英国:HTML5应用开发,移动站点APP化

下一篇:没有了