首先,对NSString的stringWithFormat方法进行hook的代码如下:
#import
id stringWithFormat(id self, SEL op,id obj1, ...);
id stringWithFormat(id self, SEL op,id obj1, ...){
va_list args;
va_start(args, obj1);
//等价实现方法
NSString *result = [[NSMutableString alloc] initWithFormat:obj1 arguments:args ];
// NSLog(@"NSString stringWithFormat ---%@",result?:@"");
if (result.length == 32) {
NSLog(@"params:%@",obj1);
NSLog(@"shield found!%@",result);
NSLog(@"%@",[NSThread callStackSymbols]);
}
va_end(args);
return result;
}
static __attribute__((constructor)) void _logosLocalInit112() {
Method originalMethod = class_getClassMethod(NSClassFromString( @"NSString" ), NSSelectorFromString( @"stringWithFormat:" ));
method_setImplementation(originalMethod, (IMP)stringWithFormat );
}
打印的结果却不是我想要的那种主线程调用堆栈,如下:
(
0 ReTest.dylib 0x00000001086f7d48 stringWithFormat + 232
1 discover 0x00000001050d44fc _ZN6google8protobuf8internal21arena_destruct_objectIN2xy11fingerprint16TelephonyNetworkEEEvPv + 13399144
2 discover 0x00000001050d45d4 _ZN6google8protobuf8internal21arena_destruct_objectIN2xy11fingerprint16TelephonyNetworkEEEvPv + 13399360
3 discover 0x00000001050d7ae4 _ZN6google8protobuf8internal21arena_destruct_objectIN2xy11fingerprint16TelephonyNetworkEEEvPv + 13412944
4 discover 0x00000001050d7d48 _ZN6google8protobuf8internal21arena_destruct_objectIN2xy11fingerprint16TelephonyNetworkEEEvPv + 13413556
5 discover 0x00000001050d7c90 _ZN6google8protobuf8internal21arena_destruct_objectIN2xy11fingerprint16TelephonyNetworkEEEvPv + 13413372
6 discover 0x00000001050d70b4 _ZN6google8protobuf8internal21arena_destruct_
ReTest是我Tweak的name。
请问拿到这样的堆栈要如何解读呢?