I am familiar with the concept of polymorphism in C++ but after
reading about polymorphic engines, I am assuming that they are
different from the polymorphism in C++.
How can techniques such as using virtual keyword in C++ be used to
obfuscate or encrypt the code in an application?
La tua ipotesi è corretta. Sono cose diverse.
- In genere, né C né C ++ fanno uso della generazione di codice in fase di esecuzione, né usano codici di auto-modifica.
- C e C ++ consente il puntatore di funzioni, così come cast di tipi non controllati tra praticamente qualsiasi cosa. Queste due funzionalità consentono di eseguire un salto della CPU (trasferimento di esecuzione) in qualsiasi indirizzo.
- Un programmatore può scrivere codice C o C ++ che concatena frammenti di byte costituiti da codice macchina significativo in un buffer di byte e quindi emette una chiamata all'inizio di questo frammento di codice macchina. In genere, il frammento di codice macchina contiene una o più istruzioni restituite che restituiscono il controllo al codice C / C ++ chiamante.
- Tuttavia, poiché la maggior parte dei programmi C e C ++ non esegue salti arbitrari, quando questi programmi vengono eseguiti con un sistema operativo (OS), il sistema operativo può utilizzare una funzione della CPU nota come "Execution Disable bit" (NX) per impedire i salti in indirizzi che non facevano parte dell'output binario del compilatore C / C ++.
- In genere, la funzione "puntatore di funzione" viene utilizzata dai programmatori C per implementare una tabella dei metodi virtuali .
- C ++ fornisce un meccanismo più comprensibile per la creazione di oggetti di classe ereditabili, ottenuto in parte dal meccanismo della tabella dei metodi virtuale.
- La differenza tra l'approccio C e C ++ alla tabella dei metodi virtuali è che,
- In C, il programmatore deve occuparsi di tutte le manipolazioni necessarie per mantenere la tabella dei metodi virtuale;
- In C, il programmatore può eseguire qualsiasi tipo di manipolazione sulla tabella dei metodi virtuale, in qualsiasi momento (anche nel mezzo dell'esecuzione di un metodo)
- In genere, i motori polimorfici (offuscamento del codice) non utilizzano la tabella dei metodi virtuale. Questo perché una tabella del metodo virtuale hard-coded è altamente visibile quando il codice della macchina viene analizzato in fase di esecuzione (con un debugger collegato), poiché consiste di puntatori consecutivi in un intervallo di indirizzi di memoria costituito da codice eseguibile.
- Solo per scopi didattici, tuttavia, potrebbe essere utile per uno implementare un motore utilizzando i puntatori di funzione C / C ++.
I'm just looking for simple code that shows encryption/decryption
and/or obfuscation of code using C and/or C++
Purtroppo questo è out-of-topic per Programmers.StackExchange.
Se hai domande su questi argomenti in merito alla sicurezza delle informazioni:
- Crittografia e decodifica,
- Offuscamento del codice
Prova a chiedere a link
Se stai cercando uno strumento C ++ per generare frammenti richiamabili di codice assembly, prova AsmJit . Permette di imparare le basi della generazione di codice di assembly a livello di programmazione. Da questo, puoi imparare come generare diversi frammenti di codice assembly che eseguono un calcolo funzionalmente equivalente.
(Disclaimer: non ho usato AsmJit prima.)