翼度科技»论坛 编程开发 python 查看内容

Frida-trace常用命令

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
转载:https://blog.csdn.net/tslx1020/article/details/128250777
1、spawn - 冷启动
  1. frida-trace -U -f com.apple.ExampleCode -m “+[NSURL URLWithString:]"
复制代码
2、attach - 热启动
  1. frida-trace -UF -m “+[NSURL URLWithString:]"
复制代码
3、Hook类方法
  1. frida-trace -UF -m “+[NSURL URLWithString:]"
复制代码
4、Hook实例方法
  1. frida-trace -UF -m “-[NSURL host]"
复制代码
5、Hook类的所有方法
  1. frida-trace -UF -m “*[NSURL *]"
复制代码
6、模糊Hook类的所有方法
  1. frida-trace -UF -m “*[service *]"
复制代码
7、模糊Hook所有类的特定方法
  1. frida-trace -UF -m “[ sign]"
复制代码
8、模糊Hook所有类的特定方法并忽略大小写

假设我们要hook所有类中包含getSign或getsign关键词的方法
  1. frida-trace -UF -m “[ get?ign]"
复制代码
9、模糊Hook所有类的特定方法并排除viewDidLoad方法
  1. frida-trace -UF -m “*[DetailViewController *]" -M “-[DetailViewController viewDidLoad]"
复制代码
10、Hook某个动态库
  1. frida-trace -UF -I “libcommonCrypto*"
复制代码
11、Hook get或post的接口地址
  1. frida-trace -UF -m "+[NSURL URLWithString:]"
复制代码
js例子
  1. {
  2.   onEnter(log, args, state) {
  3.     var args2 = new ObjC.Object(args[2]);
  4.     log(`-[NSURL URLWithString:${args2}]`);
  5.   },
  6.   onLeave(log, retval, state) {
  7.   }
  8. }
复制代码
12、Hook post的body
  1. frida-trace -UF -m “-[NSMutableURLRequest setHTTPBody:]”
复制代码
js例子
  1. {
  2.   onEnter(log, args, state) {
  3.     var args2 = new ObjC.Object(args[2]);
  4.     log(`-[NSMutableURLRequest setHTTPBody:${args2.bytes().readUtf8String(args2.length())}]`);
  5.   },
  6.   onLeave(log, retval, state) {
  7.   }
  8. }
复制代码
13、Hook即将显示页面
  1. frida-trace -UF -m “-[UINavigationController pushViewController:animated:]” -m “-[UIViewController presentViewController:animated:completion:]”
  2. pushViewController:animated:方法的js代码如下:
  3. {
  4.   onEnter(log, args, state) {
  5.     var args2 = new ObjC.Object(args[2]);
  6.     log(`-[UINavigationController pushViewController:${args2.$className} animated:${args[3]}]`);
  7.   },
  8.   onLeave(log, retval, state) {
  9.   }
  10. }
  11. presentViewController:animated:completion:
  12. {
  13.   onEnter(log, args, state) {
  14.     var args2 = new ObjC.Object(args[2]);
  15.     log(`-[UIViewController presentViewController:${args2.$className} animated:${args[3]} completion:${args[4]}]`);
  16.   },
  17.   onLeave(log, retval, state) {
  18.   }
  19. }
复制代码
14、Hook 通用加密算法

Md5
  1. frida-trace -UF -i “CC_MD5”
  2. #js
  3. {
  4.   onEnter(log, args, state) {
  5.     this.args0 = args[0];        // 入参
  6.     this.args2 = args[2];        // 返回值指针
  7.   },
  8.   onLeave(log, retval, state) {
  9.     var ByteArray = Memory.readByteArray(this.args2, 16);
  10.     var uint8Array = new Uint8Array(ByteArray);
  11.     var str = "";
  12.     for(var i = 0; i < uint8Array.length; i++) {
  13.         var hextemp = (uint8Array[i].toString(16))
  14.         if(hextemp.length == 1){
  15.             hextemp = "0" + hextemp
  16.         }
  17.         str += hextemp;
  18.     }
  19.     log(`CC_MD5(${this.args0.readUtf8String()})`);           // 入参
  20.     log(`CC_MD5()=${str}=`);        // 返回值
  21.   }
  22. }
