Motori polimorfici in C e / o C ++ [chiuso]

1

Mi sono imbattuto in motori polimorfici e non ne so nulla. Tuttavia, sono curioso di sapere come sono scritti. Ogni esempio che ho cercato li scrive in assemblea, la mia assemblea non è affatto buona; Conosco solo alcune istruzioni qua e là ma non così bene. D'altra parte, sono bravo in C e C ++.

Ho familiarità con il concetto di polimorfismo in C ++ ma dopo aver letto dei motori polimorfici, presumo che siano diversi dal polimorfismo in C ++.

Sto solo cercando un codice semplice che mostri la crittografia / decodifica e / o l'offuscamento del codice usando C e / o C ++

Come possono essere utilizzate tecniche come l'uso di parole chiave virtuali in C ++ per offuscare o cifrare il codice in un'applicazione?

NOTA: mi è stato detto di trasferire questa domanda da stackoverflow.com a questo luogo.

    
posta Hawk 08.09.2014 - 14:03
fonte

1 risposta

1

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,
    1. In C, il programmatore deve occuparsi di tutte le manipolazioni necessarie per mantenere la tabella dei metodi virtuale;
    2. 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.)

    
risposta data 08.09.2014 - 19:45
fonte

Leggi altre domande sui tag