mirror of
				https://github.com/RfidResearchGroup/proxmark3.git
				synced 2025-10-31 16:42:34 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			112 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
| #!/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
 | |
| 
 |