Este programa nos permitirá ocultar cualquier archivo dentro de otro. Muy útil para, por ejemplo, ocultar un RAR o un ZIP en un JPG o en un WAV. Su funcionamiento es bien sencillo, al ocultar un archivo dentro de otro lo que haremos será cargar el binario de ambos y unirlos uno detrás del otro usando un token o indicador que nos sirva para identificar el final de uno y el principio del otro. La mayoría de los archivos binarios poseen estructuras que indican su inicio y final, de modo que al nosotros agregarle el binario de otro archivo la integridad del primero no se ve afectada.
Importante saber que al ocultar un archivo dentro de otro por este medio el tamaño del nuevo binario será igual a la suma del primero más el segundo más 65 bytes (que corresponden al token), digo esto porque sería muy sospechoso encontrar un JPG con resolución 800×600 que se lleve 50Mb.
El uso de este programa es bien sencillo, está diseñado para funcionar desde la consola del sistema. Para llamarlo debemos posicionarnos sobre la carpeta que lo contenga y luego referenciarlo por su nombre. Al llamarlo sin parámetros nos muestra la lista de opciones válidas que le podemos entrar.
h: Oculta File2 en File1
e: Extrae el archivo oculto en File1 a File2
q: Chequea si hay algo oculto en File1
c: Elimina el binario oculto en File1
<Ejemplos> HideInBin h «C:\notepad.exe» «C:\codigos.rar» – Ocultará el archivo «codigos.rar»
dentro de «notepad.exe»
HideInBin e «C:\notepad.exe» «C:\archivo.rar» – Extraerá el binario oculto en «notepad.exe»
para guardarlo como «archivo.rar»
HideInBin q «C:\notepad.exe» – Chequea si existe algo oculto en «notepad.exe»
HideInBin c «C:\notepad.exe» – Elimina el binario oculto en «notepad.exe»
dejando como mismo estaba antes.
A continuación el código, debe ser compilado con Borland C++ Builder como aplicación de consola
y con la opción C++ marcada ya que si lo compilas como aplicación de C no podrás agregar classes.hpp
-----------
/*
**
** $Nombre: HideInBin.cpp
**
** $Autor: h0aX [hoax_ws@yahoo.es]
**
** $Fecha: 23-agosto-2007
**
** &Descripción: Oculta un archivo en el interior de
** otro. Útil para ocultar, por ejemplo,
** un .RAR en un .JPG, sin dañar la integridad
** de ninguno de los dos archivos.
**
**
** $Advertencia: Al momento de ser liberado este programa no
** ha sido sometido a ninguna prueba rigurosa
** para comprobar su correcto funcionamiento.
** De modo que no me hago responsable de ninguna
** pérdida de información por algún bug o mal
** funcionamiento.
**
*/
//---------------------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <classes.hpp> /*clases de borland para hacernos la vida más fácil*/
#pragma hdrstop
#pragma argsused
/* Esto es para saber cuando termina un binario y empieza otro.
** El buffer está en hexa por si se quiere ocultar este mismo programa
** o si se oculta algo dentro de él no salga el Token como un string
** reference y corte el binario por el lugar equivocado.
*/
char szToken[] = {
0x68, 0x30, 0x61, 0x58, 0x20, 0x69, 0x73, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x6E, 0x64,
0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6D, 0x79, 0x20, 0x6D, 0x61, 0x72, 0x6B,
0x2F, 0x26, 0x54, 0x47, 0x26, 0x2F, 0x47, 0x26, 0x2F, 0x47, 0x2F, 0x26, 0x46, 0x25, 0x45, 0x24,
0x25, 0x52, 0x45, 0x47, 0x26, 0x2F, 0x47, 0x26, 0x2F, 0x47, 0x2F, 0x54, 0x26, 0x2F, 0x47, 0x46,
0x00
};
//------------------------PROTOTIPOS DE FUNCIONES----------------------------
void Banner();
void Usage();
BOOL BinToStr(String FileName, String &str);
BOOL StrToBin(String str,String FileName);
BOOL JoinFiles(char *szFile1, char *szFile2);
BOOL ExtractFile(char *szFile1, char *szFile2);
BOOL CheckBin(char *szFile);
BOOL ClearBin(char *szFile);
int main(int argc, char* argv[]);
//---------------------------------------------------------------------------
void Banner()
{
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf(" Hide In Binary\n");
printf(" por h0aX [hoax_ws@yahoo.es]\n");
printf(" para la comunidad BlackHat [blackhat4all@gmail.com]\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n");
}
//---------------------------------------------------------------------------
void Usage()
{
printf(" Uso: HideInBin <Opción> <File1> <File2>\n\n");
printf(" Opciones:\n");
printf(" h: Oculta File2 en File1\n");
printf(" e: Extrae el archivo oculto en File1 a File2\n");
printf(" q: Chequea si hay algo oculto en File1\n");
printf(" c: Elimina el binario oculto en File1\n");
}
//---------------------------------------------------------------------------
/*
** Carga el binario de un archivo en un String
*/
BOOL BinToStr(String FileName, String &str)
{
str = "";
char *sExe;
TMemoryStream *msExe;
if (!FileExists(FileName))
return FALSE;
msExe = new TMemoryStream;
msExe->LoadFromFile(FileName);
sExe = new char[msExe->Size];
msExe->ReadBuffer(sExe,msExe->Size);
str.SetLength(msExe->Size);
for (int i=0; i<msExe->Size ;i++)
{str[i+1]=sExe[i];}
delete[] sExe;
delete msExe;
return TRUE;
}
//---------------------------------------------------------------------------
/*
** Guarda un String en un archivo
*/
BOOL StrToBin(String str,String FileName)
{
char *sExe;
TMemoryStream *msExe;
msExe = new TMemoryStream;
msExe->WriteBuffer(str.c_str() ,str.Length());
try
{msExe->SaveToFile(FileName);}
catch (...)
{return FALSE;}
delete msExe;
return TRUE;
}
//---------------------------------------------------------------------------
/*
** Junta dos binarios en uno
*/
BOOL JoinFiles(char *szFile1, char *szFile2)
{
String Data1, Data2;
if (CheckBin(szFile1)) {
printf("Ya existe un binario oculto en %s\n", szFile1);
return FALSE;
}
if ( !((BinToStr(szFile1, Data1)) && (BinToStr(szFile2, Data2))) ) {
printf("ERROR abriendo %s o %s\n", szFile1, szFile2);
return FALSE;
}
Data1 = Data1 + szToken;
Data1 = Data1 + Data2;
if (!StrToBin(Data1, szFile1)) {
printf("ERROR ecribiendo %s\n", szFile1);
return FALSE;
}
return TRUE;
}
//---------------------------------------------------------------------------
/*
** Extrae el binario oculto en szFile1 y lo guarda como szFile2
*/
BOOL ExtractFile(char *szFile1, char *szFile2)
{
String Data1, Data2;
if (!CheckBin(szFile1)) {
printf( "No hay binario para extraer.\n" );
return FALSE;
}
if (!BinToStr( szFile1, Data1 )) {
printf("ERROR abriendo %s\n", szFile1);
return FALSE;
}
Data2 = Data1.SubString( Data1.Pos(szToken)+strlen(szToken), Data1.Length() );
if (!StrToBin( Data2, szFile2 )) {
printf("ERROR creando %s\n", szFile2);
return FALSE;
}
return TRUE;
}
//---------------------------------------------------------------------------
/*
** Chequea si hay algo oculto en un binario
*/
BOOL CheckBin(char *szFile)
{
String Data;
if (!BinToStr( szFile, Data ))
return FALSE;
return Data.Pos(szToken);
}
//---------------------------------------------------------------------------
/*
** Elimina el binario oculto en un archivo dejandolo en su tamaño original
*/
BOOL ClearBin(char *szFile)
{
String Data;
if ( !CheckBin(szFile) )
return FALSE;
if ( !BinToStr( szFile, Data ) ) {
printf("ERROR abriendo %s\n", szFile);
return FALSE;
}
Data = Data.SubString( 1, Data.Pos(szToken)-1 );
return StrToBin(Data, szFile);
}
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
Banner();
if (4 == argc)
{
if (!strcmp(argv[1],"h"))
{
if ( JoinFiles( argv[2], argv[3] ) ) {
printf( " %s ocultado en %s\n",argv[3], argv[2] );
}
}
else
if (!strcmp(argv[1],"e"))
{
if ( ExtractFile( argv[2], argv[3] ) ) {
printf( " Extraído %s de %s\n",argv[3], argv[2] );
}
}
}
else
if (3 == argc)
{
if (!strcmp(argv[1],"q"))
{
if (CheckBin(argv[2]))
{
printf( " Hay un binario oculto en %s\n", argv[2] );
}
else
{
printf( " Ningún binario oculto en %s\n", argv[2] );
}
}
else
if (!strcmp(argv[1],"c"))
{
if (ClearBin(argv[2])) {
printf( " Binario eliminado\n" );
}
else
{
printf( " No hay binario que eliminar\n" );
}
}
}
else
{
Usage();
}
return 0;
}
//---------------------------------------------------------------------------
Escrito por H0ax [hoax_ws@yahoo.es]
