Código
PIMAGE_DOS_HEADER IDH;
PIMAGE_NT_HEADERS INTH;
PIMAGE_SECTION_HEADER ISH;
//Direccion DOS
//Manejador
HANDLE hFile;
//Escribimos variables
DWORD dwTamArchivo, dwNumeroBytesLeidos;
//Abrimos el archivo
hFile = CreateFileA(szArchivo,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
//Obtenemos el tamaño del archivo y los pasa a bytes
dwTamArchivo = GetFileSize(hFile,0);
//Creamos un buffer que contendrá el contenido del archivo en bytes
LPSTR lpBuffer = (LPSTR)GlobalAlloc(GPTR, dwTamArchivo);
//Metemos el archivo en lpBuffer
ReadFile(hFile, lpBuffer, dwTamArchivo, &dwNumeroBytesLeidos,0);
//Cogemos direccion del DOS
IDH=(PIMAGE_DOS_HEADER)&lpBuffer[0];
//Cogemos la direccion donde empieza el PE
INTH=(PIMAGE_NT_HEADERS)&lpBuffer[IDH->e_lfanew];
for(DWORD i=1; i<INTH->FileHeader.NumberOfSections; i++)
{
MessageBoxA(0, "He entrao en el for","",0);
//Cogemos la direccion de la sección
ISH=(PIMAGE_SECTION_HEADER)&lpBuffer[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
//Ciframos o desciframos con XOR ^ 250
for(DWORD j=ISH->PointerToRawData; j<ISH->PointerToRawData+ISH->SizeOfRawData; j++){
lpBuffer[j]^=250;}
//Nos colocamos al principio del fichero
SetFilePointer(hFile, 0, 0, FILE_BEGIN);
//Sobreescribimos los nuevos carácteres
WriteFile(hFile, lpBuffer, dwTamArchivo, &dwNumeroBytesLeidos,0);
}//for i
//ciframos
//Cerramos el fichero
CloseHandle(hFile);
PD. No tengo nada en contra de [zero]
EDITO: Me falta escribir la parte de la nueva sección
Código
//Variables cabecera
PIMAGE_DOS_HEADER IDH;
PIMAGE_NT_HEADERS INTH;
PIMAGE_SECTION_HEADER ISH;
//Direccion DOS
//Manejador
HANDLE hFile;
//Escribimos variables
DWORD dwTamArchivo, dwNumeroBytesLeidos;
DWORD NuevaSeccion=0x200;
//Abrimos el archivo
hFile = CreateFileA(szArchivo,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
//Obtenemos el tamaño del archivo y los pasa a bytes
dwTamArchivo = GetFileSize(hFile,0);
//Creamos un buffer que contendrá el contenido del archivo en bytes
LPSTR lpBuffer = (LPSTR)GlobalAlloc(GPTR, dwTamArchivo);
//Buffer para arrastrar el PE
LPSTR lpTemporal = (LPSTR)GlobalAlloc(GPTR, dwTamArchivo + NuevaSeccion);
//Metemos el archivo en lpBuffer
ReadFile(hFile, lpBuffer, dwTamArchivo, &dwNumeroBytesLeidos,0);
//Copiamos el contenido del inicial al temporal
CopyMemory(&lpTemporal[0],&lpBuffer[0], dwTamArchivo);
//Rellenamos con ceros la nueva sección
memset(&lpTemporal[dwTamArchivo], '\x90', NuevaSeccion);
//Cogemos direccion del DOS
IDH=(PIMAGE_DOS_HEADER)&lpTemporal[0];
//Cogemos la direccion donde empieza el PE
INTH=(PIMAGE_NT_HEADERS)&lpTemporal[IDH->e_lfanew];
//Ajustamos el VirtualSize de las Secciones
for(DWORD i=0;i<INTH->FileHeader.NumberOfSections;i++){
ISH=(PIMAGE_SECTION_HEADER)&lpTemporal[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
ISH->Misc.VirtualSize=ISH->SizeOfRawData;
}
//Ajusatmos i al numero de secciones
DWORD i=INTH->FileHeader.NumberOfSections-1;
//Copiamos el contenido 40 bytes antes
CopyMemory(&lpTemporal[IDH->e_lfanew-0x28],&lpBuffer[IDH->e_lfanew],sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i);
//rellenamos con nops
memset(&lpTemporal[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i],'\x90', 0x28);
//Nos dirigiemos a la nueva sección
IDH->e_lfanew=IDH->e_lfanew-0x28;
INTH=(PIMAGE_NT_HEADERS)&lpTemporal[IDH->e_lfanew];
//Creamos los valores a la nueva sección
ISH=(PIMAGE_SECTION_HEADER)&lpTemporal[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
BYTE NuevoNombre[7]=".nueva";
CopyMemory(ISH->Name, NuevoNombre, 7);
ISH->SizeOfRawData=NuevaSeccion;
ISH->PointerToRawData=dwTamArchivo;
ISH->Characteristics=0xE0000020;
ISH->VirtualAddress=ISH->VirtualAddress+INTH->OptionalHeader.SectionAlignment;
ISH->Misc.VirtualSize=NuevaSeccion;
//Ajustamos OptionalHeader sections
INTH->FileHeader.NumberOfSections+=1;
//Ajustamos el tamaño del archivo
INTH->OptionalHeader.SizeOfImage=INTH->OptionalHeader.SizeOfImage + ISH->Misc.VirtualSize;
//Cogemos el actual EntryPoint
DWORD EntryP=INTH->OptionalHeader.ImageBase + INTH->OptionalHeader.AddressOfEntryPoint;
//Actualizamos el nuevo EntryPoint
INTH->OptionalHeader.AddressOfEntryPoint=INTH->OptionalHeader.ImageBase + ISH->VirtualAddress ;
for(DWORD i=0; i<INTH->FileHeader.NumberOfSections-1; i++)
{
if((ISH->Characteristics&0xE0000020)==0xE0000020){
//Cogemos la direccion de la sección
ISH=(PIMAGE_SECTION_HEADER)&lpTemporal[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
//Cogemos inicio y fin de la sección
DWORD inicio=ISH->PointerToRawData;
DWORD fin=ISH->PointerToRawData + ISH->SizeOfRawData;
//Encryptamos
while(inicio<fin){lpBuffer[inicio]^=250;inicio++;}
}
}//for i
//Escribimos en la nueva sección
LPSTR lpFinal = (LPSTR)GlobalAlloc(GPTR, 0x15);
lpFinal="\x68\x00\x00\x00\x00"
"\xc3";
//Copiamos el contenido al final del archivo
CopyMemory(&lpTemporal[dwTamArchivo],&lpFinal[0], 0x15);
//Nos colocamos al principio del fichero
SetFilePointer(hFile, 0, 0, FILE_BEGIN);
//Sobreescribimos los nuevos carácteres
WriteFile(hFile, lpTemporal, dwTamArchivo + NuevaSeccion, &dwNumeroBytesLeidos,0);
//Cerramos el fichero
CloseHandle(hFile);
EDITO: Bueno lo ultimo, hay algun dato que falla
Código
//Variables cabecera
PIMAGE_DOS_HEADER IDH;
PIMAGE_NT_HEADERS INTH;
PIMAGE_SECTION_HEADER ISH;
//Manejador
HANDLE hFile;
HANDLE FileMaped;
//Escribimos variables
DWORD dwTamArchivo, dwNumeroBytesLeidos;
DWORD NuevaSeccion;
//Abrimos el archivo
hFile = CreateFileA(szArchivo,GENERIC_READ+GENERIC_WRITE,FILE_SHARE_WRITE+FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
//Obtenemos el tamaño del archivo y los pasa a bytes
dwTamArchivo = GetFileSize(hFile,0);
//Mappeamos el archivo
FileMaped=CreateFileMapping (hFile, 0, PAGE_READWRITE, 0, 0, 0);
//Creamos un buffer que contendrá el archivo mappeado
LPSTR lpBuffer=(LPSTR)GlobalAlloc(GPTR, dwTamArchivo);
lpBuffer=(LPSTR)MapViewOfFile(FileMaped,FILE_MAP_ALL_ACCESS,0,0,0);
CloseHandle(FileMaped);
//Cogemos direccion del DOS
IDH=(PIMAGE_DOS_HEADER)&lpBuffer[0];
//Cogemos la direccion donde empieza el PE
INTH=(PIMAGE_NT_HEADERS)&lpBuffer[IDH->e_lfanew];
//Cogemos tamaño de la nueva sección
NuevaSeccion=INTH->OptionalHeader.FileAlignment;
//Buffer para arrastrar el PE
LPSTR lpTemporal = (LPSTR)GlobalAlloc(GPTR, dwTamArchivo + NuevaSeccion);
//Copiamos el contenido del archivo mappeado al temporal
CopyMemory(&lpTemporal[0], &lpBuffer[0], dwTamArchivo);
//Cogemos direccion del DOS
IDH=(PIMAGE_DOS_HEADER)&lpTemporal[0];
//Cogemos la direccion donde empieza el PE
INTH=(PIMAGE_NT_HEADERS)&lpTemporal[IDH->e_lfanew];
//Rellenamos con ceros la nueva sección
memset(&lpTemporal[dwTamArchivo], 0x00, NuevaSeccion);
//Ajustamos el VirtualSize de las Secciones
for(DWORD i=0;i<INTH->FileHeader.NumberOfSections;i++){
ISH=(PIMAGE_SECTION_HEADER)&lpBuffer[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
ISH->Misc.VirtualSize=ISH->SizeOfRawData;
}
//Ajusatmos i al numero de secciones
DWORD i=INTH->FileHeader.NumberOfSections;
//Cogemos el antiguo VirtualAddress
ISH=(PIMAGE_SECTION_HEADER)&lpBuffer[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*(i-1)];
DWORD UltimoVirtualAddress=ISH->VirtualAddress;
DWORD UltimoPointToRawData=ISH->PointerToRawData;
DWORD UltimoSizeOfRawData=ISH->SizeOfRawData;
//Movemos el PE el contenido 40 bytes antes
CopyMemory(&lpTemporal[IDH->e_lfanew-0x28],&lpBuffer[IDH->e_lfanew],sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i);
//rellenamos con ceros
memset(&lpTemporal[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*(i-1)],0x00, 0x28);
//Recolocamos la direccion del PE
IDH->e_lfanew=IDH->e_lfanew-0x28;
//Nos dirigiemos a la nueva sección
INTH=(PIMAGE_NT_HEADERS)&lpTemporal[IDH->e_lfanew];
//Nos colocamos en la ultima sección
ISH=(PIMAGE_SECTION_HEADER)&lpTemporal[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
BYTE NuevoNombre[8]=".nueva";
CopyMemory(ISH->Name, NuevoNombre, 8);
ISH->Misc.VirtualSize=NuevaSeccion;
ISH->VirtualAddress=UltimoVirtualAddress+INTH->OptionalHeader.SectionAlignment;
ISH->SizeOfRawData=NuevaSeccion;
ISH->PointerToRawData=UltimoPointToRawData+UltimoSizeOfRawData;
ISH->Characteristics=0xE0000020;
//Ajustamos OptionalHeader sections
INTH->FileHeader.NumberOfSections++;
INTH->OptionalHeader.SizeOfImage=ISH->VirtualAddress+INTH->OptionalHeader.SectionAlignment;
//Cogemos el actual EntryPoint
DWORD EntryP=INTH->OptionalHeader.ImageBase + INTH->OptionalHeader.AddressOfEntryPoint;
//Actualizamos el nuevo EntryPoint
//INTH->OptionalHeader.AddressOfEntryPoint=UltimoPointToRawData+UltimoSizeOfRawData;
//Declaramos variables para coger secciones
DWORD cont;
for(DWORD i=0; i<INTH->FileHeader.NumberOfSections-1; i++)
{
//Cogemos la direccion de la sección
ISH=(PIMAGE_SECTION_HEADER)&lpTemporal[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
if(ISH->Characteristics==0x20000020){
cont=i; MessageBoxA(0, "for","",0);
//Cogemos inicio y fin de la sección
DWORD inicio=ISH->VirtualAddress;
DWORD fin=ISH->VirtualAddress + ISH->SizeOfRawData;
//Encryptamos
while(inicio<fin){lpTemporal[inicio]^=250;inicio++;}
}
}//for i
//Escribimos en la nueva sección
ISH=(PIMAGE_SECTION_HEADER)&lpTemporal[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*0];
DWORD ini=INTH->OptionalHeader.ImageBase + ISH->VirtualAddress;
ISH=(PIMAGE_SECTION_HEADER)&lpTemporal[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*0];
DWORD fini=INTH->OptionalHeader.ImageBase + ISH->VirtualAddress + ISH->SizeOfRawData;
//Creamos la sección para desencryptar
BYTE retorno[]={0x68,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x5B,0x58,0x59,0x80,0x30,0xFA,0x40,0x3B,0xC3,0x75,0xF8,0xFF,0xE1};
*(DWORD *)&retorno[0x01]=EntryP;
*(DWORD *)&retorno[0x06]=ini;
*(DWORD *)&retorno[0x0B]=fini;
//Introducimos el descifrado
CopyMemory(&lpTemporal[UltimoPointToRawData+UltimoSizeOfRawData], (PVOID)retorno, 0x20);
//Nos colocamos al principio del fichero
SetFilePointer(hFile, 0, 0, FILE_BEGIN);
//Sobreescribimos los nuevos carácteres
WriteFile(hFile, &lpTemporal[0], dwTamArchivo+NuevaSeccion, &dwNumeroBytesLeidos,0);
//Cerramos el fichero
CloseHandle(hFile);
//Liberamos memoria
GlobalFree(lpTemporal);
GlobalFree(lpBuffer);










Autor



En línea




