Messier - 简单易用的Objective-C方法跟踪工具


#1

Messier 可以用来跟踪iOS应用的Objective-C方法调用。在越狱设备上可以跟踪任意应用,在非越狱设备上也可用于跟踪调试中的应用。

背景

一般情况下使用Instruments(主要是Time Profiler)进行iOS 应用的性能分析就足够了,但是Time Profiler 把调用方法都合并了起来,失去了时序的表现。直到有一天看到Android开发的同事使用 systrace 分析性能,systrace生成一个html文件,把函数(方法)的调用耗时按照先后顺序表现出来。心里想:要是iOS也有这样的工具就好了。了解到这个html文件是 catapult 生成的。

一天看到iosre论坛一篇hook objc_msgSend的帖子。突然想到,可以结合catapult来生成Objective C方法的性能分析图(暂且这么叫吧)。(虽然一直也有hook objc_msgSend的方法,但这次煮好的佳肴终于忍不住下手了)。

于是经过一番努力,AppleTrace 于2017年9月份诞生了。在使用AppleTrace的过程中,我曾经写过四篇文章介绍他:

  1. AppleTrace 性能分析工具
  2. AppleTrace 搭配 MonkeyDev Trace任意App
  3. 使用 Cydia 安装 AppleTrace Tweak
  4. 使用AppleTrace探索SpringBoard

在使用AppleTrace的过程中,感受到AppleTrace还不够简单易用,尤其是:

  1. 不能在视觉感受上定义开始和结束点。例如点击某个按钮之前开始Trace,按钮点击完成后停止Trace。
  2. 获取trace文件太麻烦,需要手动从沙盒复制出来,然后执行merge.py,再执行trace2html(可选),最后打开trace文件。

当工作只需要Trace某一个应用时,AppleTrace几乎满足了要求,然而当好奇心增强,想看越来越多的应用时,啰嗦的“手动”操作就有点麻烦了。

Messier 诞生

为了解决AppleTrace的易用性问题,我在AppleTrace的基础上开发了Messier应用(官方网站 https://messier.app/)。使用Messier可以方便的在越狱设备上Trace任意应用,且能更方便的在视觉上自定义Trace的开始点和结束点。

Messier由三个部分组成。

  1. Tweak(越狱插件)
  2. Dylib(动态库 messier.framework)
  3. 桌面端(Messier.dmg)

下面是相关截图:

最新Build

最新Build的文件在这里下载

使用方法

第一步,安装macOS客户端

这里 下载安装最新的macOS客户端 Messier.dmg

第二步,越狱设备配置

(1)安装

  1. 打开 Cydia.
  2. 点击 Sources -> Edit -> Add.
  3. 输入 https://messier.app/cydia , 点击 Add Source. 重新加载后会看到 Messier Repo.
  4. 进入 Messier Repo, 安装Tweak Messier. (注意:Messier tweak 依赖 PreferenceLoaderAppList,所以需要先确保这两个Tweak已经安装)

(2)配置

打开系统的设置,向下滑动可以看见Messier(Developer下面),点击进入即可开始配置,如下图。

Enabled Applications 打开后如下图,可设置需要Trace的应用。

Trace On App Boot 配置是否在应用启动时就开始记录方法,默认启用。

Inline Hook (HookZz) 是否使用Inline Hook,默认启用。Inline Hook使用了HookZz来完成。

Main Thread Methods Only 是否只记录主现场的方法调用,默认关闭。

Disable App Applications 是否关闭所有应用的方法记录,默认关闭。若启用后,Enabled Applications的配置将失效。

第二步,非越狱设备配置

非越狱使用,就是在由自己源码或者MonkeyDev的环境下进行,需要对Xcode工程配置。

注意:首先要说明的是,目前Messier只支持arm64,因此只能使用arm64的真机

这里 下载解压后得到messier.framework

  1. 拖拽 messier.frameworkXcode Targets -> Build Phases -> Link Binary With Libraries.
  2. 点击 New Copy Files Phase 添加 Copy Files 步骤, 拖拽 messier.framework 进去 ,配置 DestinationFrameworks.

如下图配置:

这种情况下如果需要进行一些参数配置,可以在 Project Scheme -> Run -> Arguments, 设置 Environment Variables

MessierEnableOnAppBoot : true | false
MessierInlineHook : true | false
MessierMainThreadMethodsOnly : true | false

例如:

第三步,开始Trace

打开macOS客户端,此时会提示等待连接,如下图:

使用USB连接线连接iPhone和Mac电脑,打开配置好的要Trace的应用,运气好的话,应用不会Crash,并且macOS客户端会显示已经连接。(如果运气不好,应用Crash了,可以按照上文配置中的说明,关闭InlineHook)

当Trace结束,点击Stop,然后点击Fetch,如果运气好的话,一番文件传输后,会使用Finder定位到trace.json文件,如下图:

第四步,查看结果

打开Chrome浏览器(或者Chromium系列),进入chrome://tracing

image

把上一步产生的trace.json拖拽进去。

奇妙的结果诞生了。

此时,可以使用w a s d 来浏览这个文件了。详细使用方法可以点右上角的问好,如图:

支持

目前理论上支持 >= iOS10 的系统。

我只是测试了iOS10和iOS12的少部分应用的Trace,如果遇到问题,大家随时反馈。

开源和授权

开源

Messier是免费但闭源的。Messier的核心仍然是AppleTrace,因此核心仍然是开源的。除此之外,还要感谢以下三个仓库。

授权

Messier是免费的(或者半年,或者永久),使用此软件的唯一条件是:微信关注订阅号首先很有趣。这是我个人维护的订阅号,之前分享了一些iOS应用启用速度优化和逆向工程的文章,目前正在专注于《Practical Modern C++》和一些应用逆向工程的基础知识分享,未来不会设限,任何我感兴趣的内容都会分享。

image

讨论群

欢迎加群讨论 https://messier.app/group

总结

任何软件的开发都是个艰辛的过程,核心功能有了,但为了更容易的使用这个核心,周边的辅助设施代码要写很多。此次开发Messier让我感触颇深。很多软件,能用好用 真的是还要努力很多。 从0到1难,从1到100更难。

再次附上Messier的官方网站: https://messier.app/

Thank you for reading :slight_smile:


#2
  • OwO -

#3

太强了。。。


#4

:clap:太强了