Skip to content

Commit 2d07f79

Browse files
author
Maxim Masiutin
authored
Merge pull request #35 from krystiankolodziej/master
Fixed reading of "small" methods
2 parents 30cf1fe + bb57324 commit 2d07f79

File tree

5 files changed

+56
-1
lines changed

5 files changed

+56
-1
lines changed

Source/CDLCSegment.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,12 @@ extern NSString *CDSegmentEncryptionTypeName(CDSegmentEncryptionType type);
3838
- (NSString *)flagDescription;
3939

4040
- (BOOL)containsAddress:(NSUInteger)address;
41+
- (BOOL)containsOffset:(NSUInteger)address;
4142
- (CDSection *)sectionContainingAddress:(NSUInteger)address;
4243
- (CDSection *)sectionWithName:(NSString *)name;
4344
- (NSUInteger)fileOffsetForAddress:(NSUInteger)address;
4445
- (NSUInteger)segmentOffsetForAddress:(NSUInteger)address;
46+
- (NSUInteger)addressForDataOffset:(NSUInteger)offset;
4547

4648
- (void)writeSectionData;
4749

Source/CDLCSegment.m

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ - (NSUInteger)vmaddr;
9090
return _segmentCommand.vmaddr;
9191
}
9292

93+
- (NSUInteger)vmsize;
94+
{
95+
return _segmentCommand.vmsize;
96+
}
97+
9398
- (NSUInteger)fileoff;
9499
{
95100
return _segmentCommand.fileoff;
@@ -169,6 +174,11 @@ - (BOOL)containsAddress:(NSUInteger)address;
169174
return (address >= _segmentCommand.vmaddr) && (address < _segmentCommand.vmaddr + _segmentCommand.vmsize);
170175
}
171176

177+
- (BOOL)containsOffset:(NSUInteger)address
178+
{
179+
return (address >= _segmentCommand.fileoff) && (address < _segmentCommand.fileoff + _segmentCommand.filesize);
180+
}
181+
172182
- (CDSection *)sectionContainingAddress:(NSUInteger)address;
173183
{
174184
for (CDSection *section in self.sections) {
@@ -194,6 +204,11 @@ - (NSUInteger)fileOffsetForAddress:(NSUInteger)address;
194204
return [[self sectionContainingAddress:address] fileOffsetForAddress:address];
195205
}
196206

207+
- (NSUInteger)addressForDataOffset:(NSUInteger)offset
208+
{
209+
return self.vmaddr + (offset - self.fileoff);
210+
}
211+
197212
- (NSUInteger)segmentOffsetForAddress:(NSUInteger)address;
198213
{
199214
return [self fileOffsetForAddress:address] - self.fileoff;

Source/CDMachOFile.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ typedef enum : NSUInteger {
5757
- (NSString *)stringAtAddress:(NSUInteger)address;
5858

5959
- (NSUInteger)dataOffsetForAddress:(NSUInteger)address;
60+
- (NSUInteger)addressForDataOffset:(NSUInteger)offset;
6061

6162
- (const void *)bytes;
6263
- (const void *)bytesAtOffset:(NSUInteger)offset;

Source/CDMachOFile.m

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,17 @@ - (CDLCSegment *)segmentContainingAddress:(NSUInteger)address;
319319
return nil;
320320
}
321321

322+
- (CDLCSegment *)segmentContainingOffset:(NSUInteger)offset;
323+
{
324+
for (id loadCommand in _loadCommands) {
325+
if ([loadCommand isKindOfClass:[CDLCSegment class]] && [loadCommand containsOffset:offset]) {
326+
return loadCommand;
327+
}
328+
}
329+
330+
return nil;
331+
}
332+
322333
- (void)showWarning:(NSString *)warning;
323334
{
324335
NSLog(@"Warning: %@", warning);
@@ -356,7 +367,8 @@ - (NSString *)stringAtAddress:(NSUInteger)address;
356367
CDSection *section = [segment sectionContainingAddress:address];
357368
if ([[section sectionName] isEqualToString:@"__objc_selrefs"]) {
358369
const void * reference = [self.data bytes] + offset;
359-
offset = ([self ptrSize] == 8) ? *((uint64_t *)reference) : *((uint32_t *)reference);
370+
NSUInteger vmaddr = ([self ptrSize] == 8) ? *((uint64_t *)reference) : *((uint32_t *)reference);
371+
offset = [self dataOffsetForAddress:vmaddr];
360372
}
361373

362374
ptr = (uint8_t *)[self.data bytes] + offset;
@@ -383,6 +395,25 @@ - (NSUInteger)dataOffsetForAddress:(NSUInteger)address;
383395
return [segment fileOffsetForAddress:address];
384396
}
385397

398+
- (NSUInteger)addressForDataOffset:(NSUInteger)offset
399+
{
400+
if (offset == 0)
401+
return 0;
402+
403+
CDLCSegment *segment = [self segmentContainingOffset:offset];
404+
if (segment == nil) {
405+
NSLog(@"Error: Cannot find segment for data offset 0x%08lx in segmentContainingOffset:", offset);
406+
exit(5);
407+
}
408+
409+
if ([segment isProtected]) {
410+
NSLog(@"Error: Segment is protected.");
411+
exit(5);
412+
}
413+
414+
return [segment addressForDataOffset:offset];
415+
}
416+
386417
- (const void *)bytes;
387418
{
388419
return [self.data bytes];

Source/CDObjectiveC2Processor.m

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,12 @@ - (NSArray *)loadMethodsAtAddress:(uint64_t)address extendedMethodTypesCursor:(C
423423
objc2Method.name = [cursor readPtr:small];
424424
objc2Method.types = [cursor readPtr:small];
425425
objc2Method.imp = [cursor readPtr:small];
426+
427+
if (small) {
428+
objc2Method.name = [self.machOFile addressForDataOffset:objc2Method.name];
429+
objc2Method.types = [self.machOFile addressForDataOffset:objc2Method.types];
430+
}
431+
426432
NSString *name = [self.machOFile stringAtAddress:objc2Method.name];
427433
NSString *types = [self.machOFile stringAtAddress:objc2Method.types];
428434

0 commit comments

Comments
 (0)