Thinking about what questions could be asked to the user, which will not be vulnerable to key loggers - could we have a user definable algorithm asked?
This could be as simple or complex as the user wishes to make it, but something like these:
x + y
concat(x, y)
concat(x * y, x)
substring(reverse(concat(x,y), 5)
hash(substring(reverse(concat(x,y), 5)) // one for a hardware device or local software script maybe?!
etc.
Each login, the input values for x or y (for example) could be presented to the user and the user would have to calculate the output.
Obviously, an eves dropper could derive the value of x and y over time, but it wouldn’t be obvious from a single login attempt. Brute forcing could also be an issue, but with sufficient complexity that would be hard (and the user/pass already makes this tough).
The algorithm would need to be easy enough not to be a PITA, but hard enough to provide protection.
I suppose this falls into the ‘something you know’ category, but instead of it being something someone could guess or a hard coded list, etc, it is a bit more nuanced. The user could rotate the algorithm over time too (again, as frequently as they desire for security vs difficulty to remember).
This wouldn’t require any writing of data (unless the user changed the algorithm) and nor would it require a second device (for good or bad). I suppose you could use a second device to store the algorithm, which would allow them to be more elaborate/challenging, but even that could be on local device storage.