应用安全

MachO文件结构详解

MachO概念

在可安装的每一个.app包中,都有一个与app同名可执行文件。如图:

image.png

// 给MachO文件上执行权限
// 拿到MachO文件的路径
APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
//上可执行权限
chmod +x "$TARGET_APP_PATH/$APP_BINARY"

.MachO其实是Mach Object文件格式的缩写,是Mac以及iOS上可执行文件的格式,类似Windows上的PE格式(Portable Executable),linux上的ELF格式(Executable and Linking Format)
苹果官方文档中列举了MachO的文件类型,如图:

image.png

MachO实际上是通用的二进制文件(Universal binary)----苹果公司提出的一种程序代码,能同时适用多种架构的二进制文件。同一程序包中同时为多种架构提供最理想的性能。需要存储多种代码,通用二进制文件通常比单一平台二进制的程序要大,但因为有共通的非执行资源,所以不会达到单一版本的几倍之多。而且执行时只调用一部分代码,运行起来也不需要额外的内存。

lipo命令

1.使用lipo -info查看MachO文件包含的架构 armv7 armv7s arm64
lipo -info MachO文件
2.使用lipo -thin拆分某种架构
lipo MachO文件 -thin 架构 -output 输出文件路径
3.使用 lipo -create合并多种架构
lipo -create MachO1 MachO2 -output 输出文件路径

MachO内部结构

image
  • Header (头部)
    包含该二进制文件的一般信息。字节顺序、架构类型、加载指令的数量等。可以快速确认一些信息,如当前文件使用32位还是64位,对应的处理器是什么、文件类型是什么等
//32位架构
struct mach_header {
    uint32_t    magic;      /* mach magic number identifier */
    cpu_type_t  cputype;    /* cpu specifier */
    cpu_subtype_t   cpusubtype; /* machine specifier */
    uint32_t    filetype;   /* type of file */
    uint32_t    ncmds;      /* number of load commands */
    uint32_t    sizeofcmds; /* the size of all the load commands */
    uint32_t    flags;      /* flags */
};

//64位架构
struct mach_header_64 {
    uint32_t    magic;      /* mach magic number identifier */
    cpu_type_t  cputype;    /* cpu specifier */
    cpu_subtype_t   cpusubtype; /* machine specifier */
    uint32_t    filetype;   /* type of file */
    uint32_t    ncmds;      /* number of load commands */
    uint32_t    sizeofcmds; /* the size of all the load commands */
    uint32_t    flags;      /* flags */
    uint32_t    reserved;   /* reserved */
};

magic:魔数,用于快速确认该文件用于64位还是32位
cputype:CPU类型,比如 arm
cpusubtype:对应的具体类型,比如arm64、armv7
filetype:文件类型,比如可执行文件、库文件、Dsym文件
MH_EXECUTE,代表可执行文件
ncmds :加载命令条数
sizeofcmds:所有加载命令的大小
reserved:保留字段
flags:标志位

  • LoadCommands (加载命令)
    用于告诉loader如何设置并加载二进制数据
// 将文件的32位或64位的段映射到进程地址空间
#define LC_SEGMENT  0x1 
#define LC_SEGMENT_64   0x19    

// 唯一的 UUID,标示二进制文件
#define    LC_UUID      0x1b    /* the uuid */

// 启动动态加载连接器
#define    LC_LOAD_DYLINKER 0xe /* load a dynamic linker */

// 代码签名和加密
#define    LC_CODE_SIGNATURE 0x1d   /* local of code signature */
#define LC_ENCRYPTION_INFO 0x21 /* encrypted segment information */
  • Data (数据段 segment)
    存放数据:代码、字符常量、类、方法等
    可以拥有多个segment,每个segment可以有零到多个section。每个段都有一段虚拟地址映射到进程的地址空间

  • Loader Info (链接信息)
    一个完整的用户级MachO文件的末端是一系列链接信息。其中包含了动态加载器用来链接可执行文件或者依赖所需使用的符号表、字符串表等

以上部分参考文章:
https://juejin.im/post/5c67e7efe51d45164c75993b

苹果签名双向验证原理

代码签名是指对可执行文件或脚本进行数字签名。用来确认软件在签名后未被修改或损害的措施。和数字签名原理一样,只不过签名的数据是代码而已。

简单的代码签名在iOS出来以前,以前的主流操作系统(Mac/Windows)软件随便从哪里下载都能运行,系统安全存在隐患,盗版软件,病毒入侵,静默安装等等,那么苹果希望解决这样的问题,要保证每一个安装到iOS上的APP都是经过苹果官方允许的,怎样保证呢?就是通过代码签名。如果要实现验证,其实最简单的方式就是通过苹果官方生成非对称加密的一对公私钥。在iOS的系统中内置一个公钥,私钥由苹果后台保存,我们传APP到AppStore时,苹果后台用私钥对APP进行签名,iOS系统下载这个APP后,用公钥验证这个签名,若签名正确,这个APP肯定是有苹果后台认证的,并且没有被修改过,也就达到了苹果的需求:保证安装的每一个APP都是经过苹果官方允许的。

除上传到AppStore外,苹果还有那些需求?

  • 安装包不需要上传到Ap pStore,可以直接安装到手机上
  • 苹果为了保证系统的安全性,又必须对安装的APP有绝对的控制权
    • 经过苹果允许才可以安装
    • 不能滥用导致非开发APP也能被安装

为了实现这些需求,iOS签名的复杂度也开始增加,即双层签名

双层签名过程如下:(开发者认证的安全性)


屏幕快照 2019-07-04 下午1.16.18.png

⚠️思考:如果单纯的只是如上验证,所有的手机都可以安装APP?--------由此描述文件应运而生.

屏幕快照 2019-07-04 下午1.31.22.png

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,941评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,397评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,345评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,851评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,868评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,688评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,414评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,319评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,775评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,945评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,096评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,789评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,437评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,993评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,107评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,308评论 3 372
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,037评论 2 355

推荐阅读更多精彩内容