达到目的的手段有很多种,也许存在优劣之分,我只是选择了其中一种我认为好玩的方式。人脸识别校验状态存储在服务端,因此即使通过该种方法绕过客户端人脸识别,由于并未获得合法session,因此无任何危害,仅做为IOS逆向学习思路。001准备 本文所使用环境: 越狱IOS手机1个(本文所用为12。4。4) appstore下载的app一个: 登录时存在人脸识别: 002脱壳 apple在上架应用时,appstore会为上架的app加一层壳。在加壳状态下进行分析极为困难。但该层壳较为简单,可以通过各种自动化工具进行脱壳。如Clutch,CrackerXI等。Clutchi查看包名Clutchd包名脱壳 因为本文所用IOS版本为12。4。4,Clutch存在兼容性问题,故使用CrackerXI进行脱壳,脱出未加壳版本: 在CrackerXI中选择该app脱壳后: 把未加壳的ipa包下载到本地: 003破解 ipa实际上是个压缩包,可以直接通过压缩软件打开,解压其中的二进制文件: 用ida反编译ios中的二进制文件 分析代码后发现:XXXXBaseViewControllerloginSuccessIsNeedBind:WithInfo: 是登录后,人脸识别的函数,伪代码:voidcdecl〔XXXXAPPBaseViewControllerloginSuccessIsNeedBind:WithInfo:〕(XXXXAPPBaseViewControllerself,SELa2,boola3,ida4){BOOLv4;w22XXXXAPPBaseViewControllerv5;x21int64v6;x19voidv7;x0voidv8;x0voidv9;x23voidv10;x0voidv11;x20XXXXAPPLoginHelperv12;x0voidv13;x23int64v14;x1int64v15;x1int64v16;x0structobjcobjectv17;x0voidv18;x0voidv19;x22voidv20;x0voidv21;x23intv22;w24voidv23;x0voidv24;x0int64v25;x22voidv26;x0int64v27;x23constcharv28;x1voidv29;〔xsp0h〕〔xbp70h〕int64v30;〔xsp8h〕〔xbp68h〕int64(fastcallv31)();〔xsp10h〕〔xbp60h〕voidv32;〔xsp18h〕〔xbp58h〕XXXXAPPBaseViewControllerv33;〔xsp20h〕〔xbp50h〕int64v34;〔xsp28h〕〔xbp48h〕int64v35;〔xsp30h〕〔xbp40h〕boolv36;〔xsp38h〕〔xbp38h〕v4a3;赋值v4v5self;v6objcretain(a4,a2);v7objcmsgSend(OBJCCLASSUIApplication,sharedApplication);v8(void)objcretainAutoreleasedReturnValue(v7);v9v8;v10objcmsgSend(v8,delegate);v11(void)objcretainAutoreleasedReturnValue(v10);objcrelease(v9);if((unsignedint)〔XXXXAPPBaseViewControllerneedInputIDCardInfomation:〕(v5,needInputIDCardInfomation:,v6)){〔PCUtilsetObject:forKey:〕(OBJCCLASSPCUtil,setObject:forKey:,CFSTR(1),CFSTR(maybeNeedBackLoginGuide));v12〔XXXXAPPLoginHelpersharedInstance〕(OBJCCLASSXXXXAPPLoginHelper,sharedInstance);v13(void)objcretainAutoreleasedReturnValue(v12);v29NSConcreteStackBlock;v303254779904LL;v31sub1000B05E4;v32unk10263F2D8;v33v5;v36v4;v34objcretain(v11,v14);v35objcretain(v6,v15);objcmsgSend(v13,setCompleteGuideBlock:,v29,NSConcreteStackBlock,3254779904LL,sub1000B05E4,unk10263F2D8,v5);objcrelease(v13);objcrelease(v35);v16v34;LABEL9:objcrelease(v16);gotoLABEL10;}if(v4)判断v4(bool)值,确定是否进入人脸识别{v17〔PNCMBankGlobalsharedData〕(OBJCCLASSPNCMBankGlobal,sharedData);v18(void)objcretainAutoreleasedReturnValue(v17);v19v18;v20objcmsgSend(v18,bindType);v21(void)objcretainAutoreleasedReturnValue(v20);v22(unsignedint64)objcmsgSend(v21,isEqualToString:,CFSTR(FACE));objcrelease(v21);objcrelease(v19);v23objcmsgSend(v11,rootVC);v24(void)objcretainAutoreleasedReturnValue(v23);v25(int64)v24;v26objcmsgSend(v24,navigationController);v27objcretainAutoreleasedReturnValue(v26);if(v22)v28goToFaceCheckBindVC:info:;elsev28goSmsOrUKBindInfoVC:info:;objcmsgSend(v5,v28,v27,v6);objcrelease(v27);v16v25;gotoLABEL9;}〔XXXXAPPBaseViewControllerAfterBindSuccess:isNeedBind:〕(v5,AfterBindSuccess:isNeedBind:,v6,0LL);LABEL10:objcrelease(v11);objcrelease(v6);} 分析代码发现:voidcdecl〔XXXXAPPBaseViewControllerloginSuccessIsNeedBind:WithInfo:〕(XXXXAPPBaseViewControllerself,SELa2,boola3,ida4)v4a3;。。。if(v4){。。。人脸识别函数。。。} 因此即理想状态为: 只需使if(v4)判断永假,即可永不进入登录后的人脸识别,而v4又来源于v3,因此只要使v3为0或在赋值时强制赋0值,即可。 因此即理想状态为:voidcdecl〔XXXXAPPBaseViewControllerloginSuccessIsNeedBind:WithInfo:〕(XXXXAPPBaseViewControllerself,SELa2,boola3,ida4)v40;v4a3;。。。if(v4){。。。人脸识别函数。。。} 查看v4a3对应汇编代码: 利用keypatch插件修改MOVX22,X2修改为MOVX22,0 修改后: 即修改地址000B03A8 F60302AA160080D2 修改后: 伪代码:voidcdecl〔XXXXAPPCBBaseViewControllerloginSuccessIsNeedBind:WithInfo:〕(XXXXAPPCBBaseViewControllerself,SELa2,boola3,ida4){XXXXAPPCBBaseViewControllerv4;x21int64v5;x19voidv6;x0voidv7;x0voidv8;x23voidv9;x0int64v10;x20XXXXAPPCBLoginHelperv11;x0voidv12;x23int64v13;x1int64v14;x1voidv15;〔xsp0h〕〔xbp70h〕int64v16;〔xsp8h〕〔xbp68h〕int64(fastcallv17)();〔xsp10h〕〔xbp60h〕voidv18;〔xsp18h〕〔xbp58h〕XXXXAPPCBBaseViewControllerv19;〔xsp20h〕〔xbp50h〕int64v20;〔xsp28h〕〔xbp48h〕int64v21;〔xsp30h〕〔xbp40h〕charv22;〔xsp38h〕〔xbp38h〕v4self;v5objcretain(a4,a2);v6objcmsgSend(OBJCCLASSUIApplication,sharedApplication);v7(void)objcretainAutoreleasedReturnValue(v6);v8v7;v9objcmsgSend(v7,delegate);v10objcretainAutoreleasedReturnValue(v9);objcrelease(v8);if((unsignedint)〔XXXXAPPCBBaseViewControllerneedInputIDCardInfomation:〕(v4,needInputIDCardInfomation:,v5)){〔PCUtilsetObject:forKey:〕(OBJCCLASSPCUtil,setObject:forKey:,CFSTR(1),CFSTR(maybeNeedBackLoginGuide));v11(XXXXAPPCBLoginHelper)〔XXXXAPPCBLoginHelpersharedInstance〕(OBJCCLASSXXXXAPPCBLoginHelper,sharedInstance);v12(void)objcretainAutoreleasedReturnValue(v11);v15NSConcreteStackBlock;v163254779904LL;v17sub1000B05E4;v18unk10263F2D8;v19v4;v220;v20objcretain(v10,v13);v21objcretain(v5,v14);objcmsgSend(v12,setCompleteGuideBlock:,v15,NSConcreteStackBlock,3254779904LL,sub1000B05E4,unk10263F2D8,v4);objcrelease(v12);objcrelease(v21);objcrelease(v20);}else{〔XXXXAPPCBBaseViewControllerAfterBindSuccess:isNeedBind:〕(v4,AfterBindSuccess:isNeedBind:,v5,0LL);}objcrelease(v10);objcrelease(v5);} 可以看到,已经无人脸识别相关函数。 patch到2进制文件: 004安装 将修改后的二进制文件拖入ipa压缩包中覆盖原始文件 将修改后的ipa放入手机中: 使用ReProvision工具签名安装: 签名: 成功签名: 005完成 直接输入账号密码即可登录,无需人脸识别即可进入设置指纹、手势密码页面,然后可登录成功。 但登录后由于人脸识别验证在服务端,客户端中并无数据,因此无实际危害。