复制代码
Base64编码方法
  1. frida-trace -UF -m “-[NSData base64EncodedStringWithOptions:]”
  2. #js
  3. {
  4.   onEnter(log, args, state) {
  5.     this.self = args[0];
  6.   },
  7.   onLeave(log, retval, state) {
  8.     var before = ObjC.classes.NSString.alloc().initWithData_encoding_(this.self, 4);
  9.     var after = new ObjC.Object(retval);
  10.     log(`-[NSData base64EncodedStringWithOptions:]before=${before}=`);
  11.     log(`-[NSData base64EncodedStringWithOptions:]after=${after}=`);
  12.   }
  13. }
复制代码
Base64解码
  1. frida-trace -UF -m “-[NSData initWithBase64EncodedData:options:]” -m “-[NSData initWithBase64EncodedString:options:]”
  2. initWithBase64EncodedData:options:方法对应的js代码如下:
  3. {
  4.   onEnter(log, args, state) {
  5.     this.arg2 = args[2];
  6.   },
  7.   onLeave(log, retval, state) {
  8.     var before = ObjC.classes.NSString.alloc().initWithData_encoding_(this.arg2, 4);
  9.     var after = ObjC.classes.NSString.alloc().initWithData_encoding_(retval, 4);
  10.     log(`-[NSData initWithBase64EncodedData:]before=${before}=`);
  11.     log(`-[NSData initWithBase64EncodedData:]after=${after}=`);
  12.   }
  13. }
  14. initWithBase64EncodedString:options:方法对应的js代码如下:
  15. {
  16.   onEnter(log, args, state) {
  17.     this.arg2 = args[2];
  18.   },
  19.   onLeave(log, retval, state) {
  20.     var before = new ObjC.Object(this.arg2);
  21.     var after = ObjC.classes.NSString.alloc().initWithData_encoding_(retval, 4);
  22.     log(`-[NSData initWithBase64EncodedString:]before=${before}=`);
  23.     log(`-[NSData initWithBase64EncodedString:]after=${after}=`);
  24.   }
  25. }
复制代码
加密函数AES、DES、3DES
  1. frida-trace -UF -i CCCrypt
  2. #js
  3. {
  4.         onEnter: function(log, args, state) {
  5.                 this.op = args[0]
  6.                 this.alg = args[1]
  7.                 this.options = args[2]
  8.                 this.key = args[3]
  9.                 this.keyLength = args[4]
  10.                 this.iv = args[5]
  11.                 this.dataIn = args[6]
  12.                 this.dataInLength = args[7]
  13.                 this.dataOut = args[8]
  14.                 this.dataOutAvailable = args[9]
  15.                 this.dataOutMoved = args[10]
  16.                 log('CCCrypt(' +
  17.                         'op: ' + this.op + '[0:加密,1:解密]' + ', ' +
  18.                         'alg: ' + this.alg + '[0:AES128,1:DES,2:3DES]' + ', ' +
  19.                         'options: ' + this.options + '[1:ECB,2:CBC,3:CFB]' + ', ' +
  20.                         'key: ' + this.key + ', ' +
  21.                         'keyLength: ' + this.keyLength + ', ' +
  22.                         'iv: ' + this.iv + ', ' +
  23.                         'dataIn: ' + this.dataIn + ', ' +
  24.                         'inLength: ' + this.inLength + ', ' +
  25.                         'dataOut: ' + this.dataOut + ', ' +
  26.                         'dataOutAvailable: ' + this.dataOutAvailable + ', ' +
  27.                         'dataOutMoved: ' + this.dataOutMoved + ')')
  28.                 if (this.op == 0) {
  29.                         log("dataIn:")
  30.                         log(hexdump(ptr(this.dataIn), {
  31.                                 length: this.dataInLength.toInt32(),
  32.                                 header: true,
  33.                                 ansi: true
  34.                         }))
  35.                         log("key: ")
  36.                         log(hexdump(ptr(this.key), {
  37.                                 length: this.keyLength.toInt32(),
  38.                                 header: true,
  39.                                 ansi: true
  40.                         }))
  41.                         log("iv: ")
  42.                         log(hexdump(ptr(this.iv), {
  43.                                 length: this.keyLength.toInt32(),
  44.                                 header: true,
  45.                                 ansi: true
  46.                         }))
  47.                 }
  48.         },
  49.         onLeave: function(log, retval, state) {
  50.                 if (this.op == 1) {
  51.                         log("dataOut:")
  52.                         log(hexdump(ptr(this.dataOut), {
  53.                                 length: Memory.readUInt(this.dataOutMoved),
  54.                                 header: true,
  55.                                 ansi: true
  56.                         }))
  57.                         log("key: ")
  58.                         log(hexdump(ptr(this.key), {
  59.                                 length: this.keyLength.toInt32(),
  60.                                 header: true,
  61.                                 ansi: true
  62.                         }))
  63.                         log("iv: ")
  64.                         log(hexdump(ptr(this.iv), {
  65.                                 length: this.keyLength.toInt32(),
  66.                                 header: true,
  67.                                 ansi: true
  68.                         }))
  69.                 } else {
  70.                         log("dataOut:")
  71.                         log(hexdump(ptr(this.dataOut), {
  72.                                 length: Memory.readUInt(this.dataOutMoved),
  73.                                 header: true,
  74.                                 ansi: true
  75.                         }))
  76.                 }
  77.                 log("CCCrypt did finish")
  78.         }
  79. }
