iOS上的Snapchat检测

2020-07-07 22:07:38

在此之前,我们查看了Snapchat在Android上的根检测方法。这一次,我们来看看他们是如何在iOS上检测越狱、调整和挂钩的。

这是您尝试使用检测到的调整登录时看到的消息,尽管并不是所有的调整都会触发此消息。触发此消息的两个示例是Flex3和Wraith。有些人只是标记你的账户,如果你不走运,你会在稍后的禁令浪潮中被禁止。

显然,我们首先要关注的是,到目前为止,这个社区试图隐藏的是什么?如果你在谷歌上搜索一下,很可能会得到这些结果。对于其中的几个,我将列出最值得注意的特性。

只有当你能找到更新版本并且不想在Snapchat上使用调整功能时,才能使用NoSub(或变体)。

但似乎没有人知道Snapchat到底在做什么来检测一切。这就是我写这篇文章的原因。我只看到一个公开的努力来解决这个问题,那就是幻影(Phantom)的开发者可口可乐(CokePokes)。

当您启动应用程序时,它们使用运行所有检查的pthreadcreate创建一个新线程。在这些检查结束时,会存储一个整数,其中包含设备上检测到的所有内容的标志。然后,其中一些检查每31秒运行一次。

为这些检查执行的所有代码都是使用Snapchats内部混淆工具进行混淆的,因此使用诸如RDA之类的工具看起来非常烦人。

他们首先要做的事情之一是检查和存储代码签名中的内容。这是使用sys_csops(169)syscall实现的,这几乎没有文档记录,但与这里的代码非常相似。

其中最重要的是CS_OPS_STATUS,它检索流程的当前代码设计状态。越狱设备可以响应混乱的状态标志。例如:

CS_OPS_STATUS和CS_OPS_CDHASH的结果将被存储,然后以加密方式发送到Snapchat服务器。

这是一个简单的检查,但如果TWINE开发人员没有注意到这一点,则非常有效。伪代码如下所示。

一种方法是使用DYLD_GET_IMAGE_HEADER和dladdr。它们迭代DYLD_GET_IMAGE_HEADER,直到返回NULL,并检查是否已经看到了DYLD_IMAGE_COUNT的所有内容。dladdr方法为它们提供dylib的路径。这些是对照一些未知字符串进行检查的,但是从DYLD列表中删除所有与衬底相关的内容可以修复此检查。

他们使用的另一种方法是调用TASK_INFO,风格为TASK_DYLD_INFO。这也为它们提供了所有加载的dylib的列表,并且必须与第一次DYLD检查分开修复。

有两个文件系统检查,所有检查都使用sys_access(33)syscall。

最后一个使其更难修复,因为您不能简单地将ARM指令替换为使其始终返回false的内容。因此需要一个内联钩子来替代syscall,这样您就可以完全控制它。

很多类都是从许多不同的调整中检查出来的。这是使用objc_getclass完成的。

他们还检查方法。这使用objc_getclass,然后使用class_getInstanceMethod。如果存在,您将被标记。

接下来是Snapchats自己的方法。对于下面列出的类,它们首先调用class_copy MethodList。然后,对于每个方法,它们检查IMP指针(函数的地址)是否在其自己的__text段内。这是他们检测方法是否已被挂钩的方式。

它们还使用dlsym检查几个符号。如果结果不为空,您将被标记。

使用dlsym解析一些符号,以检查它们是否已被挂钩。它们首先使用dlsym解析dlsym。是啊.。该结果用于下面符号的dlsym。对于返回的每个地址,检查前4个字节是否有与公共挂钩相关的指令。

我需要诚实地说,这是他们检查注射的一种非常烦人的方式,因为修复它很烦人。它们不使用getenv,而使用environ变量。因为它是一个变量,所以不能“挂钩”它。

此处执行的检测不多,但仍然相关,使用sys_sysctl(202),它们至少请求以下属性。

syscall sys_proc_info(33)也会被调用几次,这可能会揭示跟踪该进程的内容。他们还在Snapchat二进制文件上使用sys_open(5)、mmap、sys_close(6)和sys_lstat64(340)。可能是为了检查修改或生成校验和。

很多工作都是使用在Unicorn之上构建的一个小型iOS仿真器来完成的。使用模拟器,您可以看到他们所做的一切。构建这个也教会了我很多关于iOS的CoreFoundation库的知识。

后来,我在一个名为SnapHide的调整中为我的所有发现实现了一个计数器,同时仔细跟踪我的更改是如何修改检测标志的,并慢慢地将它们全部删除。您可以很容易地在“Detections”目录中找到本文中提到的检查的修复。

或者,您也可以使用HDevelopable的whYouGonnaSyscall Talk中讨论的任何方法来跟踪syscall。演讲的幻灯片可以在这里找到。

让我们以sys_access(33)为例。它的实现如下所示。简而言之,当文件存在并授予权限时,返回0。否则返回-1。我做的第一件事是在我的模拟器中强制执行这两个结果,但是我没有看到检测标志发生任何变化。

后来在SnapHide调整中实现对此的修复时,我不能让它失败。ARM指令如下所示:

MOV x0,x27;pathMOV x1,#0;modeMOV x16,#0x21SVC 0x80;SYS_access MOV x0,#0xFFFFFFFFFFFFFFCSEL x0,x0,xZR,CSMOV x27,x0;使用结果。

v23=Mac_syscall(SYS_ACCESS,A20,0);v24=-1;如果(!v20)v24=0;*(v21+496)=v24;

来自Android的我对这里发生的事情感到非常困惑。查看说明,他们似乎直接清除了系统调用的结果。查看伪代码会揭示更多信息。显然,从这里发生的情况是,“系统调用返回错误将进位标志设置为错误”。设置和清除进位标志会导致检测更改。出于某种原因,我花了几个小时才弄明白。后来我发现我可以简单地删除MOV&;CSEL指令。这让我多了8个字节的空间来打补丁。

太棒了!这是件好事。不过,请记住上面的一些支票目前不会被不明嫌犯拒付。例如,所有提到了syscall的内容都不会被反击,如果您安装了Flex3,您将无法登录。不明嫌犯没有阻止Cydia底物装载,而是试图隐藏它。这也会失败,因为Snapchat甚至不使用此调用。

这是非常有趣但也非常烦人的两周,有很多令人头疼的事情。我希望这能让人明白为什么有些东西会让人被禁止。如果在TWAKE上有任何问题,请随时在GitHub上提交问题。如果你有什么要我详述的,请告诉我!