Frida中ObjC的变量类型

通用逻辑

  • 获取ObjC的某个类

    • 写法:ObjC.classes.someClassName == ObjC.classes[someClassName]
    • 举例

      ObjC.classes.NSMutableData.data()
      
      ObjC.classes.NSString.stringWithString_("Crifan Li")
      

ObjCObject

此处的第一个参数和后续的真正的函数的(第一个以及后续的其他)参数,往往是个(iOS中ObjC的)ClassInstance,在Frida中对应的叫做:

  • ObjCObject

ObjC的Object的常见的操作

  • 转换为ObjC的类

    const argSelf = args[0]
    const argSelfObj = new ObjC.Object(argSelf)
    
    const args2 = args[2]
    const args2Obj = new ObjC.Object(args2)
    // const args2Obj = new ObjC.Object(ptr(args2))
    

以及紧接着的:

  • 打印类的信息

      console.log("argSelfObj: ", argSelfObj)
    
      console.log("args2Obj: ", args2Obj)
    
    • 典型log输出

      argSelfObj:  <NSXPCConnection: 0x105744c00> connection from pid 46847 on mach service named com.apple.ak.auth.xpc
      
      args2Obj:  <AKAppleIDAuthenticationService: 0x102d3e4d0>
      
  • 以及,把Object转换成String字符串,再去打印
      const args2ObjStr = args2Obj.toString();
      console.log("args2ObjStr: ", args2ObjStr);
    
    • 典型log输出
      args2ObjStr:  <AKAppleIDAuthenticationService: 0x102d3e4d0>
      
      • 注:此处从调试输出类的信息的角度来说,往往Object转换成String后再输出的字符串,和上述直接打印Object的效果是一样的

ObjCObject特殊属性

对于Frida中的ObjC的Object,有很多内置的特殊的属性:

  • $kind
  • $super
  • $superClass
  • $class
  • $className
  • $moduleName
  • $protocols
  • $methods
  • $ownMethods
  • $ivars

所以,一些常见操作是:

$className

  • 查看(当前Object对象的)类名=类的名字

      const argSelfClassName = argSelfObj.$className;
      console.log("argSelfClassName: ", argSelfClassName);
    
      const args2ObjClassName = args2Obj.$className;
      console.log("args2ObjClassName: ", args2ObjClassName);
    
    • 典型log输出
          argSelfClassName:  NSXPCConnection
          args2ObjClassName:  AKAppleIDAuthenticationService
      

$kind

  • 查看(当前Object对象的)类型
      const argSelfKind = argSelfObj.$kind;
      console.log("argSelfKind:", argSelfKind);
    
    • 典型log输出
      argSelfKind: instance
      

$methods$ownMethods

  • 注意
    • 此处的$methods$ownMethods中的method
      • method的英文单词本意是:方法=函数
      • 但实际上此处:method = 类的property + 类的method
        • 注:
          • property=属性
          • method=方法=函数
  • 举例:$methods和$ownMethods

ObjCObject自己类的属性

而对于本身ObjC的类的属性,也是支持访问的:

  • 访问ObjC的自己类的属性的方式:把属性当做函数访问 -》加上括号()
    • 语法:iosObjcObj.propertyName()
    • 举例
      • 获取NSXPCConnection的serviceName
        • 对于Objc的Object对象:
          argSelfObj:  <NSXPCConnection: 0x105744c00> connection from pid 46847 on mach service named com.apple.ak.auth.xpc
          
          • 去获取其serviceName属性的代码:
              const connnServiceNameNSStr = argSelfObj.serviceName();
              console.log("connnServiceNameNSStr: ", connnServiceNameNSStr);
            
          • 输出log
            connnServiceNameNSStr:  com.apple.ak.auth.xpc
            
      • 获取NSString的UTF8String
        • 代码:
            const connnServiceNameJsStr = connnServiceNameNSStr.UTF8String();
            console.log("connnServiceNameJsStr: ", connnServiceNameJsStr);
          
          • 输出log
            connnServiceNameJsStr:  com.apple.ak.auth.xpc
            

ObjCObject自己类的函数

Frida中,是可以调用Objc中类的函数的。

举例:+[NSString stringWithString:]

ObjCNSString的原始函数:

+[NSString stringWithString:@"Hello World"]

根据规则:

  • 冒号=:变成下划线=_
  • 给函数加上括号()
  • 把参数放到括号()

而变成:

const { NSString } = ObjC.classes;
NSString.stringWithString_("Hello World");
  • 或另外一种写法:
    ObjC.classes.NSString.stringWithString_("Hello World");
    

举例:-[NSString cStringUsingEncoding:]

  • ObjC的函数-[NSString cStringUsingEncoding:]
    • -> Frida中的调用:
      const NSUTF8StringEncoding = 4;
      const curJsStr = curNsStr.cStringUsingEncoding_(NSUTF8StringEncoding)`
      

ObjCselector

ObjC中,有个稍微特殊一点的变量,叫做SEL=selector

也就是前面获取到的,第二个参数,类型是SEL

  • SEL的常见操作之一就是:转换成字符串,再去打印
    const argSel = args[1]
    const argSelStr = ObjC.selectorAsString(argSel);
    console.log("argSelStr: ", argSelStr);
    
    • 典型log输出
          argSelStr:  setExportedObject:
      

ObjCProtocol

ObjCBlock

results matching ""

    No results matching ""