Skip to content

Commit

Permalink
im back
Browse files Browse the repository at this point in the history
tl;dr usable Ventura 31001 and Monterey AMD VA
  • Loading branch information
ASentientBot committed Mar 9, 2023
1 parent a33ef98 commit 3f0f2b2
Show file tree
Hide file tree
Showing 30 changed files with 912 additions and 892 deletions.
26 changes: 26 additions & 0 deletions Address.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#define ADDRESS_REBASE 1
#define ADDRESS_BIND 2
#define ADDRESS_EXPORT 3
#define ADDRESS_REEXPORT 4

@interface Address:NSObject

@property(assign) int type;
@property(assign) long address;

@property(retain) NSString* name;
@property(retain) NSString* importName;
@property(assign) int dylibOrdinal;
@property(assign) int addend;

+(instancetype)rebaseWithAddress:(long)address;
+(instancetype)bindWithAddress:(long)address ordinal:(int)ordinal name:(NSString*)name addend:(int)addend;
+(instancetype)exportWithAddress:(long)address name:(NSString*)name;
+(instancetype)reexportWithName:(NSString*)name importName:(NSString*)importName importOrdinal:(int)ordinal;

-(BOOL)isRebase;
-(BOOL)isBind;
-(BOOL)isExport;
-(BOOL)isReexport;

@end
61 changes: 61 additions & 0 deletions Address.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
@implementation Address

+(instancetype)rebaseWithAddress:(long)address
{
Address* result=Address.alloc.init.autorelease;
result.type=ADDRESS_REBASE;
result.address=address;
return result;
}

+(instancetype)bindWithAddress:(long)address ordinal:(int)ordinal name:(NSString*)name addend:(int)addend
{
Address* result=Address.alloc.init.autorelease;
result.type=ADDRESS_BIND;
result.address=address;
result.dylibOrdinal=ordinal;
result.name=name;
result.addend=addend;
return result;
}

+(instancetype)exportWithAddress:(long)address name:(NSString*)name
{
Address* result=Address.alloc.init.autorelease;
result.type=ADDRESS_EXPORT;
result.address=address;
result.name=name;
return result;
}

+(instancetype)reexportWithName:(NSString*)name importName:(NSString*)importName importOrdinal:(int)ordinal
{
Address* result=Address.alloc.init.autorelease;
result.type=ADDRESS_REEXPORT;
result.name=name;
result.importName=importName;
result.dylibOrdinal=ordinal;
return result;
}

-(BOOL)isRebase
{
return self.type==ADDRESS_REBASE;
}

-(BOOL)isBind
{
return self.type==ADDRESS_BIND;
}

-(BOOL)isExport
{
return self.type==ADDRESS_EXPORT;
}

-(BOOL)isReexport
{
return self.type==ADDRESS_REEXPORT;
}

@end
9 changes: 0 additions & 9 deletions Bind.h

This file was deleted.

12 changes: 0 additions & 12 deletions Bind.m

This file was deleted.

10 changes: 0 additions & 10 deletions Cache.h

This file was deleted.

121 changes: 0 additions & 121 deletions Cache.m

This file was deleted.

11 changes: 7 additions & 4 deletions CacheFile.h
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
@interface CacheFile:NSObject<LocationBase>

@property(retain) NSMutableData* data;
@property(assign) struct dyld_cache_header* header;
@property(retain) NSArray<Image*>* images;
@property(retain) NSArray<CacheImage*>* images;
@property(retain) NSArray<NSNumber*>* rebaseAddresses;

-(instancetype)initWithPath:(NSString*)path;

-(NSArray<Image*>*)imagesWithPathPrefix:(NSString*)path;
-(Image*)imageWithAddress:(long)address;
-(long)maxConstDataMappingAddress;
-(long)maxConstDataSegmentAddress;

-(CacheImage*)imageWithPath:(NSString*)path;
-(NSArray<CacheImage*>*)imagesWithPathPrefix:(NSString*)path;
-(CacheImage*)imageWithAddress:(long)address;

@end
75 changes: 66 additions & 9 deletions CacheFile.m
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ -(instancetype)initWithPath:(NSString*)path
return nil;
}

self.header=(struct dyld_cache_header*)self.data.bytes;

self.loadImages;
self.loadRebases;

Expand All @@ -20,6 +18,50 @@ -(instancetype)initWithPath:(NSString*)path
return self;
}

-(long)maxConstDataMappingAddress
{
__block long max=0;

[self forEachMapping:^(struct dyld_cache_mapping_and_slide_info* info)
{
if(info->flags==DYLD_CACHE_MAPPING_CONST_DATA)
{
assert(max==0);
max=info->address+info->size;
}
}];

assert(max!=0);
return max;
}

-(long)maxConstDataSegmentAddress
{
long mappingEnd=self.maxConstDataMappingAddress;

__block long max=0;

for(CacheImage* image in self.images)
{
[image.header forEachSegmentCommand:^(struct segment_command_64* command)
{
long end=command->vmaddr+command->vmsize;
if(end<mappingEnd)
{
max=MAX(max,end);
}
}];
}

assert(max!=0);
return max;
}

-(struct dyld_cache_header*)header
{
return (struct dyld_cache_header*)self.data.bytes;
}

-(void)forEachMapping:(void (^)(struct dyld_cache_mapping_and_slide_info*))block
{
// using Location here would create a circular dependency
Expand Down Expand Up @@ -91,13 +133,13 @@ -(char*)pointerWithAddress:(long)address

-(void)loadImages
{
NSMutableArray<Image*>* images=NSMutableArray.alloc.init.autorelease;
NSMutableArray<CacheImage*>* images=NSMutableArray.alloc.init.autorelease;

struct dyld_cache_image_info* infos=(struct dyld_cache_image_info*)wrapOffset(self,self.header->imagesOffset).pointer;

for(int index=0;index<self.header->imagesCount;index++)
{
Image* image=[Image.alloc initWithCacheFile:self info:&infos[index]].autorelease;
CacheImage* image=[CacheImage.alloc initWithCacheFile:self info:&infos[index]].autorelease;
if(image)
{
[images addObject:image];
Expand Down Expand Up @@ -161,14 +203,29 @@ -(void)loadRebases
return first.longValue<second.longValue?NSOrderedAscending:NSOrderedDescending;
}];

// TODO: use Address? does it matter?

self.rebaseAddresses=addresses;
}

-(NSArray<Image*>*)imagesWithPathPrefix:(NSString*)path
-(CacheImage*)imageWithPath:(NSString*)path
{
for(CacheImage* image in self.images)
{
if([image.path isEqual:path])
{
return image;
}
}

return nil;
}

-(NSArray<CacheImage*>*)imagesWithPathPrefix:(NSString*)path
{
NSMutableArray<Image*>* result=NSMutableArray.alloc.init.autorelease;
NSMutableArray<CacheImage*>* result=NSMutableArray.alloc.init.autorelease;

for(Image* image in self.images)
for(CacheImage* image in self.images)
{
if([image.path hasPrefix:path])
{
Expand All @@ -179,9 +236,9 @@ -(void)loadRebases
return result;
}

-(Image*)imageWithAddress:(long)address
-(CacheImage*)imageWithAddress:(long)address
{
for(Image* image in self.images)
for(CacheImage* image in self.images)
{
if([image.header segmentCommandWithAddress:address indexOut:NULL])
{
Expand Down
Loading

0 comments on commit 3f0f2b2

Please sign in to comment.