diff --git a/client/pyscripts/pm3_nfc2eml.py b/client/pyscripts/pm3_nfc2eml.py new file mode 100755 index 000000000..e47ff8464 --- /dev/null +++ b/client/pyscripts/pm3_nfc2eml.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" +Script to convert amiibo nfc Flipper Zero files to eml files to be used with Proxmark3 +Date: 18/05/2023 +Script Author: OscarAkaElvis +Tested on: Linux and Windows +OscarAkaElvis - https://twitter.com/OscarAkaElvis +""" + +import re +import argparse +import os +from os import path +from sys import argv + +# Vars +script_name = path.basename(argv[0]) +script_version = "1.0" + +# Function to print script's version +def print_version(): + print() + return 'v{}'.format(script_version) + +# Check if the input file is a text file based on its content +def is_text_file(file_path): + with open(file_path, 'rb') as file: + try: + file_content = file.read().decode('utf-8') + return all(ord(char) < 128 for char in file_content) + except UnicodeDecodeError: + return False + +# Main script code +def main(): + # Text help data + description_text = "Script to convert amiibo nfc Flipper Zero files to eml files to be used with Proxmark3." + epilog_text = 'Example:\n python3 ' + script_name + ' -i file.nfc -o output.eml' + + # Create an argument parser + parser = argparse.ArgumentParser(exit_on_error=False, description=description_text, formatter_class=argparse.RawDescriptionHelpFormatter, epilog=epilog_text) + # Add the input file argument + parser.add_argument("-i", "--input", required=True, help="Path to the input nfc file.") + # Add the output file argument + parser.add_argument("-o", "--output", required=True, help="Name of the output eml file.") + # Add the version argument + parser.add_argument('-v', '--version', action='version', version=print_version(), help="Show script's version number and exit") + + # Parse the command-line arguments + + args = parser.parse_args() + + # Extract the file paths from the command-line arguments + file_path = args.input + output_file = args.output + + # Check if the target file exists + if not os.path.isfile(file_path): + print(f"[!] The input file '{file_path}' does not exist.") + exit(0) + + # Validation to check if the input file is a text file based on its content + if not is_text_file(file_path): + print("[!] The input file does not appear to be a nfc text file.") + + # Check if the input file name has the .nfc extension + if not file_path.lower().endswith('.nfc'): + print("[+] Warning. The input file should have the '.nfc' extension.") + + # Get the absolute path of the output file + output_file_path = os.path.abspath(output_file) + + # Check if the directory of the output file is writable + output_dir = os.path.dirname(output_file_path) + if not os.access(output_dir, os.W_OK): + print(f"[!] The output directory '{output_dir}' is not writable or doesn't exist.") + + # Check if the output file name has the .eml extension + if not output_file.lower().endswith('.eml'): + print("[+] Warning. The output file should have the '.eml' extension.") + + # Read the target file + with open(file_path, 'r') as file: + file_content = file.read() + + # Extract the data from each "Page X" line + matches = re.findall(r'Page \d+:(.*?)$', file_content, re.MULTILINE | re.DOTALL) + + if matches: + # Remove spaces and convert to lowercase for each match + extracted_data = [re.sub(r'\s', '', match).lower() for match in matches] + + # Join the extracted data with line feeds + result = '\n'.join(extracted_data) + + # Write the extracted data to the output file + with open(output_file_path, 'w', newline='\n') as output_file: + output_file.write(result) + print(f"[*] File converted successfully. Output eml file written as '{os.path.basename(output_file.name)}'.") + else: + # If the needed data is not there + print("[!] Provided input file seems to not be a valid nfc file to work with.") + +# Application entrypoint +if __name__ == '__main__': + try: + main() + except: + pass +