#!/usr/bin/env python """ This script lists libraries embedded in a dyld shared cache file Note: this script is only working with the extended version of LIEF """ import sys import lief import argparse from pathlib import Path from typing import Optional def main() -> int: parser = argparse.ArgumentParser() parser.add_argument( "target", type=Path, help="Target dyld shared file (file or dir)" ) args = parser.parse_args() target: Path = args.target if not target.exists(): print(f"'{target}' does not exist") return 1 dyld_cache = lief.dsc.load(target) if dyld_cache is None: print(f"Can't parse '{target}'") for lib in dyld_cache.libraries: print(f"0x{lib.address:016x} {lib.path}") for idx, info in enumerate(dyld_cache.mapping_info): print( f"mapping_info[{idx:02d}]: [{info.address:016x}, {info.end_address:016x}] -> 0x{info.file_offset:016x}" ) for idx, subcache in enumerate(dyld_cache.subcaches): uuid_str = ":".join(map(lambda e: f"{e:02x}", subcache.uuid)) print(f"cache[{idx:02d}]: {uuid_str} {subcache.suffix}") if __name__ == "__main__": raise SystemExit(main())