IOS 某电商App签名算法解析(二) Frida RPC调用

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: IOS 某电商App签名算法解析(二) Frida RPC调用

一、目标


Android下用frida来做rpc调用计算签名,我们已经玩的很熟练了。


今天介绍在IOS下的玩法。要点如下:

  • 参数类型确认
  • NSDictionary NSArray等ObjectC对象的构造和复制
  • ObjectC 类方法和对象方法的调用
  • 附送福利, ObjectC的nil 参数如何构造


二、步骤

参考Android下的玩法


参照 [某段子App协议分析(三)] 我们把frida RPC的框架先搭一下,这块的套路是一样的,

  • Flask启动一个web服务
  • 脚本暴露一个接口出来给Python调用
app = Flask(__name__)
@app.route('/getSignFromJni', methods=['GET'])
def getSignFromJni():
    global gScript
    body = "{\"api-version\":\"1.1.0\"}"
    client = "apple"
    clientVersion = "10.0.1"
    functionId = "xview2Config"
    openudid = "078593ee2fda3d54aae5879cb841b2faa62a4985"
    res = gScript.exports.callsign(body,client,clientVersion,functionId,openudid)
    return res


处于演示目的,我们这里创建一个GET接口,参数写死。实际应用的时候可以创建个POST接口,把参数传进来。

rpc.exports = {
  callsign : callSignFun
};


脚本里面暴露一个callsign函数供Python调用。


参数类型确认


上篇文章中我们已经定位到了 +[XXSignService getSignWithDic:keys:], 他有两个参数,只需要在 IDA中 查看下这个函数被谁调用了,就可以看到入参的类型了。 查看交叉引用还是上次教的 X 大法


打开 IDA, 一脸懵逼, 昨天忘保存了,昨天忘保存了,忘保存了......


你知不知道昨天IDA嚼了一上午才搞定。难道还要来嚼一上午???


换个玩法吧,反正我们已经定位了,用Frida打印下参数类型试试。

onEnter: function(args) {
        var receiver = new ObjC.Object(args[0]);
        var message1 = ObjC.Object(args[2]);
        var message2 = ObjC.Object(args[3]);
        console.log('msg1=' + message1.toString() + ",type: "+ message1.$className);
        console.log('msg2=' + message2.toString() + ",type: "+ message2.$className);
},


我就知道frida不会让我们失望

msg1={
    body = "{\"channel\":1,\"fQueryStamp\":\"1622690375496\"}";
    client = apple;
    clientVersion = "10.0.1";
    functionId = bubbleComponent;
    openudid = 078593ee2fda3d54aae5879cb841b2faa62a4985;
},type: __NSDictionaryI
msg2=(
    functionId,
    body,
    openudid,
    client,
    clientVersion
),type: __NSArrayI


参数1的类型是 NSDictionary,参数2是个字符串数组 NSArray


构造NSDictionary和NSArray


毕竟我们没搞过ObjectC,只好面向谷哥编程了,


TIP: 由于我们要初始化一些数据,所以这里使用 NSMutableDictionary 来实现, 至于 NSDictionary和NSMutableDictionary的区别,请自行谷歌

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
id objc = nil;
[dict setObject:objc forKey:@"objc"];


这段代码翻译成frida的js实现如下:

var param_dict = ObjC.classes.NSMutableDictionary.alloc().init();
  param_dict.setObject_forKey_(body,"body");


那 NSArray呢? 继续谷哥

NSArray *arr3 = [NSArray arrayWithObjects:@"one",@"two",@1, nil];


再翻译一把

var NSArray = ObjC.classes.NSArray;
var param_Key_Array = NSArray.arrayWithObjects_(sBody,sClient,sClientVersion,sFunctionId,sOpenudid);


悲催的是,这行代码跑不过去, 这下谷哥也不灵了,去大胡子的github看看52.png


TIP: 遇到frida的问题,不要着急,去大胡子的github搜搜,可能有惊喜。


吾道不孤,同道还是比较多的,遇到的问题也一样,大胡子说你要在参数结尾加个 nil


但是这个nil怎么加也是个问题呀。  再搜搜 #nil#  ,有个同道提供了一个方法, 搞起来。

var NSArray = ObjC.classes.NSArray;
var nil = ObjC.Object(ptr("0x0"));
var param_Key_Array = NSArray.arrayWithObjects_(sBody,sClient,sClientVersion,sFunctionId,sOpenudid,nil);


结果还是不理想,跑到这里还是卡死了。


换条路吧。 我们试试 NSMutableArray

var param_Key_Array = ObjC.classes.NSMutableArray.arrayWithObject_(sBody);
param_Key_Array.addObject_(sClient);
param_Key_Array.addObject_(sClientVersion);
param_Key_Array.addObject_(sFunctionId);
param_Key_Array.addObject_(sOpenudid);


太棒了,这么搞能实现


ObjectC 类方法的调用


getSignWithDic是一个类方法,类方法的调用很简单,名称后面加个下划线就可以调用了,ObjC.classes.XXSignService.getSignWithDic_(xxx) 就可以了。


不简单的是,getSignWithDic有两个参数,直接 getSignWithDic_(a1,a2)能不能行?

多参数的调用是这样的:

var signRc = ObjC.classes.XXSignService.getSignWithDic_keys_(param_dict,param_Key_Array);


完整的试一下

