Skip to content

Commit d19f77e

Browse files
committed
Merge CDLCSegment32 and CDLCSegment64 into CDLCSegment
1 parent dbc8e49 commit d19f77e

10 files changed

+56
-301
lines changed

Source/CDLCSegment.m

+52-42
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222

2323
@implementation CDLCSegment
2424
{
25+
struct segment_command_64 _segmentCommand; // 64-bit, also holding 32-bit
26+
2527
NSString *_name;
2628
NSArray *_sections;
2729

@@ -31,67 +33,76 @@ @implementation CDLCSegment
3133
- (id)initWithDataCursor:(CDMachOFileDataCursor *)cursor;
3234
{
3335
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];
3756
}
3857

3958
return self;
4059
}
4160

4261
#pragma mark - Debugging
4362

44-
- (NSString *)description;
63+
- (NSString *)extraDescription;
4564
{
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"];
5769
}
5870

59-
- (NSString *)extraDescription;
71+
#pragma mark -
72+
73+
- (uint32_t)cmd;
6074
{
61-
// Implement in subclasses
62-
return nil;
75+
return _segmentCommand.cmd;
6376
}
6477

65-
#pragma mark -
78+
- (uint32_t)cmdsize;
79+
{
80+
return _segmentCommand.cmdsize;
81+
}
6682

6783
- (NSUInteger)vmaddr;
6884
{
69-
// Implement in subclasses.
70-
return 0;
85+
return _segmentCommand.vmaddr;
7186
}
7287

7388
- (NSUInteger)fileoff;
7489
{
75-
// Implement in subclasses.
76-
return 0;
90+
return _segmentCommand.fileoff;
7791
}
7892

7993
- (NSUInteger)filesize;
8094
{
81-
// Implement in subclasses.
82-
return 0;
95+
return _segmentCommand.filesize;
8396
}
8497

8598
- (vm_prot_t)initprot;
8699
{
87-
// Implement in subclsses.
88-
return 0;
100+
return _segmentCommand.initprot;
89101
}
90102

91103
- (uint32_t)flags;
92104
{
93-
// Implement in subclsses.
94-
return 0;
105+
return _segmentCommand.flags;
95106
}
96107

97108
- (BOOL)isProtected;
@@ -143,15 +154,14 @@ - (NSString *)flagDescription;
143154
if (flags & SG_PROTECTED_VERSION_1) [setFlags addObject:@"PROTECTED_VERSION_1"];
144155

145156
if ([setFlags count] == 0)
146-
return @"(none)";
157+
return @"none";
147158

148159
return [setFlags componentsJoinedByString:@" "];
149160
}
150161

151162
- (BOOL)containsAddress:(NSUInteger)address;
152163
{
153-
// Implement in subclasses
154-
return NO;
164+
return (address >= _segmentCommand.vmaddr) && (address < _segmentCommand.vmaddr + _segmentCommand.vmsize);
155165
}
156166

157167
- (CDSection *)sectionContainingAddress:(NSUInteger)address;
@@ -188,21 +198,21 @@ - (void)appendToString:(NSMutableString *)resultString verbose:(BOOL)isVerbose;
188198
{
189199
[super appendToString:resultString verbose:isVerbose];
190200
#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];
199210

200211
if (isVerbose)
201212
[resultString appendFormat:@" flags %@\n", [self flagDescription]];
202213
else
203-
[resultString appendFormat:@" flags 0x%x\n", segmentCommand.flags];
214+
[resultString appendFormat:@" flags 0x%x\n", _segmentCommand.flags];
204215
#endif
205-
// Implement in subclasses
206216
}
207217

208218
- (void)writeSectionData;

Source/CDLCSegment32.h

-10
This file was deleted.

Source/CDLCSegment32.m

-121
This file was deleted.

Source/CDLCSegment64.h

-10
This file was deleted.

0 commit comments

Comments
 (0)