#!/usr/bin/env python3
"""
Filter out filler bytes (0x00, 0x45) to get real data
"""
import csv

print("[*] Extracting MOSI bytes and filtering filler...")

all_mosi = []

with open('export.csv', 'r') as f:
    reader = csv.DictReader(f)
    
    for row in reader:
        if row['type'] == 'result' and row['mosi']:
            if row['mosi'].startswith('0x'):
                mosi_byte = int(row['mosi'], 16)
                all_mosi.append(mosi_byte)

print(f"[+] Extracted {len(all_mosi)} MOSI bytes")

#  Filter out 0x00 and 0x45 (appear to be filler/idle bytes)
filtered = [b for b in all_mosi if b not in [0x00, 0x45]]

print(f"[+] After filtering 0x00 and 0x45: {len(filtered)} bytes remain")

# Show first 256 filtered bytes
print("\n[*] First 256 filtered bytes:")
for i in range(0, min(256, len(filtered)), 16):
    chunk = filtered[i:i+16]
    hex_str = ' '.join(f'{b:02x}' for b in chunk)
    ascii_str = ''.join(chr(b) if 32 <= b < 127 else '.' for b in chunk)
    print(f"  {i:04x}: {hex_str:<48} {ascii_str}")

# Search for 'teptast'
print("\n[*] Searching for 'teptast' (74 65 70 74 61 73 74)...")
target = [0x74, 0x65, 0x70, 0x74, 0x61, 0x73, 0x74]

for i in range(len(filtered) - 6):
    if filtered[i:i+7] == target:
        print(f"\n[+++] FOUND 'teptast' at offset {i} (0x{i:x}) in filtered data!")
        
        # Show context
        start = max(0, i - 32)
        end = min(len(filtered), i + 64)
        
        print(f"\n[*] Context (32 bytes before, 64 after):")
        for j in range(start, end, 16):
            chunk = filtered[j:j+16]
            hex_str = ' '.join(f'{b:02x}' for b in chunk)
            ascii_str = ''.join(chr(b) if 32 <= b < 127 else '.' for b in chunk)
            marker = ' <<<' if j <= i < j + 16 else ''
            print(f"  {j:04x}: {hex_str:<48} {ascii_str}{marker}")
        
        # Extract 16-byte blocks
        block_start = (i // 16) * 16
        
        print(f"\n{'='*70}")
        for block_num in range(0, 6):
            offset = block_start + (block_num * 16)
            if offset + 16 <= len(filtered):
                block = filtered[offset:offset+16]
                hex_str = ''.join(f'{b:02x}' for b in block)
                ascii_str = ''.join(chr(b) if 32 <= b < 127 else '.' for b in block)
                
                print(f"\nBlock {block_num} (offset {offset:04x}):")
                print(f"  HEX:   {hex_str}")
                print(f"  ASCII: '{ascii_str}'")
                
                if block_num == 0:
                    print(f"  >>> SECTOR 8 (Username)")
                elif block_num == 1:
                    print(f"  >>> SECTOR 22 (Authorization Code) <<<")
                elif block_num == 2:
                    print(f"  >>> SECTOR 34 (Access Level) <<<")
        
        print(f"{'='*70}")
        break
else:
    print("\n[-] Still not found. Trying different filtering...")
    
    # Try removing just 0x45
    filtered2 = [b for b in all_mosi if b != 0x45]
    print(f"\n[*] Filtering only 0x45: {len(filtered2)} bytes")
    
    for i in range(min(128, len(filtered2)), 16):
        chunk = filtered2[i:i+16]
        hex_str = ' '.join(f'{b:02x}' for b in chunk)
        print(f"  {i:04x}: {hex_str}")