function callSignFun(body,client,clientVersion,functionId,openudid){
  var param_dict = ObjC.classes.NSMutableDictionary.alloc().init();
  param_dict.setObject_forKey_(body,"body");
  param_dict.setObject_forKey_(client,"client");
  param_dict.setObject_forKey_(clientVersion,"clientVersion");
  param_dict.setObject_forKey_(functionId,"functionId");
  param_dict.setObject_forKey_(openudid,"openudid");
  // console.log("==== 1");
  var NSString = ObjC.classes.NSString;
  var sBody = NSString.stringWithString_('body'); 
  var sClient = NSString.stringWithString_('client'); 
  var sClientVersion= NSString.stringWithString_('clientVersion');  
  var sFunctionId = NSString.stringWithString_('functionId'); 
  var sOpenudid = NSString.stringWithString_('openudid');
  var param_Key_Array = ObjC.classes.NSMutableArray.arrayWithObject_(sBody);
    param_Key_Array.addObject_(sClient);
    param_Key_Array.addObject_(sClientVersion);
    param_Key_Array.addObject_(sFunctionId);
    param_Key_Array.addObject_(sOpenudid);
  // console.log("==== 2");
  var signRc = ObjC.classes.XXSignService.getSignWithDic_keys_(param_dict,param_Key_Array);
  return signRc.toString(); 
}


结果是有了,至于对不对,就留给大家去验证吧。

54.png


三、总结


及时保存是个好习惯。


正向编程经验对逆向工作有很大的帮助。


Frida是神器。ORZ。55.png


我们最先衰老的不是容颜,是梦想。


TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,本文涉及到的代码项目可以去 奋飞的朋友们 知识星球自取,欢迎加入知识星球一起学习探讨技术。有问题可以加我wx: fenfei331 讨论下。


关注微信公众号: 奋飞安全,最新技术干货实时推送


相关文章
|
2天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
21 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
1月前
|
安全 数据安全/隐私保护 Android开发
【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
224 75
|
2天前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
24 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
5天前
|
监控 算法 安全
内网桌面监控软件深度解析:基于 Python 实现的 K-Means 算法研究
内网桌面监控软件通过实时监测员工操作,保障企业信息安全并提升效率。本文深入探讨K-Means聚类算法在该软件中的应用,解析其原理与实现。K-Means通过迭代更新簇中心,将数据划分为K个簇类,适用于行为分析、异常检测、资源优化及安全威胁识别等场景。文中提供了Python代码示例,展示如何实现K-Means算法,并模拟内网监控数据进行聚类分析。
28 10
|
2天前
|
存储 监控 算法
探秘员工泄密行为防线:基于Go语言的布隆过滤器算法解析
在信息爆炸时代,员工泄密行为对企业构成重大威胁。本文聚焦布隆过滤器(Bloom Filter)这一高效数据结构,结合Go语言实现算法,帮助企业识别和预防泄密风险。通过构建正常操作“指纹库”,实时监测员工操作,快速筛查可疑行为。示例代码展示了如何利用布隆过滤器检测异常操作,并提出优化建议,如调整参数、结合日志分析系统等,全方位筑牢企业信息安全防线,守护核心竞争力。
|
23天前
|
存储 算法 安全
控制局域网上网软件之 Python 字典树算法解析
控制局域网上网软件在现代网络管理中至关重要,用于控制设备的上网行为和访问权限。本文聚焦于字典树(Trie Tree)算法的应用,详细阐述其原理、优势及实现。通过字典树,软件能高效进行关键词匹配和过滤,提升系统性能。文中还提供了Python代码示例,展示了字典树在网址过滤和关键词屏蔽中的具体应用,为局域网的安全和管理提供有力支持。
50 17
|
28天前
|
JSON 小程序 UED
微信小程序 app.json 配置文件解析与应用
本文介绍了微信小程序中 `app.json` 配置文件的详细
132 12
|
28天前
|
算法 搜索推荐 Java
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
本文探讨了如何将算法学习与实际项目相结合,以提升编程竞赛中的解题能力。通过《苍穹外卖》项目,介绍了订单配送路径规划(基于动态规划解决旅行商问题)和商品推荐系统(基于贪心算法)。这些实例不仅展示了算法在实际业务中的应用,还帮助读者更好地准备蓝桥杯等编程竞赛。结合具体代码实现和解析,文章详细说明了如何运用算法优化项目功能,提高解决问题的能力。
58 6
|
1月前
|
JSON 供应链 搜索推荐
淘宝APP分类API接口:开发、运用与收益全解析
淘宝APP作为国内领先的购物平台,拥有丰富的商品资源和庞大的用户群体。分类API接口是实现商品分类管理、查询及个性化推荐的关键工具。通过开发和使用该接口,商家可以构建分类树、进行商品查询与搜索、提供个性化推荐,从而提高销售额、增加商品曝光、提升用户体验并降低运营成本。此外,它还能帮助拓展业务范围,满足用户的多样化需求,推动电商业务的发展和创新。
65 5
|
2月前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。

热门文章

最新文章

  • 1
    MNN-LLM App:在手机上离线运行大模型,阿里巴巴开源基于 MNN-LLM 框架开发的手机 AI 助手应用
  • 2
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    【Azure App Service】基于Linux创建的App Service是否可以主动升级内置的Nginx版本呢?
  • 4
    【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 5
    【Azure Function】Function App出现System.IO.FileNotFoundException异常
  • 6
    原生鸿蒙版小艺APP接入DeepSeek-R1,为HarmonyOS应用开发注入新活力
  • 7
    【Azure Logic App】使用MySQL 新增行触发器遇见错误 :“Unknown column 'created_at' in 'order clause'”
  • 8
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 9
    阿里云APP备案流程图以及备案所需材料整理,跟着教程一步步操作
  • 10
    圈子源码如何打包生成App小程序/开发一个圈子系统软件所需要的费用体现在哪里?
  • 推荐镜像

    更多