diff --git a/IX. TCC/python/get_uuid.py b/IX. TCC/python/get_uuid.py new file mode 100644 index 0000000..450e34e --- /dev/null +++ b/IX. TCC/python/get_uuid.py @@ -0,0 +1,66 @@ +import os +import subprocess +import argparse + +def extract_uuids(path): + """Extract UUIDs from a Mach-O file using dwarfdump.""" + uuids = [] + try: + # Run dwarfdump command to get UUIDs + result = subprocess.run(['dwarfdump', '--uuid', path], capture_output=True, text=True) + if result.returncode == 0: + for line in result.stdout.splitlines(): + if 'UUID:' in line: + uuid = line.split(':')[1].strip().split()[0] # Extract UUID part only + uuids.append(uuid) + else: + print(f"Error running dwarfdump: {result.stderr.strip()}") + except Exception as e: + print(f"Error extracting UUIDs from {path}: {e}") + return uuids + +def process_path(path, add_record=False): + """Process a single path to extract UUIDs and optionally add them to the database.""" + absolute_path = os.path.abspath(path) + if not os.path.isfile(absolute_path) or not os.access(absolute_path, os.X_OK): + print(f"Invalid path or not an executable: {absolute_path}") + return + + # Extract UUIDs from the Mach-O file + uuids = extract_uuids(absolute_path) + + # Output or add UUIDs to the database + if uuids: + uuid_string = ','.join(uuids) # Combine UUIDs into a single comma-separated string + if add_record: + # Call uuid_manager.py with the combined UUID string + subprocess.run(['python3', 'uuid_manager.py', '-p', absolute_path, '-u', uuid_string]) + else: + print(f"{absolute_path}: {uuid_string}") + else: + print(f"No UUIDs found in {absolute_path}") + +def main(): + parser = argparse.ArgumentParser(description='Extract UUIDs from specified Mach-O binaries using dwarfdump.') + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument('--path', '-p', type=str, help='Path to the Mach-O binary') + group.add_argument('--list', '-l', type=str, help='Path to a file containing a list of binaries') + parser.add_argument('--add_record', action='store_true', help='Add extracted UUIDs to the database') + args = parser.parse_args() + + if args.path: + # Process a single path + process_path(args.path, add_record=args.add_record) + elif args.list: + # Process a list of paths + if os.path.isfile(args.list): + with open(args.list, 'r') as file: + for line in file: + line = line.strip() + if line: + process_path(line, add_record=args.add_record) + else: + print(f"Invalid list file: {args.list}") + +if __name__ == "__main__": + main()