Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS逆向之人脸识别绕过

iOS逆向之人脸识别绕过

作者头像
FB客服
发布于 2020-06-16 09:24:32
发布于 2020-06-16 09:24:32
2.3K00
代码可运行
举报
文章被收录于专栏:FreeBufFreeBuf
运行总次数:0
代码可运行

0x00前言

达到目的的手段有很多种,也许存在优劣之分,我只是选择了其中一种我认为好玩的方式。人脸识别校验状态存储在服务端,因此即使通过该种方法绕过客户端人脸识别,由于并未获得合法session,因此无任何危害,仅做为IOS逆向学习思路。

0x01 准备

本文所使用环境:

越狱IOS手机1个(本文所用为12.4.4)

appstore下载的app一个:

登录时存在人脸识别:

0x02 脱壳

apple在上架应用时,appstore会为上架的app加一层壳。在加壳状态下进行分析极为困难。但该层壳较为简单,可以通过各种自动化工具进行脱壳。如Clutch,CrackerXI+等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Clutch -i        #查看包名 Clutch -d 包名    #脱壳

因为本文所用IOS版本为12.4.4,Clutch存在兼容性问题,故使用CrackerXI+进行脱壳,脱出未加壳版本:

在CrackerXI+中选择该app脱壳后:

把未加壳的ipa包下载到本地:

0x03 破解

ipa实际上是个压缩包,可以直接通过压缩软件打开,解压其中的二进制文件:

用ida反编译ios中的二进制文件

分析代码后发现:XXXXBaseViewController loginSuccessIsNeedBind:WithInfo:

