Un ejemplo mas o menos fácil es el del bifrost 1.0. El cliente cuando se construye un server añade la configuración de este al final del fichero. Los últimos 4 bytes te dicen la longitud total de la configuración, lo que debemos hacer es ver al longitud de la configuración, retroceder esa longitud para situarnos al principio de la configuración y leerla.
Así que lo primero será abrir el fichero que se recibe como parámetro situarnos al final del fichero menos los 4 bytes que nos dicen la longitud de la configuración y leer esos 4 bytes:
#include<stdio.h>
int main(int argc, char **args){
FILE *file;
int lenConfig;
file = fopen(*++args, "rb");
fseek(file, -4, SEEK_END);
fread(&lenConfig, sizeof(lenConfig), 1, file);
printf("Longitud total de la configuración: %02X", lenConfig);
return 0;
}
Este programa te muestra la longitud de la configuración.
Lo siguiente sería retroceder esa longitud y empezar a leer los datos:
...
short int lenDNS1, lenDNS2, lenDNS3;
char *dns1, *dns2, *dns3;
fseek(file, -lenConfig - 4, SEEK_END);
fread(&lenDNS1, sizeof(lenDNS1), 1, file);
dns1 = malloc(lenDNS1);
fread(dns1, sizeof(char), lenDNS1, file);
fread(&lenDNS2, sizeof(lenDNS2), 1, file);
dns2 = malloc(lenDNS2);
fread(dns2, sizeof(char), lenDNS2, file);
fread(&lenDNS3, sizeof(lenDNS3), 1, file);
dns3 = malloc(lenDNS3);
fread(dns3, sizeof(char), lenDNS3, file);
Con esto leeríamos los 3 dns del bifrost, pero los datos están codificados

El bifrost añade 16 bytes aleatorios, que son los usados para codificar la configuración usando la operación xor. Así que hice una función para descodificarlos:
void Decode(char codes[16], char *bytes, short int length){
int i;
for(i = 0; i< length; i++)
bytes[i] ^= codes[i % 16];
}
Siendo char codes[16] los 16 bytes usados para codificar, char *bytes la cadena a decodificar y short int length la longitud de esta cadena. Como veis es ir haciendo xor a cada byte de la cadena con cada byte de la clave...bueno esto mejor que explicarlo es ver el código...
Tras crear muchos servers con distintas configuraciones fui viendo que se escribía en cada campo, una vez que supe que había en cada sitio hice una estructura en C para que quedara mejor organizado:
struct config{
char ok[5]; //Es una cadena de 5 bytes ("_ok_\0") usada para comprobar que la configuración ha sido bien escrita
char codes[16]; //Los 16 bytes usados para codificar la configuración
short int lenDNS1; //La longitud del primer dns
char *dns1; //El primer dns...
short int lenDNS2;
char *dns2;
short int lenDNS3;
char *dns3;
int port; //El puerto a donde se conectará
char ActiveX; //0|1 Startup ActiveX
char RunLocal; //0|1 Startup Run Local Machine
char RunUser; //0|1 Startup Run Current User
char Melt; //0|1 Melt
char Directory; //0|1 System|Windows directory
char Delayed; //0|1 Delayed start
char startup[16]; //Registry key use for startup
char password[8]; //Password to authenticate the server to the client
char process[16]; //Filename when installed
char name[16]; //Assigned name to show in client
};
El resto del código esta en el rar que puse arriba, con esto espero que podais entender mejor el código.
Los pasos a seguir para añadir otro troyano/malware serían:- Ver en que parte se escribe la configuración, usando editores hexadecimales que permitan comparar dos ejecutables.
- Si está codificada ver como descodificarla, bien "a ojo" puede ser un simple xor, bien mirando el código fuente del troyano si está incluido, o usando algún debugger como ollydbg.
- Cuando ya tenemos la configuración en texto plano, tendremos que ver en que orden se escriben los diferentes campos, la longitud de estos, si se usa algún delimitador para separarlos etc...
- Ya lo último es hacer un programa, da igual el lenguaje, que reciba como segundo parámetro el servidor del troyano, y devuelva la configuración de este.
Para los 3 primeros pasos no es necesario saber programar, y el lenguaje no es ninguna limitación.
Por ejemplo alguien podría postear donde escribe un troyano la configuración y que estructura sigue esta y otro podría hacer el programa.
Saludos.