首页
社区
课程
招聘
[原创](calleng逆向日记)Frida前置知识, ObjC runtime的"反射" KVC 实例代码理解和分析
发表于: 2023-10-5 16:12 4705

[原创](calleng逆向日记)Frida前置知识, ObjC runtime的"反射" KVC 实例代码理解和分析

2023-10-5 16:12
4705

入门学习逆向的个人笔记,预览(欢迎探讨)

  • C/C++的学习和数据结构

[原创] [calleng的逆向日记] 22y11m-23y3m29d 实现macOS编辑, iOS端编译和调试C/C++
[原创] [calleng的逆向日记] 23/03/30 (C++概念构建篇01) 补充完毕
[分享] [calleng的逆向日记] 22y11m-23y6m7d Win10Arm下的 gdb调试.[数据结构/严蔚敏-之迷宫问题]

  • iOS的学习和逆向

[分享] IOS软件安全工程师技能表(2017.7by非虫) (为自己学习导航) 图片不清楚下面有导图下载
[分享] Frida-Tool的一些 介绍, 和在 iOS下的一些用法 [个人笔记汇总]
[原创] [calleng的逆向日记] 弹窗的修改原理-OC篇 [源码学习和HOOK实践]23/09/24 --待续
[讨论] [calleng的逆向日记] 自学iOS逆向时候,如何自己解决问题.
[分享] [calleng逆向日记] iOS crackMe的破解 与 Frida(Objection) 的入门使用(thanks to roysue)
[分享] (iOS Hook原理,OC底层实现)Frida前置知识的(royuse)的一些知识注解(图片三次压缩失真,详情见附件)
[原创] (calleng逆向日记)Frida前置知识, ObjC runtime的"反射"-KVC-实例代码理解和分析
[分享] [calleng的逆向日记] Frida 前置知识, 类与方法的底层实现, 逻辑批注, (参考AloneMonkey的书)
[原创] (calleng逆向日记)Frida前置知识, ObjC runtime的"反射" KVC实例Demo分析第二部(Demo底部下载)
[分享] [calleng的逆向日记] iOS crackMe and Frida(Objection) Get Started (Oct,16th)
[分享] [calleng的逆向日记] Frida在iOS上内存漫游与黑盒调用 Get Started Section 4


KVC 实例代码

Author.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//
//  Author.h
//  KVC-example
//
//  Created by calleng on 2023/10/5.
//
 
#import <Foundation/Foundation.h>
#import "Publish.h"
 
NS_ASSUME_NONNULL_BEGIN
 
@interface Author : NSObject
 
@property (nonatomic, copy) NSString *name;
 
@property (nonatomic, assign) NSInteger age;
 
@property (nonatomic, strong) Publish  *publish;
 
- (void)test;
 
@end
 
NS_ASSUME_NONNULL_END

Publish.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//
//  Publish.h
//  KVC-example
//
//  Created by calleng on 2023/10/5.
//
 
#import <Foundation/Foundation.h>
 
NS_ASSUME_NONNULL_BEGIN
 
@interface Publish : NSObject
 
@property (nonatomic, copy) NSString        *title;
 
@property (nonatomic, assign) double        publishTime;
 
@end
 
NS_ASSUME_NONNULL_END

ViewController.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//
//  ViewController.m
//  KVC-example
//
//  Created by calleng on 2023/10/5.
//
 
#import "ViewController.h"
#import "Publish.h"
#import "Author.h"
 
@interface ViewController ()
 
@property (nonatomic, strong) Author *author;
 
@property (nonatomic, strong) Publish *publish;
 
@end
 
 
 
@implementation ViewController
 
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
     
    self.publish = [[Publish alloc] init];
    self.author = [[Author alloc] init];
 
    [self setValue];
    [self getValue];
 
}
 
- (void)setValue
{
    //setValue
    [self.author setValue:@"calleng" forKey:@"name"];
    [self.author setValue:@(29) forKey:@"age"];
    [self.publish setValue:@(20231005) forKeyPath:@"publishTime"];
     
     
//    [self.author setValue:self.publish forKey:@"publish"];//将 author 对象的 publish 属性设置为 publish 对象。
     
    [self.author setValue:@"KVC example" forKeyPath:@"publish.title"];
     
//    [self.author setValue:self.publish forKeyPath:@"publish"];
     
     
    NSLog(@"\n\n作者名字 - %@, 作者年纪 - %ld\n",
          self.author.name,
          (long)self.author.age);
    NSLog(@"\n\n作者发布的书名  self.author.publish.title = %@, self.author.publish.publishTime =  %f\n",
          self.author.publish.title,
          self.author.publish.publishTime
          );
}
 
