小弟最近学习,实验了一下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 nil class argument for selector init
好像是%orig得传个值过去。比如传@”111“这样就不闪退了,请教下怎么传回原方法的值,用%orig(format)失败。
这个函数是个可变参数函数,貌似不支持使用MS来hook。Google一下,我记得有其他方法,但貌似要直接写汇编
因为format后面的参数个数不固定
- (instancetype)initWithFormat:(NSString *)format
arguments:(va_list)argList;
可以试试在里面调用这个
Zhang
2016 年9 月 18 日 14:32
7
参数是VALIST可以hook
Logos方法我不知道。
直接操作MS肯定是可以的
大神不行呀,虽然编译没有问题,但是程序不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
我看了了 不过 args这里会报错,因为上面并没有这个参数…
你要是有去搜initWithFormat:format
就能理解了, 用不着每次都贴完整可编译的代码…
sailor
(韭菜的自我修养)
2018 年12 月 13 日 02:17
23
大大,我使用runtime swizzling hook了stringWithFormat 和 initWithFormat这两个方法,测试是都生效的,但现在有个疑问是,我在hook stringWithFormat中调用了initWithFormat,讲道理,进入my_stringWithFormat 中后调用initWithFormat应该会再进入my_initWithFormat,但测试结果没进入,想请问下是什么原因,代码贴个图: