请教一下怎么hook stringWithFormat这个方法


#1

小弟最近学习,实验了一下Hook nsstring的stringWithFormat方法,代码如下:
#import <Foundation/foundation.h>

%hook NSString

+(id)stringWithFormat:(NSString *)format
{

return %orig;
//NSLog(@"%@",a);

}

%end
特别简单,但是程序会闪退,看来一下错误内容,
Sep 18 15:38:29 iPhonet SpringBoard[4702]: MS:Warning: nil class argument for selector init
好像是%orig得传个值过去。比如传@”111“这样就不闪退了,请教下怎么传回原方法的值,用%orig(format)失败。


#2

@snakeninny 求大神指教


#4

这个函数是个可变参数函数,貌似不支持使用MS来hook。Google一下,我记得有其他方法,但貌似要直接写汇编


#5

大神 google 的关键字应该怎么写


#6

因为format后面的参数个数不固定

- (instancetype)initWithFormat:(NSString *)format 
                     arguments:(va_list)argList;

可以试试在里面调用这个


#7

参数是VALIST可以hook
Logos方法我不知道。
直接操作MS肯定是可以的


#10

怎么ok的?


#12

大神不行呀,虽然编译没有问题,但是程序不hook这段代码,也就是没有执行


字符串不输出。。。


#13


我只能说先有正向, 才能逆向
再给你贴段代码

// NSString + (id)stringWithFormat:(id) 
id __cdecl +[NSString stringWithFormat:](struct NSString *self, SEL a2, id a3)
{
  int v3; // r3@0
  id v4; // r4@1
  void *v5; // r0@1
  void *v6; // r0@1
  int vars8; // [sp+14h] [bp+8h]@1

  v4 = a3;
  vars8 = v3;
  v5 = objc_msgSend(self, sel_allocWithZone_, 0);
  v6 = objc_msgSend(v5, "initWithFormat:locale:arguments:", v4, 0, &vars8);
  return (id)objc_msgSend(v6, sel_autorelease);
}

#14

大神试了还是不行,您有联系方式么,打扰了。


#15

这个代码还是不执行


#16
%hook NSString

+(id)stringWithFormat:(NSString *)format
{
    return [[NSString alloc] initWithFormat:format arguments:args];
}

%end

#18

请问现在有解决方法了吗?


#19

自己解决了一下. 给有同样需求的做个参考 https://inferior.wang/2018/10/18/01-hookstringWithFormat/


#20

我上面不是写了, 你们都不看的吗


#21

我看了了 不过 args这里会报错,因为上面并没有这个参数…


#22

你要是有去搜initWithFormat:format就能理解了, 用不着每次都贴完整可编译的代码…