Bien como dice el titulo estoy haciendo mi crypter el cual ya es funcional ,,pero me di cuenta (no es gran secreto jaja) q los avs detectan los extra data en el stub como codigo malicisos obviamente el codigo q pego a lo ultimo del stub esta encryptado ,,ahora mi pregunta es como hacer para q ese codigo q meto sea parte del exe osea q este dentro de la ultima sección por ejemplo encotre esto ** algo viejo pero aun no logro hacerlo ,,si alguien me puede dar una mano se lo agredeceria mucho! ,,saludos
** http://foro.elhacker.net/programacion_vb/crear_un_pe_editor_simple-t229389.0.html (http://foro.elhacker.net/programacion_vb/crear_un_pe_editor_simple-t229389.0.html)
.
Debes realinear las secciones del formato PE, de tal manera que dicha estructura incluya los datos finales...
Dulces Lunas!¡.
BlackZeroX gracias por contestar tan rapidamente !!!,,no me puedes dar un empujon un poquito mayor jaja ,,realmente entiendo lo q me dices pero hacerlo realidad es otra cosa ..
.
Traducelo esta en C (Son solo equivalencias...).
#include <windows.h>
#include <stdio.h>
#define ReadBinary "r+b"
/* Realing PE function
Programmer : The Swash
Thanks to : Thor, Slek
Dedicated : Thor, Psymera, [Zero], Steve10120, Karcrack, Cobein
*/
int PEFileSize(char * fPath);
int AlingNum(int num, int aling);
char * BytesAling(int number);
int main(void)
{
printf("%i ",RealingPE("C:\\hi.exe"));
getchar();
}
int RealingPE(char * FilePath)
{
int OriginalSize = 0;
int ActualSize = 0;
int iEOF = 0, iEOFAlingned = 0, iWrite = 0;
FILE * lpFile;
IMAGE_DOS_HEADER IDH;
IMAGE_NT_HEADERS INH;
IMAGE_SECTION_HEADER ISH;
OriginalSize = PEFileSize(FilePath);
if (OriginalSize != -1)
{
lpFile = fopen(FilePath, ReadBinary);
if (lpFile != NULL)
{
fseek(lpFile,0,SEEK_END);
ActualSize = ftell(lpFile);
if (ActualSize - OriginalSize > 0)
{
rewind(lpFile);
fread(&IDH, sizeof(IDH), 1, lpFile);
fseek(lpFile, IDH.e_lfanew, SEEK_SET);
fread(&INH, sizeof(INH), 1, lpFile);
fseek(lpFile, IDH.e_lfanew + sizeof(INH) + (sizeof(ISH) * (INH.FileHeader.NumberOfSections-1)), SEEK_SET);
fread(&ISH, sizeof(ISH), 1, lpFile);
iEOF = ActualSize - OriginalSize;
iEOFAlingned = AlingNum(iEOF, INH.OptionalHeader.FileAlignment);
if (ISH.VirtualAddress == INH.OptionalHeader.DataDirectory[2].VirtualAddress)
{
ISH.SizeOfRawData += iEOFAlingned;
ISH.Misc.VirtualSize += iEOFAlingned;
INH.OptionalHeader.SizeOfImage += iEOFAlingned;
INH.OptionalHeader.DataDirectory[2].Size += iEOFAlingned;
fseek(lpFile, IDH.e_lfanew, SEEK_SET),
iWrite = fwrite(&INH, 1, sizeof(INH), lpFile);
fseek(lpFile, IDH.e_lfanew + sizeof(INH) + (sizeof(ISH) * (INH.FileHeader.NumberOfSections-1)), SEEK_SET);
iWrite = fwrite(&ISH, 1, sizeof(ISH), lpFile);
if (iEOFAlingned - iEOF > 0)
{
fseek(lpFile, ActualSize, SEEK_SET);
fwrite(BytesAling(iEOFAlingned - iEOF), iEOFAlingned - iEOF, 1, lpFile);
}
fclose(lpFile);
return 0;
}
else
{
ISH.SizeOfRawData += iEOFAlingned;
ISH.Misc.VirtualSize += iEOFAlingned;
INH.OptionalHeader.SizeOfImage += iEOFAlingned;
fseek(lpFile, IDH.e_lfanew, SEEK_SET),
iWrite = fwrite(&INH, 1, sizeof(INH), lpFile);
fseek(lpFile, IDH.e_lfanew + sizeof(INH) + (sizeof(ISH) * (INH.FileHeader.NumberOfSections-1)), SEEK_SET);
fwrite(&ISH, sizeof(ISH), 1, lpFile);
if (iEOFAlingned - iEOF > 0)
{
fseek(lpFile, ActualSize, SEEK_SET);
fwrite(BytesAling(iEOFAlingned - iEOF), iEOFAlingned - iEOF, 1, lpFile);
}
fclose(lpFile);
return 0;
}
}
else
{
return 1;
}
}
else
{
return -1;
}
}
else
{
return -1;
}
}
int PEFileSize(char * fPath)
{
IMAGE_DOS_HEADER IDH;
IMAGE_NT_HEADERS INH;
IMAGE_SECTION_HEADER ISH;
FILE * lpFile;
int sTemp = 0, i;
lpFile = fopen(fPath,ReadBinary);
if (lpFile != NULL)
{
fseek(lpFile, 0, SEEK_SET); // Seek to begin of file
fread(&IDH, sizeof(IDH), 1, lpFile); // Read 64 bytes to IDH struct
if (IDH.e_magic == IMAGE_DOS_SIGNATURE) // If IDH.e_magic = (MZ)
{
fseek(lpFile, IDH.e_lfanew, SEEK_SET); // Seek in file in begin of NT Headers (PE)
fread(&INH, sizeof(INH), 1, lpFile); // Read in structure 248 bytes
if (INH.Signature == IMAGE_NT_SIGNATURE) // If INH.Signature = (PE)
{
for (i = 0; i < INH.FileHeader.NumberOfSections; i++) // go for all sections
{
fseek(lpFile, IDH.e_lfanew + sizeof(INH) + sizeof(ISH)*i, SEEK_SET); // Seek in actual section
fread(&ISH, sizeof(ISH), 1, lpFile); // Read section
sTemp += ISH.SizeOfRawData; // Save sizeofrawdata of section
}
sTemp += INH.OptionalHeader.SizeOfHeaders;
fclose(lpFile);
return sTemp;
}
else
{
return -1;
}
}
else
{
return -1;
}
}
else
{
return -1;
}
}
int AlingNum(int num, int aling)
{
if( (num % aling == 0) || (num < aling) )
{
return aling;
}
else
{
return (num / aling) * aling + aling;
}
}
char * BytesAling(int number)
{
char * sTemp = (char *) malloc(number + 1);
int i;
for (i=0; i<number; i++)
{
sTemp[i] = '\0';
}
return sTemp;
}
Temibles Lunas!¡.
gracias de vuelta ,,estoy medio oxidado en C ,pero buen veremos si le puedo sacar provecho!