美文网首页
六、初识Mach-O

六、初识Mach-O

作者: Lovell_ | 来源:发表于2018-11-28 23:02 被阅读21次

一、ipa了解
是个压缩包,解压后

image.png

二、逆向app思路;

  • 界面分析

    • Cycript:通过命令行查看界面的组成情况,子控制器的结构,子view的结构,控制器拥有的所有方法、成员变量;
    • reveal:看到所有UI控件
  • 代码分析

    • 对Mach-O文件的静态分析(不运行,只看文本)
    • MachOView、class-dump、Hopper Disassembler、ida等

通过代码分析可以大概知道他的代码是怎么写的了,接下来动态调试。

  • 动态调试(这样才能知道他的每一行代码真正是干什么的)

    • 对运行中的APP进行代码调试
    • debugserver、LLDB
  • 代码编写

    • 注入代码到APP中
    • 必要时还可能需要重新签名、打包ipa

三、class-dump

  • 顾名思义,它的作用就是把Mach-O文件的class信息给dump出来(把类信息给导出来),它只能生成对应的.h头文件
  • 官方地址:http://stevenygard.com/projects/class-dump/
  • 下载完工具包后将class-dump指令文件复制到Mac的/usr/local/bin目录,这样在终端就能识别class-dump命令了
class-dump指令文件

tips:Mac终端的原理:
当我们在Mac终端敲指令的时候,它是去/usr/bin/usr/local/bin文件夹下找,那里有非常多的指令,我们敲的指令都是从这个文件夹下找。

但是貌似从Mac10.11开始/usr/bin目录就算有管理员权限也不能写,所以只能把class-dump放到/usr/local/bin目录下,放完后,在命令行敲class-dump的命令就有反应了。

/usr/local/bin目录没有放入class-dump文件 /usr/local/bin目录放入class-dump文件



四、实战:使用dump-class指令导出ipa的.h头文件信息

1、得到一个ipa文件;
如何得到一个ipa:1、iTunes 12.6之前的版本;2、手机越狱;3、有源码直接用XCode编译打包;4、(可用)Mac端PP助手下载;5、(可用、推荐)Mac安装iMazing,只要是通过iMazing更新或下载的,就可以导出ipa,iMazing还可以从AppStore上添加app。

取出ipa iMazing从AppStore上添加app iMazing导出ipa

2、解压ipa,显示app包内容找到Mach-O文件,复制出来。

解压ipa 显示app包内容找到Mach-O文件

3、导出头文件内容

3.1 dump Mach-O文件(我尝试了dump那个.app也可以,无需在包内容中找Mach-O文件):
class-dump /Users/kyo/Desktop/腾讯课堂/pmes
所有头文件内容都显示在终端中,不方便看。

3.2 把头文件内容出到文件夹
class-dump -H Mach-O文件路径 -o 头文件存放目录

结果

把『pmes头文件』文件夹拖拽到sublime中,即可如下图查看各个.h文件,command + p 筛选文件名:



《踩坑》 疑问:网易云音乐的app到处的头文件只有一个CDStructures.h,而且里面没什么内容??很奇怪。。。
网络解答
class-dump不能直接将AppStore上的app的头文件导出来,你只会导出CDStructures.h这个头文件,而这里边基本是没有信息的。相当于Apple在app上加了一层壳(加密了),需要把这层壳砸破。(Dumpdecrypted破壳)

所以,想要直接用class-dump把头文件导出来,必须是未经加密的,比如XCode刚编译打包过的,上面的头文件是别人发给我的一个XCode编译打包好的ipa,并未上传到AppStore。



五、代码的编译过程

不同的OC代码,编译出来的汇编代码可能是一样的

六、Hopper01——简单使用

Hopper Disassmbler能够将Mach-O文件的机器语言代码反编译成汇编代码、OC伪代码或者Swift伪代码。

把Mach-O文件拖拽至Hopper Disassembler。(这里的Mach-O是自己的项目用XCode编译好的Mach-O文件,没有上传到AppStore)
利用Hopper可以知道每个文件,每个方法,大概在干什么。

Dcamp Mach-O文件

七、Hopper02-UIKit伪代码分析

比如我们想知道,
UIView的一些方法的内部实现,或者UIViewController一些方法的内部实现;或者验证以前的一些想法。

那么UIKit在哪里呢?

寻找一:

显示XCode包内容看看/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/UIKit.framework

Frameworks文件夹下有很多框架,UIKit也在其中,但是UIKit框架中并没有.m文件或者二进制的Mach-O实现文件。

image.png

把UIKit.tbd拖拽到sublime中查看:

是在手机中的/System/Library/Frameworks/UIKit.framework/UIKit位置,连上越狱iPhone,用iFunBox位置。

然而并没有UIKit的Mach-O文件

寻找二:借助Cycript工具

寻找三:

UIKit其实是放在动态库共享缓存中(dyld shared cache)

动态库在手机的这个地方/System/Library/Caches/com.apple.dyId/,复制到Mac。

UIKit所在处

