iOS hook [NSString stringWithFormat:]

Posted by 王劣劣 on October 18, 2018

在进行逆向开发时候,hook NSString的方法能获取到不少有用的信息,尤其是加密部分,但是对于[NSString stringWithFormat:arg1,...]这种带有可变参数的方法用常规写法好像并不起作用,所以考虑使用 runtime 手动来替换达到 hook 的目的.

代码如下

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 = [[NSString alloc] initWithFormat:obj1 arguments:args ];
    NSLog(@"NSString  stringWithFormat ---%@",result);
    va_end(args);
    return result;
}
//因为替换方法后可能会引起不必要的错误,所以尽量在需要进行 hook 的地方替换方法,使用完成后再还原回去
CHDeclareClass( testclass)
CHOptimizedClassMethod4(self,int, testclass,sign,id,arg1){
	//先获取原来的Method和IMP备用
 	Method originalMethod = class_getClassMethod(NSClassFromString( @"NSString" ), NSSelectorFromString( @"stringWithFormat:" ));
 	IMP originalIMP = method_getImplementation(originalMethod);
 	//设置方法的实现为自己的
	method_setImplementation(originalMethod, (IMP)stringWithFormat );
 	int result =CHSuper1(testclass, sign,arg1);
 	//执行完替换回原方法
 	method_setImplementation(originalMethod, (IMP) originalIMP );
 	return result;
}