快手,快影 iOS App反调试

Python实战社群

Java实战社群

长按识别下方二维码,按需求添加

扫码关注添加客服

进Python社群▲

扫码关注添加客服

进Java社群

作者 | 倒影cc 
来源 | 掘金

https://juejin.cn/post/6844904190720868360

快手,快影的App保护用的是同一套代码,反调试也很容易,下面请看过程。

1.快手App去反调试

直接frida砸壳,然后创建MonkeyDev工程,并在antiAntiDebug.m文件的相关函数下断点,然后运行。

App运行起来后,将在my_dlsym函数断下来,然后bt打印调用栈:

然后在栈1地址处下断, 即: b 0x00000001054c3430,按C运行。

在0x00000001054c3430 处断下来之后, 修改返回值 x0 = 0 ,即:

register write $x0  0

在汇编55行:

nop该行指令,然后运行即可,命令如下:

memory write -s 4 0x1028c09f4  0xd503201f

2.快影App去反调试

砸壳快影,然后创建MonkeyDev工程, 运行,闪退。看下日志,打印如下:

[AntiAntiDebug] - dlsym get ptrace symbol
[AntiAntiDebug] - ptrace request is PT_DENY_ATTACH

在antiAntiDebug的my_ptrace和my_dlsym处下断点。
去反调试

函数1:0x000000010265c920,

汇编55行: nop掉改行汇编指令即可正常运行,命令如下:

memory write -s 4  0x102e089f4  0xd503201f

2.1 快影App sign的计算逻辑

首先通过IDA静态分析,我们得到如下关键方法:

id __cdecl +[KSMWPassportSecurityTools hmac:withKeyData:](KSMWPassportSecurityTools_meta *self, SEL a2, id a3, id a4)
{id v4; // x19id v5; // x20__int64 v6; // x21__int64 v7; // x1__int64 v8; // x22void *v9; // x0const char *v10; // x20void *v11; // x19void *v12; // x21void *v13; // x19size_t v14; // x0char v16; // [xsp+8h] [xbp-48h]v4 = a4;v5 = a3;v6 = objc_retain(a3, a2);v8 = objc_retain(v4, v7);v9 = (void *)objc_retainAutorelease(v5);v10 = (const char *)objc_msgSend(v9, "cStringUsingEncoding:", 4LL);objc_release(v6);v11 = (void *)objc_retainAutorelease(v4);v12 = objc_msgSend(v11, "bytes");v13 = objc_msgSend(v11, "length");objc_release(v8);v14 = strlen(v10);CCHmac(2LL, v12, v13, v10, v14, &v16);   // 2 = kCCHmacAlgSHA256return (id)objc_msgSend(&OBJC_CLASS___NSData, "dataWithBytes:length:", &v16, 32LL);
}

其完整的sign计算逻辑为:

[KSMWPassportSecurityTools createSignWithStringNonce:ssecurity:longValue: value]|+[KSMWPassportSecurityTools hmac:withKeyData:] = resultData|CCHmac(2LL, 0, 0, x3, 101, resultBuf); |data = bswap32(value)|[data appendData: resultData]|[KSMWPassportSecurityTools base64Encode:]

于是对[KSMWPassportSecurityTools createSignWithStringNonce:ssecurity:longValue: value]方法下断,然后点击获取验证码,其调用栈如下:

thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 18.1
frame #0: 0x0000000101856fb0 KwaiYDelux`+[KSMWPassportSecurityTools createSignWithStringNonce:ssecurity:longValue:]
frame #1: 0x0000000101856c30 KwaiYDelux`+[KSMWPassportSecurityTools signOnURLPath:method:requestParams:] + 364
frame #2: 0x0000000101855910 KwaiYDelux`-[KSMWNetworkOperation url:method:parameters:cookies:completionHandler:] + 212
frame #3: 0x0000000101863a14 KwaiYDelux`-[KWPassportAPI POST:bodyParams:completionHandler:] + 280
frame #4: 0x00000001018607f8 KwaiYDelux`-[KWPassportAPI requestSMSCode:countryCode:type:completion:] + 412
frame #5: 0x000000010185f25c KwaiYDelux`-[KWPassport requestSMSCode:countryCode:type:completion:] + 132
frame #6: 0x00000001026799dc KwaiYDelux`-[KWAccountChannelService_Imp sendSMSWithRequest:handler:] + 264
frame #7: 0x000000018deea800 CoreFoundation`__invoking___ + 144
frame #8: 0x000000018ddcc3c0 CoreFoundation`-[NSInvocation invoke] + 292
frame #9: 0x000000010259659c KwaiYDelux`___lldb_unnamed_symbol58737?KwaiYDelux + 1180
frame #10: 0x000000010817e7fc Flutter`__45-[FlutterMethodChannel setMethodCallHandler:]_block_invoke + 116
frame #11: 0x000000010811d6d0 Flutter`flutter::PlatformViewIOS::HandlePlatformMessage(fml::RefPtr<flutter::PlatformMessage>) + 680
frame #12: 0x0000000108170048 Flutter`std::__1::__function::__func<flutter::Shell::OnEngineHandlePlatformMessage(fml::RefPtr<flutter::PlatformMessage>)::$_32, std::__1::allocator<flutter::Shell::OnEngineHandlePlatformMessage(fml::RefPtr<flutter::PlatformMessage>)::$_32>, void ()>::operator()() + 80
frame #13: 0x000000010812a988 Flutter`fml::MessageLoopImpl::FlushTasks(fml::FlushType) + 96
frame #14: 0x000000010812ef0c Flutter`fml::MessageLoopDarwin::OnTimerFire(__CFRunLoopTimer*, fml::MessageLoopDarwin*) + 32
frame #15: 0x000000018de75554 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 28
frame #16: 0x000000018de75284 CoreFoundation`__CFRunLoopDoTimer + 864
frame #17: 0x000000018de74ab8 CoreFoundation`__CFRunLoopDoTimers + 248
frame #18: 0x000000018de6fa08 CoreFoundation`__CFRunLoopRun + 1844
frame #19: 0x000000018de6efb4 CoreFoundation`CFRunLoopRunSpecific + 436
frame #20: 0x000000019007079c GraphicsServices`GSEventRunModal + 104
frame #21: 0x00000001ba6d0c38 UIKitCore`UIApplicationMain + 212
frame #22: 0x0000000100e0c028 KwaiYDelux`___lldb_unnamed_symbol1343?KwaiYDelux + 100
frame #23: 0x000000018d9328e0 libdyld.dylib`start + 4

调用+[KSMWPassportSecurityTools hmac:withKeyData:]

其中

hmac=POST&/pass/ky/sms/code&countryCode=+86&phone=ZTSP__R2oN18L5Ilx8weM__ZTSP&type=395&8951850021377611294
data = 空

汇编50行,调用
CCHmac(2LL, 0, 0, x3, 101, resultBuf); // 2 = kCCHmacAlgSHA256, CC_SHA256_DIGEST_LENGTH = 32, 即加密返回长度=32

(lldb) x/50xg $x3,  长度=101, 即=POST&/pass/ky/sms/code&countryCode=+86&phone=ZTSP__R2oN18L5Ilx8weM__ZTSP&type=395&8951850021377611294

内存数据如下:

0x2823ace91: 0x61702f2654534f50 0x6d732f796b2f7373      
0x2823acea1: 0x632665646f632f73 0x6f437972746e756f      
0x2823aceb1: 0x702636382b3d6564 0x53545a3d656e6f68      
0x2823acec1: 0x314e6f32525f5f50 0x7738786c49354c38
0x2823aced1: 0x5053545a5f5f4d65 0x39333d6570797426
0x2823acee1: 0x3538313539382635 0x3637373331323030
0x2823acef1: 0x0000003439323131 0x0000000000000000
0x2823acf01: 0x0000000000000000 0x0000000000000000

(lldb) x/50xg $x5 -> 加密结果

0x16f1290c8: 0x35da8aa020e5bd2f 0xf6fc50b2b2c85841
0x16f1290d8: 0x2e00c9df95a02ada 0x17325b620c1cd33f

将data<7c3b5c2a 5ec9161e> append 加密结果,得到:

<7c3b5c2a 5ec9161e 2fbde520 a08ada35 4158c8b2 b250fcf6 da2aa095 dfc9002e 3fd31c0c 625b3217>

然后调用 [KSMWPassportSecurityTools base64Encode:], 传入上面的data。得到:

fDtcKl7JFh4vveUgoIraNUFYyLKyUPz22iqgld/JAC4/0xwMYlsyFw==

这就是最终的sign,可以通过抓包进行对比。

由于快影App 大部分业务界面都是flutter开发的,目前还没有能力进行逆向,flutter页面的接口请求也没有走Native,没办法进行抓包。
wireshark只能抓到https加密包,它的本质就是把经过网卡的数据包复制一份,而不是像charles在手机系统上起一个代理服务器,对App的网络请求进行代理请求。

