Quindi generi casualmente codice ed eseguilo?
Per come la vedo io, le tue scelte linguistiche sono:
- binario (istruzioni macchina dirette)
- qualsiasi lingua di livello superiore
Se (2) viene generato casualmente, probabilmente semplicemente non verrà compilato. Supponendo che il tuo codice non sia veramente casuale e tu lo faccia compilare, molto probabilmente finirai con delle eccezioni a causa di tutti i cattivi dati che vengono trasmessi.
Quindi questo ti lascia solo con (1). Hai una probabilità molto più alta (ancora non al 100%) che sarai in grado di mettere insieme un mucchio di istruzioni macchina "dall'aspetto valido" che potrebbero essere eseguite. Ma poi di nuovo, il 99,99% delle istruzioni della macchina generate a caso non supererà nemmeno 4 o 5 di esse.
Se vuoi provarlo tu stesso. Direi di dimenticare di provare a prevenire i danni . Non ce ne saranno. Basta compilare qualsiasi programma C ++, inserire un breakpoint nella funzione principale, aprire la finestra di smontaggio e spianare sulla memoria con dati casuali e solo vedere fino a che punto arriva il tuo programma.
L'unica protezione di cui hai bisogno è già fornita per te da qualsiasi sistema operativo moderno che supporti la memoria virtuale. Un normale processo utente (ad esempio uno che non è in esecuzione in modalità kernel) non può danneggiare alcun altro processo o il sistema operativo stesso. Il peggio che può fare è uccidersi mentre esegue istruzioni non valide. Penso che per il tuo esperimento, dovrebbe essere tutta la protezione di cui hai bisogno.