- (void)getValue
{
    NSString *authorName = [self.author valueForKey:@"name"];
    NSInteger authorAge = [[self.author valueForKeyPath:@"age"]integerValue];
     
    Publish *publish = [self.author valueForKey:@"publish"];
    NSString *publishTitle1 = [publish valueForKeyPath:@"title"];
    NSString *publishTitle2 = [self.author valueForKeyPath:@"publish.title"];
 
    double publishTime1 = [[publish valueForKey:@"publishTime"] doubleValue];
    double publishTime2 = [[self.author valueForKeyPath:@"publish.publishTime"] doubleValue];
     
    NSLog(@"\n\n 作者名字 :  %@, 年纪: %lu \n", authorName, authorAge);
     
    NSLog(@"\n\n 发布的书名: \n publishTitle1 = %@  publishTitle2 = %@, \n 发布的时间: \n publishTime1 = %f publishTime2 = %f",
          publishTitle1, publishTitle2,
          publishTime1, publishTime2
          );
}
 
 
@end

这里的Author类型中, 包含3个属性: name属性 , age属性, Publish类型的 publish属性

Publish类型中包含, title属性, publishTime属性

实际代码的结构类似于, 作者这个类中,包含 发布的这个子类,

关键代码

  • [self.author setValue:self.publish forKey:@"publish"];//将 author 对象的 publish 属性设置为 publish 对象。
  • 否则 [self.author setValue:@"KVC example" forKeyPath:@"publish.title"]; 里的点语法路径访问不会起作用.


重要语句注释

1 [self.author setValue:self.publish forKey:@"publish"];这行代码将 self.publish 对象的值设置给 self.author 对象的 publish 属性。
2 [self.author setValue:@"KVC example" forKeyPath:@"publish.title"];
这行代码尝试将字符串 "KVC example" 设置为 self.author 对象的 publish 属性的 title 子属性的值。键路径 "publish.title" 指定了要设置的属性是 self.author 的 publish 属性的 title 子属性。这将更改 self.author 对象的 publish.title 子属性的值。

3 [self.author setValue:self.publish forKeyPath:@"publish"];这行代码将 self.publish 对象的值设置给了 self.author 对象的 publish 属性。

需要注意的是,第二行代码中的键路径 "publish.title" 指定了要设置的属性是 self.author 的 publish 属性的 title 子属性。这将更改 self.author 对象的 publish.title 子属性的值,而不是直接设置 self.author 的 publish 属性的值。
因此,这三行代码中,第一行和第三行代码都成功设置了 self.author 的 publish 属性的值,而第二行代码成功设置了 self.author 的 publish.title 子属性的值。

  • Publish *publish = [self.author valueForKey:@"publish"];
    这行代码从 self.author 对象中获取 publish 属性的值。由于 publish 属性的类型是 Publish,因此你将这个值存储在 publish 变量中。

  • NSString *publishTitle2 = [self.author valueForKeyPath:@"publish.title"];这行代码通过键路径 "publish.title" 获取 self.author 对象的 publish 属性的 title 子属性的值。这相当于嵌套访问属性,先获取 publish 属性,然后再获取其 title 子属性。

  • double publishTime2 = [[self.author valueForKeyPath:@"publish.publishTime"] doubleValue];这行代码通过键路径 "publish.publishTime" 获取 self.author 对象的 publish 属性的 publishTime 子属性的值。这也是嵌套访问属性,先获取 publish 属性,然后再获取其 publishTime 子属性的值。

以上关键code演示了如何使用 KVC 来获取对象的属性值,包括直接访问属性和使用键路径访问嵌套属性。键路径允许你访问对象图中的多个级别的属性。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2023-11-8 00:25 被calleng编辑 ,原因: 修改大纲,填充内容
上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 3090
活跃值: (30881)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2023-10-5 20:06
1
游客
登录 | 注册 方可回帖
返回
//