据网上说,可以通过代理(fan qiang)工具进行代理,然后再使用charles进行抓包。

程序员专栏 扫码关注填加客服 长按识别下方二维码进群

近期精彩内容推荐:  

 看电影前一定要检查一下域名是不是HTTPS的

 有个大神级女朋友是什么体验

 世界上五个最不务正业的科学家!

 魂斗罗只有128KB为何可以实现那么长的剧情

在看点这里好文分享给更多人↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/255836.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

1727_使用虚拟机安装CentOS-7

全部学习汇总&#xff1a;GreyZhang/little_bits_of_linux: My notes on the trip of learning linux. (github.com) 离开Linux很久了&#xff0c;甚至怀念&#xff0c;虚拟机里装个CentOS 7玩玩。使用的是VM虚拟机&#xff0c;下载了CentOS 7的everything安装包。 1&#xf…

简单几个步骤,轻松完成短视频配音工作|别惊讶,让我手把手教你

给短视频配音有多简单&#xff1f;你根本想象不到&#xff0c;竟然只需要简单几步就能够完成&#xff01; 并不是所有短视频配音都需要自己亲自配&#xff0c;或者大价钱找真人配音老师。只需要利用配音软件&#xff0c;制作AI配音就可以完成。也许你会担心机器人声音太过生硬&…

新手如何入门视频剪辑?分享超好用的视频剪辑工具,剪辑、压缩、封面制作一网打尽!

哈喽大家好&#xff0c;我是菌菌~ vlog拍摄、视频混剪、课程录制……现如今&#xff0c;视频异常火爆&#xff0c;一种新的技能也被全民所需要&#xff0c;那就是视频剪辑&#xff01; 工欲善其事必先利其器&#xff0c;要想做视频没几个得力助手怎么能行&#xff1f; 今天&…

android ffmpeg 仿剪映播放器 剪辑视频 预览条 快速精准抽帧

android ffmpeg 仿剪映播放器 剪辑视频 预览条 快速精准抽帧 由于本人想学习音视频相关的东西&#xff0c;所以找了剪映作为借鉴&#xff0c;通过仿照剪映的功能学习音视频相关的东西&#xff0c;所以有了这个项目 暂时这个项目只有仿照剪映&#xff0c;剪辑的预览条的快速抽…

怎么下载老版本android,剪映旧版下载

剪映老版本对于喜欢发抖音快手的朋友们无疑是一个神器&#xff0c;因为它可以快速的对你的视频进行剪辑&#xff0c;而且还可以添加自己的专有水印&#xff0c;不仅如此它还可以将照片整合成视频&#xff0c;相当好用。 剪映旧版介绍 这是一款极简的视频编辑工具,让你轻松制作高…

怎么用快影去除视频中的水印?

第一步&#xff1a;首先打开快影app&#xff0c;点击左下角创作&#xff0c;再点击右上角快影百宝箱图标。 图片来源&#xff1a;微信视频号前后10年 第二步&#xff1a;点击一键修复 画面修复去痕工具图标。 图片来源&#xff1a;微信视频号前后10年 第三步&#xff1a;进入…

和府捞面全新品牌“小面小酒”在福州开业,下一批新店落地天津、淄博

6月11日&#xff0c;和府捞面全新品牌“和府小面小酒”福州仓山苏宁易购店正式营业。未来两个月内&#xff0c;“小面小酒”将在福州核心商圈加密布局&#xff0c;新门店落位东二环泰禾广场及万象九宜城。与此同时&#xff0c;“小面小酒”全国正式铺开&#xff0c;下一批新店落…

小饭馆拓客营销流程,小饭馆宣传推广方案

基于目前持续回暖的餐饮行业&#xff0c;小饭馆起死回生&#xff0c;业绩翻倍&#xff0c;关键在于营销推广。那么如何进行小饭馆的推广&#xff1f;今天我们就和各位聊聊小饭馆引流推广应该如何做&#xff01; 小饭馆营销推广流程 小饭馆引流推广方案主要包含如下&#xff1a…

来客电商之微信小程序怎么取名字

微信小程序名称怎么取&#xff1f;我们一起来看看吧~ 微信电商小程序名称设置要根据腾讯的规则来&#xff0c;如有违规是不会通过审核的哦~下面我们一起来看看微信官方的要求吧&#xff01; 1、名称设置方法 2、小程序名称可以由中文、数字、英文、空格及部分特殊符号组成。长…

美食杰项目 -- 菜谱大全(二)

