Bit of a follow up to this, it is possible to access the random solvers before the login screen, onStart runs pretty much right away, but the login solver seems to be in RandomExecutor.otherSolvers instead of the standard solver map. I'm not sure if I can access this without using reflection, will edit this post with more info shortly. EDIT: Here's the code I eventually ended up using, it's a bit overboard, but it does work
public void clearALLRandomHooksAndSolvers() throws IllegalAccessException, SecurityException, NoSuchFieldException{
bot.getRandomExecutor().clearHooks(); // does nothing
bot.getRandomExecutor().unregisterHook(RandomEvent.AUTO_LOGIN); // also does nothing
RandomExecutor exec = bot.getRandomExecutor();
Field other = exec.getClass().getDeclaredField("otherSolvers");
other.setAccessible(true);
((Set<RandomSolver>)other.get(exec)).clear();
Field solver = exec.getClass().getDeclaredField("solvers");
solver.setAccessible(true);
((Map<RandomEvent, RandomSolver>)solver.get(exec)).clear();
Field hooks = exec.getClass().getDeclaredField("hooks");
hooks.setAccessible(true);
((Map<RandomEvent, RandomBehaviourHook>)hooks.get(exec)).clear();
}