frida 基础
在越狱 iOS 上打开 Cydia 添加源:https://build.frida.re或安全论坛源http://apt.ioshacker.net,如果 iOS 设备是 64 位的安装 Frida,如果是 32 位的安装 Frida for 32-bit devices。
1. frida-ls-devices
frida-ls-devices 用于查看当前的设备列表,一般在多个设备连接时会用到,它能显示当前所有连接设备的 Id,这个 Id 实际上就是设备的 UDID,获取的信息如下:
$ frida-ls-devices
Id Type Name
---------------------------------------- ------ ------------
local local Local System
cca1b9055ac2684999cd81e525ac03fe6028b9f9 usb iPhone
tcp remote Local TCP
2. frida-ps
frida-ps 用于查看设备上当前所有运行的进程,我们来查看它的帮助信息:
$ frida-ps -h
Usage: frida-ps [options]
Options:
--version 显示版本号
-h, --help 显示此帮助信息并退出
-D ID, --device=ID 连接到具有给定 ID 的设备
-U, --usb 连接 USB 设备。
-R, --remote 连接到远程frida-server
-H HOST, --host=HOST 连接到 HOST 上的远程 frida-server
-a, --applications 只显示正在运行的应用。
-i, --installed 显示所有已安装的应用。
下面这几个参数是比较重要,使用最多的:
--version 显示版本号。
-D 指定需要连接的设备 UDID,在多个设备连接时才会用到,如果只有一个设备不必用它。
-U 连接 USB 设备。
-a 只显示正在运行的应用。
-i 显示所有已安装的应用。
接下来我们看看实际操作 frida-ps 几个用法:
(1) 查看进程 USB 设备的进程,这里查看到的是所有正在运行的进程,包括 Daemon(守护程序)。
$ frida-ps -U
PID Name
--- --------------------------------------------------------
1087 Cydia
647 doubleH3lix
229 ReportCrash
39 wifid
......
还可以使用 grep 进行过滤,比如只需要查看 Cydia。
$ frida-ps -U | grep Cydia
1087 Cydia
(2) 查看正在运行的应用。
PID Name Identifier
---- ----------- -------------------------
1161 App Store com.apple.AppStore
1087 Cydia com.saurik.Cydia
1167 Safari com.apple.mobilesafari
......
(3) 查看所有安装的应用。
frida-ps -U -a -i
PID Name Identifier
---- --------------- -------------------------------
1161 App Store com.apple.AppStore
1087 Cydia com.saurik.Cydia
1167 Safari com.apple.mobilesafari
1163 电话 com.apple.mobilephone
- QQ com.tencent.mqq
- 邮件 com.apple.mobilemail
- 音乐 com.apple.Music
......
(4) 如果有多个设备时,可以指定查看某个设备的进程。
frida-ps -D cca1b9055ac2684999cd81e525ac03fe6028b9f9 -a -i
3. frida-kill
frida-kill 用于结束进程,需要指定应用名称或 PID,比如结束 App Store 进程
frida-kill -U "App Store"
如果 App Store 进程的 PID 是 1161
frida-kill -U 1161
4. frida-trace
frida-trace 用于跟踪函数或者 Objective-C 方法的调用,frida-trace -h 能够查看它的帮助,最重要的有下面几个参数:
-i 跟踪某个函数
-x 排除某个函数
-m 跟踪某个 Objective-C 方法
-M 排除某个 Objective-C 方法
-a 跟踪某一个地址,需要指名模块的名称
frida-trace跟踪,命令如下:
$ frida-trace -U -i CCCrypt xxx
Instrumenting functions...
CCCrypt: Auto-generated handler at "/Users/exchen/xxx/__handlers__/xxx/CCCrypt.js"
Started tracing 1 function. Press Ctrl+C to stop.
ctrl + c 可终止frida
IOS 常用加密库
CCCrypt 函数原型
CCCryptorStatus CCCrypt(
CCOperation op, //kCCEncrypt为加密,kCCDecrypt为解密
CCAlgorithm alg, //加密方式 kCCAlgorithmAES128为AES加密
CCOptions options, //增充方式
const void *key, //密钥
size_t keyLength, //密钥长度
const void *iv, // IV
const void *dataIn, //待加密的原文
size_t dataInLength, //原文长度
void *dataOut, //加密后输出的数据
size_t dataOutAvailable,
size_t *dataOutMoved)
CCCrypt 吐出模型
{
onEnter: function (log, args, state) {
log("CCCrypt(" +
"op=" + args[0] +
", alg=" + args[1] +
", options=" + args[2] +
", key=" + args[3] +
", keyLength=" + args[4] +
", iv=" + args[5] +
", dataIn=" + args[6] +
", dataInLength=" + args[7] +
", dataOut=" + args[8] +
", dataOutAvailable=" + args[9] +
", dataOutMoved=" + args[10] +
")");
//保存参数
this.operation = args[0]
this.CCAlgorithm = args[1]
this.CCOptions = args[2]
this.keyBytes = args[3]
this.keyLength = args[4]
this.ivBuffer = args[5]
this.inBuffer = args[6]
this.inLength = args[7]
this.outBuffer = args[8]
this.outLength = args[9]
this.outCountPtr = args[10]
//this.operation == 0 代表是加密
if (this.operation == 0) {
//打印加密前的原文
console.log("In buffer:")
console.log(hexdump(ptr(this.inBuffer), {
length: this.inLength.toInt32(),
header: true,
ansi: true
}))
//打印密钥
console.log("Key: ")
console.log(hexdump(ptr(this.keyBytes), {
length: this.keyLength.toInt32(),
header: true,
ansi: true
}))
//打印 IV
console.log("IV: ")
console.log(hexdump(ptr(this.ivBuffer), {
length: this.keyLength.toInt32(),
header: true,
ansi: true
}))
}
},
onLeave: function (log, retval, state) {
}
}
CC_MD5 函数模型
CC_MD5(fooData, (CC_LONG)strlen(fooData), result);
参数1:要加密的字符串
参数2: 获取要加密字符串的长度
参数3: 接收结果的数组
返回一个32位长度的加密后的字符串
CC_MD5 吐出算法

mmbizpngGrTTsqWuEcfGR6VezTicMIMcV87libFaekfn1nPOib5lsLWE442LYTleBkjEetiagJORvFFO04ic10AbojemY5ytJwQ640.png
CC_SHA1 函数模型
CC_SHA1(data.bytes, data.length, digest);
CC_SHA1 ( const void *data, CC_LONG len, unsigned char *md);
CC_SHA1 吐出算法
CCHmac 函数模型
核心方法
void CCHmac(
CCHmacAlgorithm algorithm, /* kCCHmacAlgSHA1, kCCHmacAlgMD5 */
const void *key,
size_t keyLength, /* length of key in bytes */
const void *data,
size_t dataLength, /* length of data in bytes */
void *macOut) /* MAC written here */
__OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);
CCHmac 吐出算法
iOS官方封装了自己统一的Crypto库:
CommonCryptor.h/CommonDigest.h/CommonHMAC.h,