Frida中ObjC的变量类型
通用逻辑
获取ObjC的某个类
- 写法:
ObjC.classes.someClassName
==ObjC.classes[someClassName]
举例
ObjC.classes.NSMutableData.data() ObjC.classes.NSString.stringWithString_("Crifan Li")
- 写法:
ObjC
的Object
此处的第一个参数和后续的真正的函数的(第一个以及后续的其他)参数,往往是个(iOS中ObjC的)Class
或Instance
,在Frida
中对应的叫做:
ObjC
的Object
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
的效果是一样的
- 注:此处从调试输出类的信息的角度来说,往往
- 典型log输出
ObjC
的Object
的特殊属性
对于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
- 典型log输出
$kind
- 查看(当前
Object
对象的)类型const argSelfKind = argSelfObj.$kind; console.log("argSelfKind:", argSelfKind);
- 典型log输出
argSelfKind: instance
- 典型log输出
$methods
和$ownMethods
- 注意
- 此处的
$methods
、$ownMethods
中的method
method
的英文单词本意是:方法
=函数
- 但实际上此处:
method
= 类的property
+ 类的method
- 注:
property
=属性
method
=方法
=函数
- 注:
- 此处的
- 举例:$methods和$ownMethods
ObjC
的Object
的自己类的属性
而对于本身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
- 去获取其serviceName属性的代码:
- 对于Objc的Object对象:
- 获取NSString的UTF8String
- 代码:
const connnServiceNameJsStr = connnServiceNameNSStr.UTF8String(); console.log("connnServiceNameJsStr: ", connnServiceNameJsStr);
- 输出log
connnServiceNameJsStr: com.apple.ak.auth.xpc
- 输出log
- 代码:
- 获取NSXPCConnection的serviceName
- 语法:
ObjC
的Object
的自己类的函数
Frida中,是可以调用Objc中类的函数的。
举例:+[NSString stringWithString:]
ObjC
中NSString
的原始函数:
+[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)`
- -> Frida中的调用:
ObjC
的selector
ObjC
中,有个稍微特殊一点的变量,叫做SEL
=selector
也就是前面获取到的,第二个参数,类型是SEL
SEL
的常见操作之一就是:转换成字符串,再去打印const argSel = args[1] const argSelStr = ObjC.selectorAsString(argSel); console.log("argSelStr: ", argSelStr);
- 典型log输出
argSelStr: setExportedObject:
- 典型log输出