def analyze(self, machO): symtabStruct = machO.makeStruct('4L') nlistStruct = machO.makeStruct('LBBH^') (symoff, nsyms, stroff, _) = peekStruct(machO.file, symtabStruct) # Get all nlist structs origin = machO.origin nlists = peekStructs(machO.file, nlistStruct, count=nsyms, position=symoff + origin) # Now analyze the nlist structs symbols = [] for (ordinal, (idx, typ, sect, desc, value)) in enumerate(nlists): string = peekString(machO.file, position=stroff + idx + origin) libord = (desc >> 8) & 0xff # GET_LIBRARY_ORDINAL extern = bool(typ & 1) # N_EXT symtype = SYMTYPE_GENERIC if (typ & 0xe) else SYMTYPE_UNDEFINED isThumb = bool(desc & 8) # N_ARM_THUMB_DEF if isThumb: value &= ~1 symbol = Symbol(string, value, symtype, ordinal, libord, extern, isThumb) symbols.append(symbol) # add those symbols back into the Mach-O. machO.addSymbols(symbols)
def analyze(self, machO): symtabStruct = machO.makeStruct('4L') nlistStruct = machO.makeStruct('LBBH^') (symoff, nsyms, stroff, _) = peekStruct(machO.file, symtabStruct) # Get all nlist structs origin = machO.origin nlists = peekStructs(machO.file, nlistStruct, count=nsyms, position=symoff+origin) # Now analyze the nlist structs symbols = [] for (ordinal, (idx, typ, sect, desc, value)) in enumerate(nlists): string = peekString(machO.file, position=stroff+idx+origin) libord = (desc >> 8) & 0xff # GET_LIBRARY_ORDINAL extern = bool(typ & 1) # N_EXT symtype = SYMTYPE_GENERIC if (typ & 0xe) else SYMTYPE_UNDEFINED isThumb = bool(desc & 8) # N_ARM_THUMB_DEF if isThumb: value &= ~1 symbol = Symbol(string, value, symtype, ordinal, libord, extern, isThumb) symbols.append(symbol) # add those symbols back into the Mach-O. machO.addSymbols(symbols)
def analyze(self, machO): (offset, self.timestamp, self.version, self.minVersion) = peekStruct(machO.file, machO.makeStruct('4L')) self.name = peekString(machO.file, position=offset + machO.origin + self.offset - 8)