目录 前言&#xff1a;具体实现思路&#xff1a;步骤&#xff1a;1. 展示美食杰菜谱大全效果2. 引入element-ui3. 代码 总结&#xff1a; 前言&#xff1a; 本文给大家讲解&#xff0c;美食杰项目中菜谱大全实现的效果&#xff0c;和具体代码。 具体实现思路&#xff1a; 点击…

php小程序餐馆点餐订餐外卖系统

目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 2 2 系统开发环境 4 2.2MyEclipse环境配置 4 2.3 B/S结构简介 4 2.4MySQL数据库 5 3 系统分析 6 3.1系统可行性分析 6 3.1.1经济可行性 6 3.1.2技术可行性 6 3.1.3运行可行性 6 …

IT朋友,有福啦! 精心收集的深圳餐馆大全(带电话,地址,部分还有店面图片)

转自:天涯社区; 长寿坊面食大王菜式&#xff1a; 小吃/面/快餐 | TAGS&#xff1a; 正中热干面 牛肉面 锅贴饺 扬州炒饭 | 地址&#xff1a;红桂路与红岭中交叉路口&#xff08;宝庆府旁&#xff09; | 电话&#xff1a;36942582 乘车路线: 暂无 土风特产屋菜式&#xff1a;…

NIO之SocketChannel,SocketChannel ,DatagramChannel解读

目录 基本概述 ServerSocketChannel 打开 ServerSocketChannel 关闭 ServerSocketChannel 监听新的连接 阻塞模式 非阻塞模式 SocketChannel SocketChannel 介绍 SocketChannel 特征 创建 SocketChannel 连接校验 读写模式 读写 DatagramChannel 打开 Datagr…

未安装任何音频设备解决方案(2021/12/27)

联想小新&#xff0c;win10&#xff0c;驱动全部更新&#xff0c;在官网下载重装&#xff0c;cmd输入代码都没有用。 使用设置&#xff0c;点击轻松使用&#xff0c;点击音频卡住无响应。 喇叭红叉&#xff0c;右键显示扬声器安装程序unknown。然而扬声器界面显示工作正常。 …

保姆级教程!Windows右下角扬声器有红叉,点击声音设置输出显示“未安装任何音频输出设备”?

打开电脑&#xff0c;音频设备无法正常播放&#xff0c;扬声器处有红叉&#xff0c;F1~F4无法使用&#xff0c;在音频播放器中发现无音频输出设备&#xff0c;插上耳机也没有声音&#xff01;这可能是因为扬声器驱动器未及时更新&#xff0c;或更新失败&#xff0c;按照以下教程…

Win10喇叭图标出现红叉提示“未安装任何音频输出设备“

如果驱动都安装了还是没有用&#xff0c;右击右下角喇叭图标→打开音量设置→管理声音设备→全都禁用→启用麦克风和扬声器

Win10小喇叭显示红叉,显示未找到输出设备的解决方式

最近遇到一个问题&#xff0c;重装win10系统之后&#xff0c;新系统右下角的小喇叭一直显示红叉&#xff0c;右击显示“扬声器安装程序unknown”&#xff0c;查了网上很多的教程&#xff0c;不是通过驱动精灵、鲁大师重新安装声卡驱动&#xff0c;就是将声卡驱动回退回原来版本…

“未安装任何音频输出设备”解决办法

安了个安卓模拟器&#xff0c;把电脑搞聋了&#xff0c;百度了好多办法没有用&#xff0c;最后在b站一个评论区解决了&#xff0c;记录一下以免以后再发生类似问题 问题&#xff1a; 小喇叭有个小红叉 解决&#xff1a; 打开设备管理器>展开“系统设备”>英特尔R智音…

华硕笔记本win10安装后喇叭红叉解决方案

朋友把华硕灵耀14S送到电脑店去装win10&#xff0c;结果喇叭红叉。显示未安装任何音频输出设备。店员打算拆机换声卡…然后朋友果断拒绝&#xff0c;找到了我 设备管理器里也没有声音控制器&#xff0c;系统设备里也找不到关于声音的物体…… 安装各种驱动精灵app&#xff0c;…

Windows系统,声音显示红色叉号,没声音修复

win7喇叭上显示红叉号&#xff0c;没声音&#xff0c;修复&#xff1a; 通常装了驱动后就没问题了&#xff0c;或者&#xff1a;右键点击喇叭—播放设备—右键单击&#xff1a;未安装音频设备&#xff0c; 左键点击&#xff1a;显示禁用设备&#xff0c;启用扬声器&#xff0c…