mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2024-11-14 13:44:49 +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
|
|
|