Sto lavorando a un convertitore binario non nativo di runtime in Windows e finora sono riuscito a "intercettare" gli interrupt (ad es. INT 0x99) per i binari del sistema operativo che sto cercando di emulare utilizzando un brutto attacco che utilizza Windows SEH per gestire interruzioni non valide; ma solo perché il vettore chiamata di sistema è diverso da quello di Windows, che mi permette di catturare queste eccezioni "soft" facendo qualcosa di simile a questo:"Trapping" delle chiamate sysenter di un processo nello spazio utente su Windows
static int __stdcall handler_cb(EXCEPTION_POINTERS* pes, ...)
{
if (pes->ExceptionRecord->ExceptionCode != EXCEPTION_ACCESS_VIOLATION)
return EXCEPTION_CONTINUE_SEARCH;
char* instruct = (char*) pes->ContextRecord->Eip;
if (!instruct)
handle_invalid_instruction(instruct);
switch (instruct[0])
{
case 0xcd: // INT
{
if (instruct[1] != 0x99) // INT 0x99
handle_invalid_instruction(instruct);
handle_syscall_translation();
...
}
...
default:
halt_and_catch_fire();
}
return EXCEPTION_SUCCESS;
}
che funziona abbastanza bene (ma lentamente), il problema con questo è che Windows tenta prima di gestire l'istruzione/interrupt, e per i binari non nativi che usano sysenter/sysexit invece di int 0x99, alcune istruzioni systenter nel binario non nativo sono effettivamente chiamate al kernel NT valide quando eseguite, ovvero il mio gestore non viene mai chiamato, e peggio; anche lo stato del sistema operativo "host" è compromesso. C'è un modo per "intrappolare" le istruzioni di sysenter in Windows? Come potrei fare questo?
È in esecuzione in modalità a 64 bit o in modalità a 32 bit (WOW64)? –
È in modalità di comparabilità a 32 bit poiché i file binari che sto emulando sono 32 bit – joshumax
Suppongo che non sia importante, perché SYSENTER è comunque valido su 32 bit. Non sono sicuro che le versioni di Windows a 32 bit supportino SYSENTER, ma a quanto pare (dalla tua sperimentazione), lo fanno. –