就在dyld_shared_cache_arm64中

到此为止,就找到UIKit的Mach-O了。

说说 动态库共享缓存(dyld shared cache)

ARM处理器指令集架构目前有4种

为什么寻找二的路径中没有呢,因为在Mac\iOS中,是使用了/usr/lib/dyld程序来加载动态库

/usr/lib/dyld程序

当我们去链接寻找二的路径的时候,该路径会传给/usr/lib/dyld程序,dyld就会去动态库共享缓存中,如果没找到就会去其他地方找。

dyld有两种说法:
1 . dynamic link editor,动态链接编辑器
2 . dynamic loader,动态加载器

dyld源码
https://opensource.apple.com/tarballs/dyld/

load函数 load函数逐步调用的阶段 动态分享库的格式

如何把dyld_shared_cache_arm64分解呢?网上有很多工具,但都不推荐,推荐用苹果官方的,在dyld源码的dsc_extractor.cpp中抽取。

dsc_extractor.cpp

dsc:即dyld shared cache,动态分享库;
extractor:提取、抽取;
dsc_ extractor:动态分享库抽取。

如何使用

接下来把extractor.cpp编译成可执行文件,再用命令行形式调用里面的功能。
1 . 拷贝extractor.cpp到新建文件夹下,对extractor.cpp稍作处理:将#if 0上面的代码删除(包括#if 0),把最后面的#endif也删掉;(因为if 0 表示永远不会执行)
2 . 进入到extractor.cpp文件夹下,执行clang++ -o dsc_extractor dsc_extractor.cpp,把launch-cache/dsc_extractor.cpp
编译成可执行文件:参考自己的文章把C文件编译成可执行文件

编译成可执行文件

3 . 如何使用dsc_extractor抽取动态库呢?在dsc_extractor.cpp的main函数中已经告诉我们该怎么使用命令:usage: dsc_extractor <path-to-cache-file> <path-to-device-dir>\n,因为dsc_extractor不在/local/bin/中,所以可执行文件的路径要写清楚。

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

直接把这三部分拖拽进终端,回车即可。

armv7s构架下UIKit的Mach-O

这就是借助dyld源码dsc_extractor这个工具从共享缓存中抽取出所有的动态库。网上也有其他的工具,但不好使,比如jtool,抽取出来的动态库的文件会比官方工具抽取出来的偏大。

注意,上面抽取的是armv7s,如果是arm64,按上面的方法则不行:

抽取arm64报错

开始看UIKit的实现源码

拖拽到Hopper,选择UIKit:

点下一步,等右下角的working消失后就可以操作了:

分析下loadView这个方法在什么时机调用了:

八、遗留问题:

问题1:

有的同学敲 sh usb.sh(即tcprelay.py文件),发现Python文件不好使,端口映射不成功,可换成使用itnl文件

由于itnl文件不是在/usr/local/bin目录中,所以,要指定itnl的文件路径:

itnl文件路径 --iport 22 --lport 10011
iport:i-iPhone,port-端口;
lport:l-local本机Mac,port-端口;

连接手机成功 密码登录成功

所以,如果在使用Python脚本的时候出现了usb的问题,可以使用这个itnl工具来连接。

问题2:

用Cycript导入某个框架
比如:MJLoadFramework("Photos")

相关文章

  • 六、初识Mach-O

    一、ipa了解是个压缩包,解压后 二、逆向app思路; 界面分析Cycript:通过命令行查看界面的组成情况,子控...

  • Mach-O初识

    Mach-O是Mach object的缩写,是Mac\iOS上用于存储程序、库的标准格式属于Mach-O格式的文件...

  • 初识Mach-O文件

    详细版本 https://www.yuque.com/docs/share/077aaf76-0fe6-47da-...

  • 初识Mach-O文件

    前言:本文旨在介绍iOS中的Mach-O文件。 一、介绍 Mach-O是一种文件的格式(可执行文件的格式,比如图片...

  • iOS逆向(五)初识Mach-O

    转载小码哥ppt,方便个人查阅,如有侵权,随时联系删除。

  • IOS Mach-o 文件的解析

    导论 Mach-o 文件图解 Mach-o 文件中专有名词解释 Mach-o 文件中函数存储地址 Mach-o 文...

  • Mach-O与Xcode编译环境配置

    什么是Mach-O? Mach-O[https://zh.wikipedia.org/wiki/Mach-O](M...

  • Mach-O初探和链接

    Mach-O初探和链接 1、Mach-O定义 Mach-O(Mach Object)是macOS、iOS、iPad...

  • 六:mach-O文件

    定义: Mach-O 为Mach object文件格式的缩写,他是一种用于可执行文件,目标代码,动态库文件格式。作...

  • 初识六

    苏钰还在后怕,但还是把手放了上去,一边还心不在焉地想:虽然有些凶,但人还不错啊。 南擎宇握住他花苞儿似的五指,心里...

网友评论

      本文标题:六、初识Mach-O

      本文链接:https://www.haomeiwen.com/subject/ugmeqqtx.html