Files

72 lines
2.0 KiB
Python

import serial
import time
import os
import sys
PORT = '/dev/cu.usbmodem101'
print("=== MicroPython Boot Interrupter & Recovery Tool ===")
print(f"Waiting for {PORT} to appear. Please press the RESET button on the board...")
while True:
try:
ser = serial.Serial(PORT, 115200, timeout=1.0)
print("\n[+] Port opened successfully!")
break
except Exception as e:
# Port not present or busy
time.sleep(0.01)
print("[*] Sending Ctrl-C storm to halt boot sequence...")
# Send 100 Ctrl-C interrupts in rapid succession
for _ in range(100):
try:
ser.write(b'\x03')
time.sleep(0.005)
except Exception as e:
print(f"Write error during storm: {e}")
break
time.sleep(0.1)
ser.reset_input_buffer()
# Check if we have REPL access by sending a newline and expecting a prompt
print("[*] Verifying REPL responsiveness...")
ser.write(b'\r\n')
time.sleep(0.2)
if ser.in_waiting:
resp = ser.read(ser.in_waiting)
print(f"REPL Response:\n{resp.decode('utf-8', errors='ignore')}")
else:
print("[-] No response to newline, trying to force it...")
ser.write(b'\x03\r\n')
time.sleep(0.2)
resp = ser.read(ser.in_waiting)
print(f"REPL Response:\n{resp.decode('utf-8', errors='ignore')}")
# Try to rename main.py to stop it from running on subsequent boots
print("[*] Attempting to disable main.py...")
rename_code = b"""
import os
try:
os.rename('main.py', 'main_bad.py')
print('RENAME:OK')
except Exception as e:
print('RENAME:ERROR:', e)
"""
ser.write(rename_code + b'\r\n')
time.sleep(0.5)
if ser.in_waiting:
result = ser.read(ser.in_waiting).decode('utf-8', errors='ignore')
print(f"Execution Output:\n{result}")
if "RENAME:OK" in result:
print("[+] SUCCESS! main.py has been disabled.")
print("[+] You can now safely upload files or reboot.")
else:
print("[-] Rename failed or returned unexpected output.")
else:
print("[-] No response to rename command.")
ser.close()