Desarrollo de malware en C

Iniciado por dyn4m0_st4rk, 14 Julio 2010, 03:52 AM

0 Miembros y 1 Visitante están viendo este tema.

dyn4m0_st4rk

Buenas a todos los foreros.

La cuestión esque aprendí a manejar C estructurado, leí tutoriales y tras un buen rato de ocio por fin aprendí.
Veo que muchos lo recomiendan como base en cuanto al desarrollo de malware, lamentablemente no le encuentro aplicación alguna para malware.
Me la pase haciendo calculadores, agendas, repeticiones de numeros nones y pares, etc. etc.

¿Qué tiene que ver con un malware?, ahora veo que con batch es facilisimo hacer un bucle de procesos.. entonces todo lo que aprendí en C sirvio para nada?.
¿Hay algun tutorial de C enfocado al malware?, no encontre ninguno en los demas foros. ¿Alguna recomendación?.. Me sigo con el batch y abandono el C?

Aquí les paso una de mis ultimas practicas en C.



#include<stdlib.h>//libreria para comunicarme con el sistema
#include<conio.h>//libreria para pausar el sistemea
#include<stdio.h>// libreria estandar de entradas y salidas

//variables globales
char nombreContacto[5][50];
char direccionContacto[5][50];
char telefonoCasa[5][15];
char telefonoCelular [5] [15];
int  edad[5];

void modificarContacto(){
int numeroContactoModificar=0;

   printf("\nQue contacto deseas modificar?" );
   scanf("%d",&numeroContactoModificar);
   if ((numeroContactoModificar>5)||(numeroContactoModificar<=0)){
   printf ("\n no existe ese contacto");}
   else {
   printf("Introduce el nombre del #%d contacto: ", (numeroContactoModificar));
fflush(stdin);
gets(nombreContacto[numeroContactoModificar-1]);
printf("Introduce la direccion del #%d contacto: ", (numeroContactoModificar));
fflush(stdin);
gets(direccionContacto[numeroContactoModificar-1]);
printf("Introduce el telefono del #%d contacto: ", (numeroContactoModificar));
fflush(stdin);
gets(telefonoCasa[numeroContactoModificar-1]);
printf("Introduce el celular del #%d contacto: ", (numeroContactoModificar));
fflush(stdin);
gets(telefonoCelular[numeroContactoModificar-1]);
printf("Introduce la edad del #%d contacto: ", (numeroContactoModificar));
scanf(" %d",&edad[numeroContactoModificar-1]);
}
}

void verTodos() {
     for (int indice=0; indice<=4; indice++) {
         printf("\n\nNombre: ");
         puts (nombreContacto[indice]);
          fflush(stdin);
         printf("Telefono: ");
         puts(telefonoCasa[indice]);
          fflush(stdin);
         printf("Celular: ");
         puts(telefonoCelular[indice]);
          fflush(stdin);
         printf("Edad: ");
         printf(" %d", edad[indice]);
         }
         }
void verContacto() {
     int numeroContacto=0;
     printf ("\nIntroduce el numero del contacto que deseas ver:  ");
     scanf (" %d",&numeroContacto);
     if ((numeroContacto>5)||(numeroContacto<=0)){
   printf ("\n no existe ese contacto");}
   else {
       printf("\nNombre: ");
         puts (nombreContacto[numeroContacto-1]);
          fflush(stdin);
         printf("Telefono: ");
         puts(telefonoCasa[numeroContacto-1]);
          fflush(stdin);
         printf("Celular: ");
         puts(telefonoCelular[numeroContacto-1]);
          fflush(stdin);
         printf("Edad: ");
         printf(" %d", edad[numeroContacto-1]);
                  }   
                  }
   void guardarAgenda () {
                     
   FILE *miArchivoTexto;//CREO UNA VARIABLE QUE DIRECCIONA A UN TIPO ARCHIVO
   miArchivoTexto = fopen ("Agenda.txt","w");
    for (int indice=0; indice<=4; indice++) {
         fprintf(miArchivoTexto, " \nNombre:%s", &nombreContacto[indice]);
         fprintf(miArchivoTexto, " Telefono:%s", &telefonoCasa[indice]);
         fprintf(miArchivoTexto, " Celular:%s", &telefonoCelular[indice]);
         fprintf(miArchivoTexto, " Edad:%d", edad[indice]);
         }
      fclose (miArchivoTexto);
}
                           