复制代码
RSA
  1. frida-trace -UF -i “SecKeyEncrypt” -i “SecKeyRawSign”
  2. SecKeyEncrypt公钥加密函数对应的js代码如下:
  3. {
  4.   onEnter(log, args, state) {
  5.     // 由于同一条加密信息可能会多次调用该函数,故在这输出该函数的调用栈。可根据栈信息去分析上层函数
  6.     log(`SecKeyEncrypt()=${args[2].readCString()}=`);
  7.     log('SecKeyEncrypt called from:\n' +
  8.         Thread.backtrace(this.context, Backtracer.ACCURATE)
  9.         .map(DebugSymbol.fromAddress).join('\n') + '\n');
  10.   },
  11.   onLeave(log, retval, state) {
  12.   }
  13. }
  14. SecKeyRawSign私钥加密函数对应的js代码如下:
  15. {
  16.   onEnter(log, args, state) {
  17.     log(`SecKeyRawSign()=${args[2].readCString()}=`);
  18.     log('SecKeyRawSign called from:\n' +
  19.         Thread.backtrace(this.context, Backtracer.ACCURATE)
  20.         .map(DebugSymbol.fromAddress).join('\n') + '\n');
  21.   },
  22.   onLeave(log, retval, state) {
  23.   }
  24. }
复制代码
15.修改方法的入参
  1. frida-trace -UF -m “-[DetailViewController setObj:]”
  2. #js
  3. /*
  4. * Auto-generated by Frida. Please modify to match the signature of -[DetailViewController setObj:].
  5. * This stub is currently auto-generated from manpages when available.
  6. *
  7. * For full API reference, see: https://frida.re/docs/javascript-api/
  8. */
  9. {
  10.   /**
  11.    * Called synchronously when about to call -[DetailViewController setObj:].
  12.    *
  13.    * @this {object} - Object allowing you to store state for use in onLeave.
  14.    * @param {function} log - Call this function with a string to be presented to the user.
  15.    * @param {array} args - Function arguments represented as an array of NativePointer objects.
  16.    * For example use args[0].readUtf8String() if the first argument is a pointer to a C string encoded as UTF-8.
  17.    * It is also possible to modify arguments by assigning a NativePointer object to an element of this array.
  18.    * @param {object} state - Object allowing you to keep state across function calls.
  19.    * Only one JavaScript function will execute at a time, so do not worry about race-conditions.
  20.    * However, do not use this to store function arguments across onEnter/onLeave, but instead
  21.    * use "this" which is an object for keeping state local to an invocation.
  22.    */
  23.   onEnter(log, args, state) {
  24.     var self = new ObjC.Object(args[0]);  // 当前对象
  25.     var method = args[1].readUtf8String();  // 当前方法名
  26.     log(`[${self.$className} ${method}]`);
  27.     // 字符串
  28.     // var str = ObjC.classes.NSString.stringWithString_("hi wit!")  // 对应的oc语法:NSString *str = [NSString stringWithString:@"hi with!"];
  29.     // args[2] = str  // 修改入参为字符串
  30.     // 数组
  31.     // var array = ObjC.classes.NSMutableArray.array();  // 对应的oc语法:NSMutableArray array = [NSMutablearray array];
  32.     // array.addObject_("item1");  // 对应的oc语法:[array addObject:@"item1"];
  33.     // array.addObject_("item2");  // 对应的oc语法:[array addObject:@"item2"];
  34.     // args[2] = array; // 修改入参为数组
  35.     // 字典
  36.     // var dictionary = ObjC.classes.NSMutableDictionary.dictionary(); // 对应的oc语法:NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
  37.     // dictionary.setObject_forKey_("value1", "key1"); // 对应的oc语法:[dictionary setObject:@"value1" forKey:@"key1"]
  38.     // dictionary.setObject_forKey_("value2", "key2"); // 对应的oc语法:[dictionary setObject:@"value2" forKey:@"key2"]
  39.     // args[2] = dictionary; // 修改入参为字典
  40.     // 字节
  41.     var data = ObjC.classes.NSMutableData.data(); // 对应的oc语法:NSMutableData *data = [NSMutableData data];
  42.     var str = ObjC.classes.NSString.stringWithString_("hi wit!")  // 获取一个字符串。 对应的oc语法:NSString *str = [NSString stringWithString:@"hi with!"];
  43.     var subData = str.dataUsingEncoding_(4);  // 将str转换为data,编码为utf-8。对应的oc语法:NSData *subData = [str dataUsingEncoding:NSUTF8StringEncoding];
  44.     data.appendData_(subData);  // 将subData添加到data。对应的oc语法:[data appendData:subData];
  45.     args[2] = data; // 修改入参字段
  46.     // 更多数据类型:https://developer.apple.com/documentation/foundation
  47.   },
  48.   onLeave(log, retval, state) {
  49.   }
  50. }
