22
22
23
23
@implementation CDLCSegment
24
24
{
25
+ struct segment_command_64 _segmentCommand; // 64-bit, also holding 32-bit
26
+
25
27
NSString *_name;
26
28
NSArray *_sections;
27
29
@@ -31,67 +33,76 @@ @implementation CDLCSegment
31
33
- (id )initWithDataCursor : (CDMachOFileDataCursor *)cursor ;
32
34
{
33
35
if ((self = [super initWithDataCursor: cursor])) {
34
- _name = nil ;
35
- _sections = nil ;
36
- _decryptedData = nil ;
36
+ _segmentCommand.cmd = [cursor readInt32 ];
37
+ _segmentCommand.cmdsize = [cursor readInt32 ];
38
+
39
+ _name = [cursor readStringOfLength: 16 encoding: NSASCIIStringEncoding];
40
+ memcpy (_segmentCommand.segname , [_name UTF8String ], sizeof (_segmentCommand.segname ));
41
+ _segmentCommand.vmaddr = [cursor readPtr ];
42
+ _segmentCommand.vmsize = [cursor readPtr ];
43
+ _segmentCommand.fileoff = [cursor readPtr ];
44
+ _segmentCommand.filesize = [cursor readPtr ];
45
+ _segmentCommand.maxprot = [cursor readInt32 ];
46
+ _segmentCommand.initprot = [cursor readInt32 ];
47
+ _segmentCommand.nsects = [cursor readInt32 ];
48
+ _segmentCommand.flags = [cursor readInt32 ];
49
+
50
+ NSMutableArray *sections = [[NSMutableArray alloc ] init ];
51
+ for (NSUInteger index = 0 ; index < _segmentCommand.nsects ; index ++) {
52
+ CDSection *section = [[CDSection alloc ] initWithDataCursor: cursor segment: self ];
53
+ [sections addObject: section];
54
+ }
55
+ _sections = [sections copy ];
37
56
}
38
57
39
58
return self;
40
59
}
41
60
42
61
#pragma mark - Debugging
43
62
44
- - (NSString *)description ;
63
+ - (NSString *)extraDescription ;
45
64
{
46
- NSString *extra = [self extraDescription ];
47
-
48
- if (extra == nil ) {
49
- return [NSString stringWithFormat: @" <%@ :%p > name: %@ " ,
50
- NSStringFromClass ([self class ]), self ,
51
- self .name];
52
- }
53
-
54
- return [NSString stringWithFormat: @" <%@ :%p > name: %@ , %@ " ,
55
- NSStringFromClass ([self class ]), self ,
56
- self .name, extra];
65
+ int padding = (int )self.machOFile .ptrSize * 2 ;
66
+ return [NSString stringWithFormat: @" vmaddr: 0x%0*llx - 0x%0*llx [0x%0*llx ], offset: %lld , flags: 0x%x (%@ ), nsects: %d , sections: %@ " ,
67
+ padding, _segmentCommand.vmaddr, padding, _segmentCommand.vmaddr + _segmentCommand.vmsize - 1 , padding, _segmentCommand.vmsize,
68
+ _segmentCommand.fileoff, self .flags, [self flagDescription ], _segmentCommand.nsects, self .sections.count > 0 ? self .sections : @" N/A" ];
57
69
}
58
70
59
- - (NSString *)extraDescription ;
71
+ #pragma mark -
72
+
73
+ - (uint32_t )cmd ;
60
74
{
61
- // Implement in subclasses
62
- return nil ;
75
+ return _segmentCommand.cmd ;
63
76
}
64
77
65
- #pragma mark -
78
+ - (uint32_t )cmdsize ;
79
+ {
80
+ return _segmentCommand.cmdsize ;
81
+ }
66
82
67
83
- (NSUInteger )vmaddr ;
68
84
{
69
- // Implement in subclasses.
70
- return 0 ;
85
+ return _segmentCommand.vmaddr ;
71
86
}
72
87
73
88
- (NSUInteger )fileoff ;
74
89
{
75
- // Implement in subclasses.
76
- return 0 ;
90
+ return _segmentCommand.fileoff ;
77
91
}
78
92
79
93
- (NSUInteger )filesize ;
80
94
{
81
- // Implement in subclasses.
82
- return 0 ;
95
+ return _segmentCommand.filesize ;
83
96
}
84
97
85
98
- (vm_prot_t )initprot ;
86
99
{
87
- // Implement in subclsses.
88
- return 0 ;
100
+ return _segmentCommand.initprot ;
89
101
}
90
102
91
103
- (uint32_t )flags ;
92
104
{
93
- // Implement in subclsses.
94
- return 0 ;
105
+ return _segmentCommand.flags ;
95
106
}
96
107
97
108
- (BOOL )isProtected ;
@@ -143,15 +154,14 @@ - (NSString *)flagDescription;
143
154
if (flags & SG_PROTECTED_VERSION_1) [setFlags addObject: @" PROTECTED_VERSION_1" ];
144
155
145
156
if ([setFlags count ] == 0 )
146
- return @" ( none) " ;
157
+ return @" none" ;
147
158
148
159
return [setFlags componentsJoinedByString: @" " ];
149
160
}
150
161
151
162
- (BOOL )containsAddress : (NSUInteger )address ;
152
163
{
153
- // Implement in subclasses
154
- return NO ;
164
+ return (address >= _segmentCommand.vmaddr ) && (address < _segmentCommand.vmaddr + _segmentCommand.vmsize );
155
165
}
156
166
157
167
- (CDSection *)sectionContainingAddress : (NSUInteger )address ;
@@ -188,21 +198,21 @@ - (void)appendToString:(NSMutableString *)resultString verbose:(BOOL)isVerbose;
188
198
{
189
199
[super appendToString: resultString verbose: isVerbose];
190
200
#if 0
191
- [resultString appendFormat:@" segname %@\n", self.name];
192
- [resultString appendFormat:@" vmaddr 0x%08x\n", segmentCommand.vmaddr];
193
- [resultString appendFormat:@" vmsize 0x%08x\n", segmentCommand.vmsize];
194
- [resultString appendFormat:@" fileoff %d\n", segmentCommand.fileoff];
195
- [resultString appendFormat:@" filesize %d\n", segmentCommand.filesize];
196
- [resultString appendFormat:@" maxprot 0x%08x\n", segmentCommand.maxprot];
197
- [resultString appendFormat:@" initprot 0x%08x\n", segmentCommand.initprot];
198
- [resultString appendFormat:@" nsects %d\n", segmentCommand.nsects];
201
+ int padding = (int)self.machOFile.ptrSize * 2;
202
+ [resultString appendFormat:@" segname %@\n", self.name];
203
+ [resultString appendFormat:@" vmaddr 0x%0*llx\n", padding, _segmentCommand.vmaddr];
204
+ [resultString appendFormat:@" vmsize 0x%0*llx\n", padding, _segmentCommand.vmsize];
205
+ [resultString appendFormat:@" fileoff %lld\n", _segmentCommand.fileoff];
206
+ [resultString appendFormat:@" filesize %lld\n", _segmentCommand.filesize];
207
+ [resultString appendFormat:@" maxprot 0x%08x\n", _segmentCommand.maxprot];
208
+ [resultString appendFormat:@" initprot 0x%08x\n", _segmentCommand.initprot];
209
+ [resultString appendFormat:@" nsects %d\n", _segmentCommand.nsects];
199
210
200
211
if (isVerbose)
201
212
[resultString appendFormat:@" flags %@\n", [self flagDescription]];
202
213
else
203
- [resultString appendFormat:@" flags 0x%x\n", segmentCommand .flags];
214
+ [resultString appendFormat:@" flags 0x%x\n", _segmentCommand .flags];
204
215
#endif
205
- // Implement in subclasses
206
216
}
207
217
208
218
- (void )writeSectionData ;
0 commit comments