main(){
system("title AGENDA ");
system("color A");
   
  char opcion;
char final;

printf("\t\t\tBIENVENIDO A TU AGENDA\n");
printf("\t\t\t======================\n");
for(int indice=0; indice<=4;indice++){
printf("\nIntroduce el nombre del #%d contacto: ", (indice+1));
fflush(stdin);
gets(nombreContacto[indice]);
printf("Introduce la direccion del #%d contacto: ", (indice+1));
fflush(stdin);
gets(direccionContacto[indice]);
printf("Introduce el telefono del #%d contacto: ", (indice+1));
fflush(stdin);
gets(telefonoCasa[indice]);
printf("Introduce el numero celular del #%d contacto: ", (indice+1));
fflush(stdin);
gets(telefonoCelular[indice]);
printf("Introduce la edad del #%d contacto: ", (indice+1));
scanf(" %d",&edad[indice]);
}
system ("cls");
do{
printf ("Que operacion deseas realizar?\na)Modificar un contacto\nb)Ver todos los contactos\nc)Ver un solo contacto\nd)Guardar agenta en memoria \n");
scanf (" %s",&opcion);
switch (opcion) {
case 'a': case'A':
modificarContacto();
break;
case'b':case'B':
verTodos();
break;
case'c': case'C':
verContacto();
break;
case'd': case'D':
guardarAgenda();
break;
default:
printf ("\nOpcion invalida... ");
}
printf ("\nDeseas realizar otra operacion?s/n ");
scanf (" %s",&final);
system ("cls");
}while ((final=='s')||(final=='S'));
printf ("\nGracias por utilizar este programa =) ");
getch();
}


Es frustrante solo saber hacer este tipo de programas, y ni si quiera algo cercano a un virus.... :-(

Gracias de antemano.


Saludos
"El que busca la verdad corre el riesgo de encontrarla".

[Zero]

Bueno, para hacer malware debes aprender a manejar archivos, memoria, sockets, registro, procesos, etc... Ya sea con las funciones de C o con las API's de Windows (ésto es lo más recomendable). No tienes más que buscar códigos por la red, seguro de ahí ya puedes arrancar.

Saludos

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

Horricreu

#2
Estoy de acuerdo con [Zero]. En esta Web encuentras todas las funciones de la API de Windows bien explicadas y, muchísima más información acerca de lo que te dijo.

Otra cosa, dices que ya sabes más o menos moverte bien en este lenguaje. Veo "errores" tontos como utilizar gets(), fflush(stdin), scanf(), la librería conio... puedes pasarte por acá, donde te solucionarán fácilmente estos errores.

Saludos :P

[L]ord [R]NA

Para malware especialmente debe de conocer el sistema operativo, si lo conoces agregando la API de Windows e imaginacion ya serias muy bueno en malware.

dyn4m0_st4rk

Gracias a todos por sus respuestas.

Perdonen mi graaan ignorancia, reitero que soy un novato total en esto.

Cita de: Horricreu en 14 Julio 2010, 12:45 PM
Estoy de acuerdo con [Zero]. En esta Web encuentras todas las API's bien explicadas y, muchísima más información acerca de lo que te dijo.

Otra cosa, dices que ya sabes más o menos moverte bien en este lenguaje. Veo "errores" tontos como utilizar gets(), fflush(stdin), scanf(), la librería conio, ... puedes pasarte por acá, donde te solucionarán fácilmente estos errores.

Saludos :P
Entre a la primera pagina que me diste, pero ¿En que apartado estan las API?, busque y solo encuentro tutoriales (para vb) que son para llamar APIS.


y otra preguntaa ¿Dónde puedo encontrar los commandos de C para manejar archivos y librerias?... los tutoriales no salen del scanf y del pintf...

Muchas gracias, aprecio sus respuestas  ;-)
"El que busca la verdad corre el riesgo de encontrarla".

