ios逆向之frida简单教程
1. 准备:
- mac电脑
- 越狱好的手机
- 一个待分析的app
2. app砸壳
文章参考https://www.jianshu.com/p/80c1311530c3
3. 反编译出头文件
文章参考https://www.jianshu.com/p/c4272fce6703
4. frida安装
电脑直接运行以下命令
pip install frida-tools
参考官方
https://frida.re/docs/ios/
手机端打开Cydia搜索frida安装
5. frida-ps使用
# 将Frida通过USB连接到iPad,并列出正在运行的进程
frida-ps -U# 运行中的应用程序列表
frida-ps -Ua# 已安装的应用程序列表
frida-ps -Uai# 把Frida连接到特定的设备上
frida-ps -D 0216027d1d6d3a03
6. 分析砸壳之后导出的头文件
这一步只能靠日常经验去猜,比如接口请求一般都是request、response等关键字。
或者结合android端的命名(前提分析了android的APP)
7. 结合frida-trace去分析
官方文档https://frida.re/docs/frida-trace/
比如下面的命令
frida-trace -m "+[JDYUserContextManager sharedInstance]" -U 千牛
追踪JDYUserContextManager类,sharedInstance方法的调用
也可以使用*模糊追踪,比如
-m 包含指定方法
-M 排除指定方法
-U usb连接
frida-trace -m "+[JDYUserContextManager shared*]" -U 千牛
8. frida代码的编写
新建两个文件
qianniu.py
import frida, sys #导入frida模块
script = 'qianniu.js' #准备执行的frida javaScript脚本
bundle = 'com.taobao.sellerplatform' #准备hook的app的bundleIdf = open(script, "r") #打开frida脚本
s = f.read() #读取frida脚本device = frida.get_usb_device(1000) #连接usb设备 1000表示超时
pid = device.spawn([bundle]) #启动指定bundleId的app
session = device.attach(pid) #附加到app
script = session.create_script(s) #创建frida javaScript脚本
script.load() #load脚本到app进程中 这样即注入成功
device.resume(pid) #恢复app运行
sys.stdin.read()#读取打印日志
qianniu.js
if(ObjC.available){ //判断Object-C类方法是否已经加载进来console.log('hello world!')
}
9. hook指定方法
// 普通参数
function hook01(){let class_name = 'JDYUserContextManager'let method = '+ sharedInstance'let sharedInstance = ObjC.classes[class_name][method]let oldImpl = sharedInstance.implementationsharedInstance.implementation = ObjC.implement(sharedInstance,function(handle,selector,arg1,arg2){ // 如果有参数的话,就是第三个参数为该方法的第一个参数:args[n-2]// 查看值console.log("arg1",new ObjC.Object(arg1))let result = oldImpl(handle,selector,arg1,arg2)return result})
}// 参数类型为NSStackBlock
let method = '+ autoLogin:session:callBack:'let impl = ObjC.classes.ALBBSessionRpcService[method]const oldImpl = impl.implementation;impl.implementation = ObjC.implement(impl, function(handle,selector,arg1,arg2,arg3) {try{console.log("arg1",new ObjC.Object(arg1))console.log("arg2",arg2,JSON.stringify(new ObjC.Object(arg2)))console.log("arg3",arg3,new ObjC.Object(arg3)) //此参数为NSStackBlockvar block = new ObjC.Block(arg3);const appCallback = block.implementation;block.implementation = function (resp) {console.log(resp) // ALBBResponseconst result = appCallback(resp);return result;};var ret = oldImpl(handle,selector,arg1,arg2,arg3);// console.log(ret)}catch(err){console.log(err)}return ret});
设置属性@property
let obj = ObjC.classes.ALBBRPCInfo['new']()
obj.token(); // 获取属性
obj['setToken:']('token值') // 设置属性
创建String类型
let arg1 = ObjC.classes.NSString['alloc']()['initWithString:']('我的字符串参数')
创建Block
const pendingBlocks = new Set();
let newReplyBlock = new ObjC.Block({// 类型签名,可以通过hook指定方法的block参数打印new ObjC.Block(resultCallback).typestypes:'v12@?0B8', implementation: function () {pendingBlocks.delete(newReplyBlock);}
});
获取指定类型的签名
ObjC.classes.Foo['- connection:didReceiveResponse:'].types
// 或
new ObjC.Block(resultCallback).types
获取指定对象的参数列表
obj.$ivars
###10. 调用指定方法
代码1
需要调用类的头文件
@interface ALBBSessionModel : NSObject
{
}
+ (id)getUserId;
调用代码
let userid = new ObjC.Object(ObjC.classes.ALBBSessionModel['+ getUserId']())
代码2
需要调用类的头文件
@interface JDYLoginCenterProtocolIMP : NSObject <JDYLoginCenterProtocol, JDYILoginService>
{
}
- (void)fastSwitchUserWithUserId:(id)arg1 resultCallback:(CDUnknownBlockType)arg2;
调用代码
let userid = ObjC.classes.NSString['alloc']()['initWithString:']('3109007973')
const pendingBlocks = new Set();var newReplyBlock = new ObjC.Block({types:'v12@?0B8',implementation: function () {pendingBlocks.delete(newReplyBlock);}
});let obj = ObjC.classes.JDYLoginCenterProtocolIMP['new']()
obj['- fastSwitchUserWithUserId:resultCallback:'](userid,newReplyBlock)
11. 日志查看
安装
brew install libimobiledevice
idevicesyslog日志查看工具
查看帮助
idevicesyslog --help
匹配关键字
idevicesyslog -m JDYLoginCenterProtocolIMP
更多关于frida的学习,可以参考
https://codeshare.frida.re/
ios逆向之frida简单教程相关推荐
- IOS逆向之frida安装
首先手机要越狱,这个就不说了,博主就是咸鱼搞了个160的苹果6, 自己刷到苹果6支持最新的12.5.7版本后越狱: 谁让他低版本,不支持 CrackerXI砸壳呢,当时你要是使用 frida-ios- ...
- ios逆向,tweak简洁使用教程
准备工作: .爱思助手 .一台已越狱的iphone,并已安装cydia . 安装Theos,安装教程就忽略了,Theos安装起来比较麻烦,主要是网络原因,这里提供一份绿色版本 https://down ...
- 2020年 IOS 逆向 反编译 注入修改游戏或APP的调用参数新手系列教程——使用theos tweak 注入hook修改游戏执行代码上传动态头像
2020年 IOS 逆向 反编译 注入修改游戏或APP的调用参数新手系列教程--使用theos tweak 注入hook修改游戏执行代码上传动态头像 开篇 需求&最终效果 环境要求与即将使用的 ...
- iOS逆向之脱壳工具creakerXI+,最简单、最适合新手的脱壳工具
在学习iOS逆向中,脱壳是必备技能之一,在网上看教程有使用 Clutch 和 dumpdecrypted 但是,不知道 是我操作问题,还是手机版本,以及APP版本更新问题 尝试了几次,都无法成功脱壳 ...
- ios逆向傻瓜入门教程(一)
1.准备工作: (1)一台越狱手机,并装有以下软件:cycript,openssh (2)下载工具库,内容列表: (3)在越狱手机上,从appstore上,下载WeChat(微信). 2.ssh到手机 ...
- app反爬测试之apk逆向分析-frida
前言: 目前为止,很多app的防护基本也还是用的ssl pinning检测证书. 因为,目前的app要么不用ssl,要么用就是一般的ssl,基本就是在手机上装个相关软件 的代理即可,而且这个代理基本就 ...
- 【iOS逆向与安全】iOS插件开发光速入门
前言 经过之前的学习,相信你已经能熟练的使用Frida-trace.IDA Pro等逆向工具.不过,仅仅到这肯定是不够的.接下来,学会把你逆向的结果打包成插件并运行,那iOS逆向,你也就真正的入门了. ...
- 精品连载丨安卓 App 逆向课程之二逆向神器 frida 的介绍
" 阅读本文大概需要 8 分钟. " 前面我们介绍了精品连载丨安卓 App 逆向课程一之环境配置,下面我们来接着介绍一个安卓 App 逆向大杀器-- frida. 前阵子受< ...
- app逆向(8)| frida和frida-rpc
文章目录 一.frida和frida-rpc 1.简单介绍 2.安装frida 二.了解app的hook 1.hook能干嘛 2.frida中使用implementation进行hook 3.hook ...
最新文章
- 详解深度学习中的Normalization,不只是BN(1)
- 问题清空easyui required=true的提示信息所在位置不对。乱跑的解决办法
- Java多线程编程那些事:volatile解惑--转
- Java(发布/订阅模式)
- 广播多路访问链路上的OSPF
- Scala学习笔记04:内建控制结构
- 【扫盲系列】网络术语
- 学车考试技巧(图解)
- 南充计算机职业学校有哪些专业,南充旅游计算机职业中专学校2020年招生简介...
- 滴滴Uber神州易到,共享出行四国军棋沙盘推演
- 2012服务器系统下怎么分区,Windows Server 2012之更改系统分区
- 1602实现计算机实验报告,LCD1602液晶显示实验报告
- HTML5期末大作业:体育网页设计——篮球专题6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计
- 区块链 Fisco bcos 智能合约(22)-全面的性能分析工具
- 沐神《动手学深度学习》使用笔记
- 抖音中的搞笑BGM如何提取,MP3转换器怎么使用
- unity塔防游戏怪物转向_家园保卫战红包版下载,家园保卫战赚钱游戏红包版 v1.0.5...
- 嵌入式 win7下配置开发环境和VS2010联合使用
- 教育技术学习《基于设计的研究与教育游戏设计应用》笔记
- Cadence原理图前期规范性检查步骤