ios frida 操作记录

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

感谢大佬
感谢大佬

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容