Horricreu

#5
Cita de: dyn4m0_st4rk en 14 Julio 2010, 22:07 PM
Gracias a todos por sus respuestas.

Perdonen mi graaan ignorancia, reitero que soy un novato total en esto.

Cita de: Horricreu en 14 Julio 2010, 12:45 PM
Estoy de acuerdo con [Zero]. En esta Web encuentras todas las API's bien explicadas y, muchísima más información acerca de lo que te dijo.

Otra cosa, dices que ya sabes más o menos moverte bien en este lenguaje. Veo "errores" tontos como utilizar gets(), fflush(stdin), scanf(), la librería conio, ... puedes pasarte por acá, donde te solucionarán fácilmente estos errores.

Saludos :P
Entre a la primera pagina que me diste, pero ¿En que apartado estan las API?, busque y solo encuentro tutoriales (para vb) que son para llamar APIS.


y otra preguntaa ¿Dónde puedo encontrar los commandos de C para manejar archivos y librerias?... los tutoriales no salen del scanf y del pintf...

Muchas gracias, aprecio sus respuestas  ;-)

Bueno, es que hace poco cambiaron el diseño y la estructuración de la MSDN y, antes salía la lista de funciones de la API ordenadas alfabéticamente. Ahora tienes que ir acá. Dentro de esta página hay muchas otras páginas ordenadas y, vas encontrando las funciones. Por ejemplo, la información de ReadFile está en: System Services/File Services/Local File Systems/File Management/File Management Reference/File Management Functions y, dentro de ahí hay muchas funciones relacionadas con ficheros.

Pero yo no lo haría de esta forma ya que es muy molesto encontrarlas. Lee muchos códigos y, luegos en Google pones la función que quieras consultar y, ya te saldrá la información de la MSDN. Pero, antes de he pasado el enlace de la MSDN no sólo por las funciones explicadas sino por la cantidad de información explicada.

Saludos :P

dyn4m0_st4rk

CitarBueno, es que hace poco cambiaron el diseño y la estructuración de la MSDN y, antes salían las API's ordenadas alfabéticamente. Ahora tienes que ir acá. Dentro de esta página hay muchas otras páginas ordenadas y, vas encontrando las API's. Por ejemplo, la información de ReadFile está en: System Services/File Services/Local File Systems/File Management/File Management Reference/File Management Functions y, dentro de ahí hay muchas API's relacionadas con ficheros.

Pero yo no lo haría de esta forma ya que es muy molesto encontrarlas. Lee muchos códigos y, luegos en Google pones la API que quieras consultar y, ya te saldrá la información de la MSDN. Pero, antes de he pasado el enlace de la MSDN no sólo por las API's sino por la cantidad de información explicada.