是登录后,人脸识别的函数,伪代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void __cdecl -[XXXXAPPBaseViewController loginSuccessIsNeedBind:WithInfo:](XXXXAPPBaseViewController *self, SEL a2, bool a3, id a4){  BOOL v4; // w22  XXXXAPPBaseViewController *v5; // x21  __int64 v6; // x19  void *v7; // x0  void *v8; // x0  void *v9; // x23  void *v10; // x0  void *v11; // x20  XXXXAPPLoginHelper *v12; // x0  void *v13; // x23  __int64 v14; // x1  __int64 v15; // x1  __int64 v16; // x0  struct objc_object *v17; // x0  void *v18; // x0  void *v19; // x22  void *v20; // x0  void *v21; // x23  int v22; // w24  void *v23; // x0  void *v24; // x0  __int64 v25; // x22  void *v26; // x0  __int64 v27; // x23  const char *v28; // x1  void **v29; // [xsp+0h] [xbp-70h]  __int64 v30; // [xsp+8h] [xbp-68h]  __int64 (__fastcall *v31)(); // [xsp+10h] [xbp-60h]  void *v32; // [xsp+18h] [xbp-58h]  XXXXAPPBaseViewController *v33; // [xsp+20h] [xbp-50h]  __int64 v34; // [xsp+28h] [xbp-48h]  __int64 v35; // [xsp+30h] [xbp-40h]  bool v36; // [xsp+38h] [xbp-38h]  v4 = a3;//赋值v4  v5 = self;  v6 = objc_retain(a4, a2);  v7 = objc_msgSend(&OBJC_CLASS___UIApplication, "sharedApplication");  v8 = (void *)objc_retainAutoreleasedReturnValue(v7);  v9 = v8;  v10 = objc_msgSend(v8, "delegate");  v11 = (void *)objc_retainAutoreleasedReturnValue(v10);  objc_release(v9);  if ( (unsigned int)-[XXXXAPPBaseViewController needInputIDCardInfomation:](v5, "needInputIDCardInfomation:", v6) )  {    +[PCUtil setObject:forKey:](&OBJC_CLASS___PCUtil, "setObject:forKey:", CFSTR("1"), CFSTR("maybeNeedBackLoginGuide"));    v12 = +[XXXXAPPLoginHelper sharedInstance](&OBJC_CLASS___XXXXAPPLoginHelper, "sharedInstance");    v13 = (void *)objc_retainAutoreleasedReturnValue(v12);    v29 = _NSConcreteStackBlock;    v30 = 3254779904LL;    v31 = sub_1000B05E4;    v32 = &unk_10263F2D8;    v33 = v5;    v36 = v4;    v34 = objc_retain(v11, v14);    v35 = objc_retain(v6, v15);    objc_msgSend(      v13,      "setCompleteGuideBlock:",      &v29,      _NSConcreteStackBlock,      3254779904LL,      sub_1000B05E4,      &unk_10263F2D8,      v5);    objc_release(v13);    objc_release(v35);    v16 = v34;LABEL_9:    objc_release(v16);    goto LABEL_10;  }  if ( v4 ) //判断v4(bool)值,确定是否进入人脸识别  {    v17 = +[PNCMBankGlobal sharedData](&OBJC_CLASS___PNCMBankGlobal, "sharedData");    v18 = (void *)objc_retainAutoreleasedReturnValue(v17);    v19 = v18;    v20 = objc_msgSend(v18, "bindType");    v21 = (void *)objc_retainAutoreleasedReturnValue(v20);    v22 = (unsigned __int64)objc_msgSend(v21, "isEqualToString:", CFSTR("FACE"));    objc_release(v21);    objc_release(v19);    v23 = objc_msgSend(v11, "rootVC");    v24 = (void *)objc_retainAutoreleasedReturnValue(v23);    v25 = (__int64)v24;    v26 = objc_msgSend(v24, "navigationController");    v27 = objc_retainAutoreleasedReturnValue(v26);    if ( v22 )      v28 = "goToFaceCheckBindVC:info:";    else      v28 = "goSmsOrUKBindInfoVC:info:";    objc_msgSend(v5, v28, v27, v6);    objc_release(v27);    v16 = v25;    goto LABEL_9;  }  -[XXXXAPPBaseViewController AfterBindSuccess:isNeedBind:](v5, "AfterBindSuccess:isNeedBind:", v6, 0LL);LABEL_10:  objc_release(v11);  objc_release(v6);}

分析代码发现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void __cdecl -[XXXXAPPBaseViewController loginSuccessIsNeedBind:WithInfo:](XXXXAPPBaseViewController *self, SEL a2, bool a3, id a4)v4 = a3;//...if ( v4 ) {//...//人脸识别函数//...}

因此即理想状态为:

只需使if(v4)判断永假,即可永不进入登录后的人脸识别,而v4又来源于v3,因此只要使v3为0或在赋值时强制赋0值,即可。

因此即理想状态为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void __cdecl -[XXXXAPPBaseViewController loginSuccessIsNeedBind:WithInfo:](XXXXAPPBaseViewController *self, SEL a2, bool a3, id a4)v4 = 0;//v4 = a3;//...if ( v4 ) {//...//人脸识别函数//...}

查看v4 = a3对应汇编代码:

利用keypatch插件修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MOV             X22, X2修改为MOV             X22, #0

修改后:

即修改地址000B03A8

F6 03 02 AA->16 00 80 D2

修改后:

伪代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void __cdecl -[XXXXAPPCBBaseViewController loginSuccessIsNeedBind:WithInfo:](XXXXAPPCBBaseViewController *self, SEL a2, bool a3, id a4){  XXXXAPPCBBaseViewController *v4; // x21  __int64 v5; // x19  void *v6; // x0  void *v7; // x0  void *v8; // x23  void *v9; // x0  __int64 v10; // x20  XXXXAPPCBLoginHelper *v11; // x0  void *v12; // x23  __int64 v13; // x1  __int64 v14; // x1  void **v15; // [xsp+0h] [xbp-70h]  __int64 v16; // [xsp+8h] [xbp-68h]  __int64 (__fastcall *v17)(); // [xsp+10h] [xbp-60h]  void *v18; // [xsp+18h] [xbp-58h]  XXXXAPPCBBaseViewController *v19; // [xsp+20h] [xbp-50h]  __int64 v20; // [xsp+28h] [xbp-48h]  __int64 v21; // [xsp+30h] [xbp-40h]  char v22; // [xsp+38h] [xbp-38h]  v4 = self;  v5 = objc_retain(a4, a2);  v6 = objc_msgSend(&OBJC_CLASS___UIApplication, "sharedApplication");  v7 = (void *)objc_retainAutoreleasedReturnValue(v6);  v8 = v7;  v9 = objc_msgSend(v7, "delegate");  v10 = objc_retainAutoreleasedReturnValue(v9);  objc_release(v8);  if ( (unsigned int)-[XXXXAPPCBBaseViewController needInputIDCardInfomation:](v4, "needInputIDCardInfomation:", v5) )  {    +[PCUtil setObject:forKey:](&OBJC_CLASS___PCUtil, "setObject:forKey:", CFSTR("1"), CFSTR("maybeNeedBackLoginGuide"));    v11 = (XXXXAPPCBLoginHelper *)+[XXXXAPPCBLoginHelper sharedInstance](&OBJC_CLASS___XXXXAPPCBLoginHelper, "sharedInstance");    v12 = (void *)objc_retainAutoreleasedReturnValue(v11);    v15 = _NSConcreteStackBlock;    v16 = 3254779904LL;    v17 = sub_1000B05E4;    v18 = &unk_10263F2D8;    v19 = v4;    v22 = 0;    v20 = objc_retain(v10, v13);    v21 = objc_retain(v5, v14);    objc_msgSend(      v12,      "setCompleteGuideBlock:",      &v15,      _NSConcreteStackBlock,      3254779904LL,      sub_1000B05E4,      &unk_10263F2D8,      v4);    objc_release(v12);    objc_release(v21);    objc_release(v20);  }  else  {    -[XXXXAPPCBBaseViewController AfterBindSuccess:isNeedBind:](v4, "AfterBindSuccess:isNeedBind:", v5, 0LL);  }  objc_release(v10);  objc_release(v5);}

可以看到,已经无人脸识别相关函数。

patch到2进制文件:

0x04 安装

将修改后的二进制文件拖入ipa压缩包中覆盖原始文件

将修改后的ipa放入手机中:

使用ReProvision工具签名安装:

签名:

成功签名:

0x05 完成

直接输入账号密码即可登录,无需人脸识别即可进入设置指纹、手势密码页面,然后可登录成功。

但登录后由于人脸识别验证在服务端,客户端中并无数据,因此无实际危害。

0x06 后记

道路千万条,逆向最为强!

高清原始文件: 链接:https://pan.baidu.com/s/1B9WVlTXcvZHrepxaQlS98A提取码: p4en

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
某IOS可信ID产品原理分析
随着全球范围内移动业务的全面发展,采取移动为主策略的营销人员具有独特的优势,能够为他们的品牌带来最大的成功。根据Zenith估计,到2020年移动设备将占全球广告市场的30%以上。 今年苹果秋季发布会上苹果介绍对用户隐私保护继续升级。从官方披露的公开信息来看,iOS 14的用户隐私保护更新将让用户更加知悉自己个人数据的使用情况,并进一步约束App追踪用户隐私的能力。限制“广告客户标识符”(IDFA)更新已确定延期至明年初执行,这将是一个会极大影响App定制化广告收入的用户数据追踪功能。 目前大多广告依赖IDFA和用户数据进行广告投放和优化。iOS 14 之后,IDFA的授权从设备层面移动到app层面。因此,如果用户需要对每个app进行授权。 行业预计:只有20%左右的用户会进行授权;而如果80%的用户不进行授权,那么绝大部分app的都不能进行标识用户身份、归因、推荐、唤醒等。用户不授权跟踪(没有IDFA)之后,怎么办? 如果拿不到用户的IDFA授权,或者长远看苹果不再支持IDFA怎么办?
我是小三
2020/10/29
1.9K0
某IOS可信ID产品原理分析
IOS防作弊产品技术原理分析
1.由于IOS系统的不开放性,能获取的信息太少,所在IOS上的防作弊产品可做的功能就相比较于安卓要少很多了。硬件方面主要获取IDFA、IDFV这两个值,软件方面主要获取一些风险APP的名称。
我是小三
2019/06/04
3.6K1
IOS防作弊产品技术原理分析
CVE-2018-8412:通过MS Office for Mac的Legacy Package进行提权
Microsoft Autoupdate Helper 3.18(180410) + legacy SilverLight insecure installer package EoP
FB客服
2018/09/21
9300
CVE-2018-8412:通过MS Office for Mac的Legacy Package进行提权
CTF逆向--安卓篇
题目(来源:Jarvis-OJ): Androideasy DD Android Easy DD - Android Normal FindPass Smali 爬楼梯 Androideasy 使用APKToolBOX中的jadx打开该apk文件找到MainActivity查看主函数,如下所示 package com.a.sample.androidtest; import android.content.Context; import android.os.Bundle; import android.s
安恒网络空间安全讲武堂
2018/02/23
2.7K0
CTF逆向--安卓篇
Il2cpp逆向:global-metadata解密
  关于Il2cpp的资料网上有很多,简而言之,Il2cpp就是unity用来代替原来的基于Mono虚拟机的一种新的打包方式,它先生成IL(中间语言),然后再转换成Cpp文件,提高运行效率的同时增加了安全性。原本基于Mono的打包方式极其容易被逆向,现在市面上的新游戏基本上都是用Il2cpp的方式打包的,当然Il2cpp的逆向教程也很多,但是都是千篇一律,教你用国内大佬写的Il2cppDumper去dump就完事,毫无技术含量。事实上,由于这个工具太过出名,很多游戏厂商都采取了对抗措施,导致就算你照着教程来,大多数情况下也不会成功的。因此打算学习一下Il2cpp相关的攻防技术,于是在网上找了一个Il2cpp的CTF题来练手。题目来源:n1ctf-2018
大A
2023/02/14
16.3K2
反逆向分析
OLLVM(Obfuscator-LLVM)是瑞士西北应用科技大学安全实验室于2010年6月份发起的一个项目,该项目旨在提供一套开源的针对LLVM的代码混淆工具,以增加逆向工程的难度, 只不过Ollvm仅更新到llvm的4.0,2017年开始就没再更新。
i0gan
2021/06/26
2.3K0
iOS 底层拾遗:autorelease 优化
由于 ARC 下 retain/release/autorelease 的调用都是编译器代劳,所以需要使用编译后的代码进行分析,通常笔者选择 Xcode 自带的工具,它有一个优势是自动将一些符号地址改为符号名,并且可以选择 Running 或 Archiving 下的汇编代码,后者生成的代码往往是前者的优化版本。
波儿菜
2019/12/23
1.4K0
iOS16 和 Xcode14 如何改进 App 大小和运行时性能
本文主要介绍苹果在 Xcode14 和 iOS 16 上,如何从编译层面和运行时层面,优化 Swift 和 Objective-C runtime, 来让 app 二进制体积更小,运行更快,启动更快。当你使用 Xcode 14 构建应用程序时,你将会了解到如何访问高效的协议检查,更小消耗的消息发送调用,以及优化后的 ARC。下面我们深入探讨这几个方面的优化。
DerekYuYi
2022/06/26
4.1K1
iOS16 和 Xcode14 如何改进 App 大小和运行时性能
【攻防世界】REVERSE高手进阶区
然后我们查看一波他的字符串,发现了个fake的flag(一眼丁真),咱们就从这fake入手去分析
YanXia
2023/04/07
6610
【攻防世界】REVERSE高手进阶区
【愚公系列】2021年12月 攻防世界-简单题-MOBILE-010(easy-dex)
APK解包后是没有dex文件的,运行代码使用了NativeActivity的方法封装到了libnative.so 这个文件中。APK实际包含了2个APP,这2个APP的包名一致。一个存放在libnative.so文件中,另一个是解压后的dex文件。APK安装后,的功能是摇晃收集达到一定次数(10秒100次,肯定做不到)然后解压一个dex文件到特定的目录下。flag在通过分析释放出来dex文件得出。
愚公搬代码
2021/12/24
3230
【愚公系列】2021年12月 攻防世界-简单题-MOBILE-010(easy-dex)
从微信扔骰子看iOS应用安全与逆向分析
在之前《免越狱调试与分析黑盒iOS应用》以及前几篇文章中已经介绍了如何开始分析iOS应用,不过都是基于非越狱的机器,其本意是为了能够在自己的主力设备中进行简单的分析和调试。但是执着于免越狱其实在很多情况下需要额外的工作,如果想要在iOS上做进一步研究的话,完全的访问权限是很有必要的。
evilpan
2023/02/12
2.1K0
从微信扔骰子看iOS应用安全与逆向分析
R语言自适应LASSO 多项式回归、二元逻辑回归和岭回归应用分析|附代码数据
该算法速度快,可以利用输入矩阵x中的稀疏性,拟合线性、logistic和多项式、poisson和Cox回归模型。可以通过拟合模型进行各种预测。它还可以拟合多元线性回归。”
拓端
2023/06/20
4070
WWDC22:Runtime 的性能优化和 App 减包
本 Session 讲了为了让你的应用包体积更小,运行更快,启动速度更快,我们对 Swift 和 Objective-C 运行时做了怎样的优化。同时通过本 Session 你将发现如何通过高效的协议检查,更小的消息发送,以及优化后的 ARC 机制,来提高你的 App 性能。
molier
2022/11/03
9850
WWDC22:Runtime 的性能优化和 App 减包
[CTF]攻防世界Simple-check-100题解(GDB)
注:本博文记录压缩包中ELF文件flag的获取过程,exe文件flag是乱码,具体过程就不给大家演示了。着重分享GDB的内容。
李鹏华
2024/03/12
2540
[CTF]攻防世界Simple-check-100题解(GDB)
淘宝的npaliedit在mb下会崩溃的问题解决了
这个np控件会在“确认收货”按钮里用到。点了后会出现6个格子,要填入密码。但mb一到这就会崩溃在 npObjectGetProperty的npObject->_class->getProperty(npObject, identifier, &result) 没办法,只能逆向下这个dll。 其实原因很简单,dll的setwindow_1000128C里会调用 CreateWindow_1000197D创建隐藏的windows char __thiscall CreateWindow_1000197D(LO
龙泉寺扫地僧
2018/06/21
8520
BUUCTF 刷题笔记——Reverse 1
依然给了一个压缩文件,解压后依然是一个 exe 可执行文件,再次尝试用 IDA 反编译,这次没有一眼看到 flag 了,甚至连主函数都没有。于是 Shift + F12 找找特别的字符串,发现了 this is the right flag!:
h-t-m
2023/03/15
2.7K0
BUUCTF 刷题笔记——Reverse 1
原创Paper | 在 Android 中开发 eBPF 程序学习总结(三)
作者:Hcamael@知道创宇404实验室 日期:2022年11月30日 相关阅读: 在 Android 中开发 eBPF 程序学习总结(一) 在 Android 中开发 eBPF 程序学习总结(二)
Seebug漏洞平台
2023/01/05
1.1K1
Re:从零开始的逆向生活_buu篇(8.25更)
其中代码大概意思为数组前后位异或后,与global对应字符串比较前33位,即ord('!'),如果相同则返回Success,也就是得到了flag
回天
2023/04/25
3460
Re:从零开始的逆向生活_buu篇(8.25更)
一文 读懂 还原 破解 incaseformat病毒
病毒文件已写入到注册表,重启机器就会在开机自动启动病毒样本程序,我们在任务管理器上就可以看到ttry.exe的应用程序了。
小道安全
2021/02/05
1.2K0
一文读懂Python复杂网络分析库networkx | CSDN博文精选
networkx是一个用Python语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。
AI科技大本营
2019/10/21
30K0
一文读懂Python复杂网络分析库networkx | CSDN博文精选
推荐阅读
相关推荐
某IOS可信ID产品原理分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验