复制代码
16、修改方法的返回值
  1. frida-trace -UF -m “-[DetailViewController Obj]”
  2. #js
  3. {
  4.   onEnter(log, args, state) {
  5.   },
  6.   onLeave(log, retval, state) {
  7.     // 字符串
  8.     var str = ObjC.classes.NSString.stringWithString_("hi wit!")  // 对应的oc语法:NSString *str = [NSString stringWithString:@"hi with!"];
  9.     retval.replace(str)  // 修改返回值
  10.     var after = new ObjC.Object(retval); // 打印出来是个指针时,请用该方式转换后再打印
  11.     log(`before:=${retval}=`);
  12.     log(`after:=${after}=`);
  13.   }
  14. }
复制代码
17、打印字符串、数组、字典
  1. frida-trace -UF -m “-[DetailViewController setObj:]”
  2. {
  3.   onEnter(log, args, state) {
  4.     var self = new ObjC.Object(args[0]);  // 当前对象
  5.     var method = args[1].readUtf8String();  // 当前方法名
  6.     log(`[${self.$className} ${method}]`);
  7.     var before = args[2];
  8.     // 注意,日志输出请直接使用log函数。不要使用console.log()
  9.     var after = new ObjC.Object(args[2]); // 打印出来是个指针时,请用该方式转换后再打印
  10.     log(`before:=${before}=`);
  11.     log(`after:=${after}=`);
  12.   },
  13.   onLeave(log, retval, state) {
  14.   }
  15. }
复制代码
18、打印NSData
  1. frida-trace -UF -m “-[DetailViewController setObj:]”
  2. #js
  3. {
  4.   onEnter(log, args, state) {
  5.     var self = new ObjC.Object(args[0]);  // 当前对象
  6.     var method = args[1].readUtf8String();  // 当前方法名
  7.     log(`[${self.$className} ${method}]`);
  8.     var before = args[2];
  9.     // 注意,日志输出请直接使用log函数。不要使用console.log()
  10.    
  11.     var after = new ObjC.Object(args[2]); // 打印NSData
  12.     var outValue = after.bytes().readUtf8String(after.length()) // 将data转换为string
  13.     log(`before:=${before}=`);
  14.     log(`after:=${outValue}=`);
  15.   },
  16.   onLeave(log, retval, state) {
  17.   }
  18. }
复制代码
19、打印对象的所有属性和方法

[code]frida-trace -UF -m “-[DetailViewController setObj:]”#js{  onEnter(log, args, state) {    var self = new ObjC.Object(args[0]);  // 当前对象    var method = args[1].readUtf8String();  // 当前方法名    log(`[${self.$className} ${method}]`);    var customObj = new ObjC.Object(args[2]); // 自定义对象    // 打印该对象所有属性    var ivarList = customObj.$ivars;    for (key in ivarList) {       log(`key${key}=${ivarList[key]}=`);    }    // 打印该对象所有方法    var methodList = customObj.$methods;    for (var i=0; i

举报 回复 使用道具