Ya entre a la web, muchisimas gracias, de igual manera sigo sin entender nada de esas cosas :-( lo veo muuy complicado.. y en vista de esto.. realmente me recomiendan mas el C para malware que el batch?... me aferro a creer que el batch es mas útil..., pero no lo se, ignoro mucho y la ignorancia es valienteee.



Gracias
"El que busca la verdad corre el riesgo de encontrarla".

braulio--

Cita de: dyn4m0_st4rk en 14 Julio 2010, 22:41 PM
CitarBueno, es que hace poco cambiaron el diseño y la estructuración de la MSDN y, antes salían las API's ordenadas alfabéticamente. Ahora tienes que ir acá. Dentro de esta página hay muchas otras páginas ordenadas y, vas encontrando las API's. Por ejemplo, la información de ReadFile está en: System Services/File Services/Local File Systems/File Management/File Management Reference/File Management Functions y, dentro de ahí hay muchas API's relacionadas con ficheros.

Pero yo no lo haría de esta forma ya que es muy molesto encontrarlas. Lee muchos códigos y, luegos en Google pones la API que quieras consultar y, ya te saldrá la información de la MSDN. Pero, antes de he pasado el enlace de la MSDN no sólo por las API's sino por la cantidad de información explicada.


Ya entre a la web, muchisimas gracias, de igual manera sigo sin entender nada de esas cosas :-( lo veo muuy complicado.. y en vista de esto.. realmente me recomiendan mas el C para malware que el batch?... me aferro a creer que el batch es mas útil..., pero no lo se, ignoro mucho y la ignorancia es valienteee.



Gracias
Si aprendes el 10% de batch y de C, te será mucho más útil batch. En cambio, si aprendes el 80% por ciento de ambos , batch te parecerá un juguete. Por supuesto los porcentajes son inventados pero supongo que se entiende.

Horricreu

#8
Cita de: dyn4m0_st4rk en 14 Julio 2010, 22:41 PM
CitarBueno, es que hace poco cambiaron el diseño y la estructuración de la MSDN y, antes salían las API's ordenadas alfabéticamente. Ahora tienes que ir acá. Dentro de esta página hay muchas otras páginas ordenadas y, vas encontrando las API's. Por ejemplo, la información de ReadFile está en: System Services/File Services/Local File Systems/File Management/File Management Reference/File Management Functions y, dentro de ahí hay muchas API's relacionadas con ficheros.

Pero yo no lo haría de esta forma ya que es muy molesto encontrarlas. Lee muchos códigos y, luegos en Google pones la API que quieras consultar y, ya te saldrá la información de la MSDN. Pero, antes de he pasado el enlace de la MSDN no sólo por las API's sino por la cantidad de información explicada.



Ya entre a la web, muchisimas gracias, de igual manera sigo sin entender nada de esas cosas :-( lo veo muuy complicado.. y en vista de esto.. realmente me recomiendan mas el C para malware que el batch?... me aferro a creer que el batch es mas útil..., pero no lo se, ignoro mucho y la ignorancia es valienteee.



Gracias

Bueno, supongo que crees que Batch es más fácil para "programar" malware, pero te lo piensas porque es muy sencillo y, al principio puedes hacer cosas muy simples y rápidas. Créeme, cuando sepas manejar todo esto en C/C++ ya veremos...

A ver, no es que no entiendas nada de estas cosas. Te dije que te miraras algunos códigos de malware programados en C/C++, donde manejan funciones de la API de Windows. A partir de ahí vas buscando información sobre ellas. Por ejemplo, te dejo un código que ofusca un simple fichero:

Código (cpp) [Seleccionar]
#include <windows.h>

int main()
{
       HANDLE hHeap = GetProcessHeap();

//Abrimos la ruta del archivo
LPSTR lpFileName = "C:\\prueba.txt";
HANDLE hFile = CreateFile(lpFileName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

//Leemos el archivo
DWORD nNumberOfBytesToRead = GetFileSize(hFile, 0);
LPSTR lpBuffer = (LPSTR)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, nNumberOfBytesToRead);
DWORD nNumberOfBytesRead = 0;
ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, &nNumberOfBytesRead, 0);

//Ofuscamos el buffer
for(DWORD n = 0; n < nNumberOfBytesToRead; n++) lpBuffer[n] ^= 100;

//Empezamos a guardar desde el principio del archivo
SetFilePointer(hFile, FILE_BEGIN, 0, 0);

//Sobreescribimos los carácteres ofuscados
WriteFile(hFile, lpBuffer, nNumberOfBytesToRead, &lpNumberOfBytesRead, 0);

//Liberamos la memoria dinámica
HeapFree(hHeap, 0, lpBuffer);

//Cerramos los handles
CloseHandle(hFile);
       CloseHandle(hHeap);

return 0;
}


Crea un fichero que se llame prueba en el directorio C:\ y, luego escribe algo, guárdalo y ciérralo. Seguidamente ejecuta este programa y notarás una ligera diferencia.

Te he puesto este código, comentado, porque estoy manejando las funciones que seguramente vas a utilizar más. Espero que lo vayas cogiendo.

Saludos :P

dyn4m0_st4rk

Cita de: Horricreu en 15 Julio 2010, 13:04 PM
Cita de: dyn4m0_st4rk en 14 Julio 2010, 22:41 PM
CitarBueno, es que hace poco cambiaron el diseño y la estructuración de la MSDN y, antes salían las API's ordenadas alfabéticamente. Ahora tienes que ir acá. Dentro de esta página hay muchas otras páginas ordenadas y, vas encontrando las API's. Por ejemplo, la información de ReadFile está en: System Services/File Services/Local File Systems/File Management/File Management Reference/File Management Functions y, dentro de ahí hay muchas API's relacionadas con ficheros.

Pero yo no lo haría de esta forma ya que es muy molesto encontrarlas. Lee muchos códigos y, luegos en Google pones la API que quieras consultar y, ya te saldrá la información de la MSDN. Pero, antes de he pasado el enlace de la MSDN no sólo por las API's sino por la cantidad de información explicada.



Ya entre a la web, muchisimas gracias, de igual manera sigo sin entender nada de esas cosas :-( lo veo muuy complicado.. y en vista de esto.. realmente me recomiendan mas el C para malware que el batch?... me aferro a creer que el batch es mas útil..., pero no lo se, ignoro mucho y la ignorancia es valienteee.



Gracias

Bueno, supongo que crees que Batch es más fácil para "programar" malware, pero te lo piensas porque es muy sencillo y, al principio puedes hacer cosas muy simples y rápidas. Créeme, cuando sepas manejar todo esto en C/C++ ya veremos...

A ver, no es que no entiendas nada de estas cosas. Te dije que te miraras algunos códigos de malware programados en C/C++, donde manejan las API's. A partir de ahí vas buscando información sobre ellas. Por ejemplo, te dejo un código que ofusca un simple fichero:

Código (cpp) [Seleccionar]
#include <windows.h>

int main()
{
//Abrimos la ruta del archivo
LPSTR lpFileName = "C:\\prueba.txt";
HANDLE hFile = CreateFileA(lpFileName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);

//Leemos el archivo
DWORD nNumberOfBytesToRead = GetFileSize(hFile,0);
LPSTR lpBuffer = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,nNumberOfBytesToRead);
DWORD lpNumberOfBytesRead = 0;
ReadFile(hFile,lpBuffer,nNumberOfBytesToRead,&lpNumberOfBytesRead,0);

//Ofuscamos el buffer
for(DWORD n = 0;n < nNumberOfBytesToRead;n++) lpBuffer[n] ^= 100;

//Empezamos a guardar desde el principio del archivo
SetFilePointer(hFile,FILE_BEGIN,0,0);

//Sobreescribimos los carácteres ofuscados
WriteFile(hFile,lpBuffer,nNumberOfBytesToRead,&lpNumberOfBytesRead,0);

//Liberamos la memoria dinámica
HeapFree(GetProcessHeap(),0,lpBuffer);

//Cerramos los handles
CloseHandle(hFile);

return 0;
}


Crea un fichero que se llame prueba en el directorio C:\ y, luego escribe algo, guárdalo y ciérralo. Seguidamente ejecuta este programa y notarás una ligera diferencia.

Te he puesto este código, comentado, porque estoy manejando las API's que seguramente vas a utilizar más. Espero que lo vayas cogiendo.

Saludos :P


Muchas gracias, ya estoy en ello.

Saludos
"El que busca la verdad corre el riesgo de encontrarla".