diff --git a/msr90.py b/msr90.py index a6ce133..96c28ac 100644 --- a/msr90.py +++ b/msr90.py @@ -1,9 +1,13 @@ #!/usr/bin/env python # MSR90 Magnetic Stripe Reader - Developed by acidvegas in Python (https://git.acid.vegas/msr90) +''' +Notes: + - Currently only supports reading VISA cards, will add support for Mastercard, License, Gift Cards, etc. +''' + import getpass import re -import sys # Define ANSI color codes @@ -91,47 +95,50 @@ def parse_magnetic_stripe(data: str): desc2 = service_code_descriptions(2, service_code[1]) desc3 = service_code_descriptions(3, service_code[2]) print('Track 1 Data:') - print(YELLOW + 'Format Code' + GRAY + ' | ' + RESET + f'{format_code} - Financial cards (ISO/IEC 7813)') - print(YELLOW + 'Primary Account Number (PAN)' + GRAY + ' | ' + RESET + formatted_pan) - print(YELLOW + 'Cardholder Name' + GRAY + ' | ' + RESET + name) - print(YELLOW + 'Expiration Date' + GRAY + ' | ' + RESET + formatted_exp_date) - print(YELLOW + 'Service Code Digit 1' + GRAY + ' | ' + RESET + f'{service_code[0]}: {desc1}') - print(YELLOW + 'Service Code Digit 2' + GRAY + ' | ' + RESET + f'{service_code[1]}: {desc2}') - print(YELLOW + 'Service Code Digit 3' + GRAY + ' | ' + RESET + f'{service_code[2]}: {desc3}') - print(YELLOW + 'Discretionary Data' + GRAY + ' | ' + RESET + discretionary_data) - print(YELLOW + 'LRC (optional)' + GRAY + ' | ' + RESET + lrc) - print(YELLOW + 'Raw Track Data' + GRAY + ' | ' + RESET + track1_match.group(0)) + print(f'{YELLOW}Format Code {GRAY}|{RESET} {format_code} - Financial cards (ISO/IEC 7813)') + print(f'{YELLOW}Primary Account Number (PAN) {GRAY}|{RESET} {formatted_pan}') + print(f'{YELLOW}Cardholder Name {GRAY}|{RESET} {name}') + print(f'{YELLOW}Expiration Date {GRAY}|{RESET} {formatted_exp_date}') + print(f'{YELLOW}Service Code Digit 1 {GRAY}|{RESET} {service_code[0]}: {desc1}') + print(f'{YELLOW}Service Code Digit 2 {GRAY}|{RESET} {service_code[1]}: {desc2}') + print(f'{YELLOW}Service Code Digit 3 {GRAY}|{RESET} {service_code[2]}: {desc3}') + print(f'{YELLOW}Discretionary Data {GRAY}|{RESET} {discretionary_data}') + print(f'{YELLOW}LRC (optional) {GRAY}|{RESET} {lrc}') + print(f'{YELLOW}Raw Track Data {GRAY}|{RESET} {track1_match.group(0)}') else: - generic_track1 = re.search(r'(%[AB][^\?]+\?)', data) - print('Track 1 Data:') - print('Raw | ' + (generic_track1.group(1) if generic_track1 else 'No data found')) + generic_track1 = re.search(r'(%[^?]+\?)', data) + if generic_track1: + print('Track 1 Data:') + print(f'{YELLOW}Raw Track Data {GRAY}|{RESET}' + generic_track1.group(1)) + else: + raise ValueError(f'Track 1 data is not found (data: {data})') if track2_match: pan, exp_date, service_code, discretionary_data = track2_match.groups() formatted_pan = format_pan(pan) formatted_exp_date = format_exp_date(exp_date) print('Track 2 Data:') - print(CYAN + 'Primary Account Number (PAN)' + GRAY + ' | ' + RESET + formatted_pan) - print(CYAN + 'Expiration Date' + GRAY + ' | ' + RESET + formatted_exp_date) - print(CYAN + 'Service Code' + GRAY + ' | ' + RESET + service_code) - print(CYAN + 'Discretionary Data' + GRAY + ' | ' + RESET + discretionary_data) - print(CYAN + 'Raw Track Data' + GRAY + ' | ' + RESET + track2_match.group(0)) + print(f'{CYAN}Primary Account Number (PAN) {GRAY}|{RESET} {formatted_pan}') + print(f'{CYAN}Expiration Date {GRAY}|{RESET} {formatted_exp_date}') + print(f'{CYAN}Service Code {GRAY}|{RESET} {service_code}') + print(f'{CYAN}Discretionary Data {GRAY}|{RESET} {discretionary_data}') + print(f'{CYAN}Raw Track Data {GRAY}|{RESET} {track2_match.group(0)}') else: generic_track2 = re.search(r'(;[^\?]+\?)', data) - print('Track 2 Data:') - print('Raw | ' + (generic_track2.group(1) if generic_track2 else 'No data found')) + if generic_track2: + print('Track 2 Data:') + print(f'{CYAN}Raw Track Data {GRAY}|{RESET}' + generic_track2.group(1)) + else: + raise ValueError(f'Track 2 data is not found (data: {data})') if track3_match: print('Track 3 Data:') - print(f'Raw | {track3_match.group(1)}') + print(f'{GRAY}Raw Track Data {GRAY}|{RESET} {track3_match.group(0)}') else: - print('Track 3 Data: No data found.') + raise ValueError(f'Track 3 data is not found (data: {data})') if __name__ == '__main__': - try: - swipe_data = getpass.getpass(prompt='Please swipe the card: ') - parse_magnetic_stripe(swipe_data) - except Exception as e: - print('Error:', e) + swipe_data = getpass.getpass(prompt='Please swipe the card: ') + parse_magnetic_stripe(swipe_data) \ No newline at end of file