90 lines
2.6 KiB
Objective-C
90 lines
2.6 KiB
Objective-C
//
|
|
// TAAnnotation.m
|
|
// Pods
|
|
//
|
|
// Created by wwango on 2022/10/8.
|
|
//
|
|
|
|
#import "TAAnnotation.h"
|
|
#include <mach-o/getsect.h>
|
|
#include <mach-o/loader.h>
|
|
#include <mach-o/dyld.h>
|
|
#include <dlfcn.h>
|
|
#import <objc/runtime.h>
|
|
#import <objc/message.h>
|
|
#include <mach-o/ldsyms.h>
|
|
#import "TAModuleManager.h"
|
|
#import "TAServiceManager.h"
|
|
|
|
NSArray<NSString *>* _TAReadConfiguration(char *sectionName,const struct mach_header *mhp);
|
|
static void dyld_callback(const struct mach_header *mhp, intptr_t vmaddr_slide)
|
|
{
|
|
//register mods
|
|
NSArray *mods = _TAReadConfiguration(ThinkingModSectName, mhp);
|
|
for (NSString *modName in mods) {
|
|
Class cls;
|
|
if (modName) {
|
|
cls = NSClassFromString(modName);
|
|
|
|
if (cls) {
|
|
[[TAModuleManager sharedManager] registerDynamicModule:cls];
|
|
}
|
|
}
|
|
}
|
|
|
|
//register services
|
|
NSArray<NSString *> *services = _TAReadConfiguration(ThinkingServiceSectName,mhp);
|
|
for (NSString *map in services) {
|
|
NSData *jsonData = [map dataUsingEncoding:NSUTF8StringEncoding];
|
|
NSError *error = nil;
|
|
id json = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
|
|
if (!error) {
|
|
if ([json isKindOfClass:[NSDictionary class]] && [json allKeys].count) {
|
|
|
|
NSString *protocol = [json allKeys][0];
|
|
NSString *clsName = [json allValues][0];
|
|
|
|
if (protocol && clsName) {
|
|
[[TAServiceManager sharedManager] registerService:NSProtocolFromString(protocol) implClass:NSClassFromString(clsName)];
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
NSArray<NSString *>* _TAReadConfiguration(char *sectionName,const struct mach_header *mhp)
|
|
{
|
|
NSMutableArray *configs = [NSMutableArray array];
|
|
unsigned long size = 0;
|
|
#ifndef __LP64__
|
|
uintptr_t *memory = (uintptr_t*)getsectiondata(mhp, SEG_DATA, sectionName, &size);
|
|
#else
|
|
const struct mach_header_64 *mhp64 = (const struct mach_header_64 *)mhp;
|
|
uintptr_t *memory = (uintptr_t*)getsectiondata(mhp64, SEG_DATA, sectionName, &size);
|
|
#endif
|
|
|
|
unsigned long counter = size/sizeof(void*);
|
|
for(int idx = 0; idx < counter; ++idx){
|
|
char *string = (char*)memory[idx];
|
|
NSString *str = [NSString stringWithUTF8String:string];
|
|
if(!str)continue;
|
|
|
|
NSLog(@"config = %@", str);
|
|
if(str) [configs addObject:str];
|
|
}
|
|
|
|
return configs;
|
|
}
|
|
|
|
__attribute__((constructor)) void __ta_init_dyld_addImage() {
|
|
_dyld_register_func_for_add_image(dyld_callback);
|
|
}
|
|
|
|
@implementation TAAnnotation
|
|
|
|
|
|
@end
|
|
|
|
|