我如何在iOS上发现Instagram即将推出的视频通话功能

昨天,我设法在Instagram上获取了一些视频通话UI的屏幕截图。 这就是那件事的故事。 我认为该过程的描述对于对逆向工程感兴趣以发现隐藏特征的人将非常有用。

它总是始于谣言或其他发现。 昨天,我们在9to5mac上发布了一个故事,讲述某人在Instagram的Android应用中发现了与进行视频通话相关的资产,而该功能是Instagram目前不提供的功能。 那吸引了我的注意力,我想知道是否可以在iOS上找到相同的东西。

注意:9to5mac帖子中嵌入了我由以下所述过程引起的有关iOS功能的推文,请记住,它最初是针对Android的谣言。

我做的第一件事是使用iMazing从App Store下载Instagram的IPA。 您可能已经知道,IPA文件只是一个zip文件,因此要提取其内容,只需将扩展名从.ipa更改为.zip。 我在Instagram.app包中查找了可能指示视频通话功能的所有资产。 可以使用Spotlight或在终端中使用find命令来完成。 自然,我寻找名称中带有“ videocall”或“ videochat”的文件,但找不到任何东西。 然后,我使用Asset Catalog Tinkerer打开Assets.car文件,并在其中查找任何内容。

由于搜索资产并没有取得成功,因此该研究二进制文件了。 我们正在谈论的是App Store应用,因此第一步是解密二进制文件。 与Apple的内置应用程序不同,从App Store下载的应用程序的二进制文件经过加密,并且只能在iOS设备上运行时才能解密,此过程只能越狱。 因此,我得到了方便的越狱iPhone 5S,将其连接到它,然后继续对该应用程序进行解密。

在越狱设备上解密二进制文件的过程如下:

– SSH进入越狱设备
–运行目标应用

查找目标应用程序的PID:

使用bfinject将解密dylib注入目标进程,然后等待该进程完成:

之后,我使用netcat在Mac上下载了解密的IPA:

然后我将其重命名为.zip并从Payload文件夹中提取Instagram.app:

好的,现在我有了一个解密的Instagram版本,求你了!

我通常首先将二进制文件加载到Hopper中,但是Instagram的可执行文件高达50mb(!),因此我知道解析和反汇编将花费很长时间。 考虑到二进制文件的大小,我决定先进行字符串搜索,然后再对找到的内容进行跟踪。 请记住,在这一点上,我不确定我什至找不到任何东西,因此,花费所有时间(和CPU功率)分解二进制文件却一无所获是没有道理的。

从二进制文件中提取字符串是这样的:

这仅在解密的二进制文件中可行,因为加密版本将仅提供无意义的垃圾。

注意,我通过管道将strings命令的输出进行排序,然后将其输出到名为Instagram_34.txt的文件中。 我这样做是因为,如果需要的话,以后可以在版本之间进行区分。 排序意味着要比较的两个文件将更稳定,从而导致比较有用的差异。 对文件名进行版本控制意味着我始终知道字符串来自哪个版本。 在这种情况下,这是没有必要的,因为我没有做任何比较,但是在将来Instagram发布新版本并决定检查更改后,这可能会很有用。

准备好字符串文件后,就可以在该文件中搜索可以指示视频通话功能的内容。 抓取“视频通话”后发现:

只是摘录,还有很多其他的“视频通话”字符串。 因此,现在我知道他们肯定正在开发某种视频通话功能。

我可以在这里停下来,发布此消息并入睡。 但是,如果我可以实际运行该视频通话代码以观看实际操作该怎么办? 🤔

运行代码

要在我无法控制的应用程序中运行任意代码,我可以附加一个调试器然后从那里去,但这并不有趣,所以我决定使用Cycript!

Bfinject内置Cycript:

现在,我可以将Mac上的Crycript控制台连接到我的iPhone 5S上Instagram内部运行的cycript,不是很酷吗?

如您所见,一旦我将Cycript控制台连接到iPhone上的Instagram,就可以运行ObjC代码并执行所需的任何操作。 但是我怎么知道要运行哪个代码?

类转储

与大多数iOS应用程序一样,Instagram是用Objective-C编写的。 这意味着您可以通过在解密的二进制文件上运行class-dump来转储其类的头:

然后,我在TextWrangler中打开Instagram.h文件,并再次查找“视频通话”,直到发现我认为可以使用的东西:

方法名称“ presentVideoCallViewControllerWithSessionId:”听起来很有希望。 它在名为“ IGDirectThreadViewController”的“ UIViewController”子类中实现。 从名称来看,我猜想它是当您与某人聊天时负责直接消息视图的视图控制器。 因此,我在应用程序中打开了该屏幕:

然后,我遍历了视图控制器层次结构以查找IGDirectThreadViewController的活动实例。 由于某种原因,Cycript的便捷的select()函数对我不起作用。

然后我调用了“ presentVideoCallViewControllerWithSessionId:”方法。 它带有一个参数(一个会话ID),我猜想它是一个字符串,只是传递了一个空的,以查看会发生什么:

答对了!

该功能实际上并没有起作用,但是至少我可以抓取一个截图,证明它正在进行中。 在处理未宣布和/或未发布的隐藏功能时,这种情况经常发生:您设法激活了该功能,但实际上并没有用。

我希望这篇文章对我如何在iOS软件中寻找未发布的功能提供一些有用的见解,如果您喜欢我的工作并且希望看到更多类似的内容,那么可以在Patreon上为我提供支持。 确保也关注我在9to5mac上的帖子。