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

小弟最近学习,实验了一下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)失败。

@snakeninny 求大神指教

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

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

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

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

可以试试在里面调用这个

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

怎么ok的?

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


字符串不输出。。。


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

// 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);
}
1 个赞

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

这个代码还是不执行

%hook NSString

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

%end

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

1 个赞

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

1 个赞

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

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

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

大大,我使用runtime swizzling hook了stringWithFormat 和 initWithFormat这两个方法,测试是都生效的,但现在有个疑问是,我在hook stringWithFormat中调用了initWithFormat,讲道理,进入my_stringWithFormat 中后调用initWithFormat应该会再进入my_initWithFormat,但测试结果没进入,想请问下是什么原因,代码贴个图:

这个不清楚