如何hook readonly 的 property

例如想修改UIDevice.h 中 name 的值 要怎么做呢?
@interface UIDevice : NSObject

@property(nonatomic,readonly,retain) NSString *name; // e.g. “My iPhone”
@property(nonatomic,readonly,retain) NSString *model; // e.g. @“iPhone”, @“iPod touch”
@property(nonatomic,readonly,retain) NSString *localizedModel; // localized version of model
@property(nonatomic,readonly,retain) NSString *systemName; // e.g. @“iOS”
@property(nonatomic,readonly,retain) NSString *systemVersion; // e.g. @“4.0”

@end

已解决 :grin:

readonly 的property 也是个方法。
hook这个方法就行。

-——————
竟然写着已解决……

嗯 多谢 :joy:后面自己想出来了

麻烦大神分享一下是怎么实现的呢?我是小白

麻烦大神分享一下是怎么实现的呢?我是小白

如果不用tweak的%hook 方式,那么在.m文件里面 怎么hook?

CaptainHook?

就是直接在mm文件里面使用MSHookMessageEx方式去hook

MSHookMessageEx 一样啊。。都是ObjectiveC的方法。

http://www.cydiasubstrate.com/api/c/MSHookMessageEx/

这里的例子就是个getter吧

NSString *(*oldDescription)(id self, SEL _cmd);

// implicit self and _cmd are explicit with IMP ABI
NSString *newDescription(id self, SEL _cmd) {
    NSString *description = (*oldDescription)(self, _cmd);
    description = [description stringByAppendingString:@"!"];
    return description;
}

MSHookMessageEx(
    [NSObject class], @selector(description),
    &newDescription, &oldDescription
);

直接输入官方的例子,然后命令行make出错

error: function definition is not allowed here
NSString *newDescription(id self, SEL _cmd) {
^
device.mm:467:22: error: use of undeclared identifier ‘newDescription’
&newDescription, &oldDescription
^
2 errors generated.

google下“error: function definition is not allowed here”

上面是c方法,不能放到oc的@end里面。貌似是这个问题

或者弄个最简单的可重现这个错误的例子?

亲,有qq么,可能说的更清楚一些 :sweat_smile:

或者弄个最简单的可重现这个错误的例子?

例如这样 https://stackoverflow.com/help/mcve

#import “ToolsView.h”
void MSHookMessageEx(Class _class, SEL sel, IMP imp, IMP *result);

NSString *(*oldDescription)(id self, SEL _cmd);

// implicit self and _cmd are explicit with IMP ABI
NSString *newDescription(id self, SEL _cmd) {
NSString *description = (*oldDescription)(self, _cmd);
description = [description stringByAppendingString:@"!"];
return description;
}

@implementation ToolsView

-(void)test{
MSHookMessageEx([NSObject class], @selector(description),&newDescription, &oldDescription);
}

@ end

标题头

就是在m文件最上面声明这个函数,然后在@implementation 里面 的方法里调用这个MSHookMessageEx

OK,我自己摸索成功了,官方的这个写法是有点问题的,我使用的 IMP 是可以的

牛!

那答案贴一下呀