Código: Seleccionar todo

#include <windows.h>

//[email protected]\\

//este funcion es para parchear processos en la memoria

/*BOOL loader(
char * process,//el nombre del ejecutable que queremos parchear
DWORD v_address,//el address virtual que queremos
void * array,//el array que tiene los bytes para poner en el processo
int size_arr//el tamano del array o el tamano de bytes que queremos escribir en el processo
)
*/
BOOL loader(char * process,DWORD v_address,void * array,int size_arr)
{
	DWORD old;
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
	try{
		ZeroMemory( &si, sizeof(si) );
		si.cb = sizeof(si);
		ZeroMemory( &pi, sizeof(pi) );
		if( !CreateProcess( process,"",NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi ) ) 
			{
			return false;
			}
		if( VirtualProtectEx( pi.hProcess,(LPVOID)v_address,size_arr,0x40,&old ) ==0 )
			return false;
		if( WriteProcessMemory( pi.hProcess,(LPVOID)v_address,array,size_arr,&old ) ==0 )
			return false;
		ResumeThread( pi.hThread );	
		CloseHandle( pi.hProcess );
		CloseHandle( pi.hThread );
	}
	catch( int i ){}
	return true;
}
void main()
{
char carray[]={0x0D,0x0A};
loader("iexplore.exe",0x401000,carray,2);
}
todavia le voy a anadir mas cosas , cuando hago lo posteo
ah otra cosa esto soluciona una parte lo del Crackme #1 por si alguien esta tratando de resolver xD
salu10

Mostrar/Ocultar

Si pudieras explicarme pára qué sirve hacer esto ¿? He visto que el post es para resolver el crackme que pusiste hace un tiempo pero no puedo contenerme en la incognita de saber para qué es este procedimiento, osea entiendo la función primero carga las estructuras para trabajar con un proceso abres el proceso, le cambias los permisos para poder leer y escribir en el virtual address, despues escribes los bytes y luego se retoma el proceso para que continue, pero y todo esto para que se hace, con qué finalidad escribo esos bytes en el ejemplo:

"
char carray[]={0x0D,0x0A};
loader("iexplore.exe",0x401000,carray,2);
"

Si hago eso qué para qué me sirve :P¿? haha no se si formulé bien la pregunta
//mHmm..
y todo esto para que se hace, con qué finalidad escribo esos bytes en el ejemplo:
simplemente este funcion modifiqua los bytes del ejecutable antes de ejecutarlo , es como lo habias modifiquado desde el disko duro

algunos programas tienen CRC check , osea si cambias el ejecutable (modifiquas con Olly y lo grabas al disko duro) el programa se fija que el programa se ha cambiado y se termina.

para evitar eso tenemos que modifiquar lo que queremos en el ejecutable en la memoria Virtual del mismo ejecutable
asi que primero hacemos un CreateProcess pero con parametro CREATE_SUSPENDED despues VirtualProtectEx para poder escribir en la memoria del ejecutable y despues WriteProcessMemory
para escribir los modifiquaciones que quieres al ejecutable , al fin haces un ResumeThread para ejecutarlo

char carray[]={0x0D,0x0A};
loader("iexplore.exe",0x401000,carray,2); // va a crear el proceso iexplore.exe escribir 0x0D en en 401000 y 0x0A en 401001, esto es solo un ejemplo no signifiqua nada

saludos

Mostrar/Ocultar

oh es para modificarlo en runtime!, no sabía que existía ese tipo de protección contra el debuggin de CRC check, entonces con eso puedes modificar cualquier parte del programa en runtime no?, muy interesante gracias m4rty siempre nos traes cosas buenas
//mHmm..
m4rtyr escribió:si lo entendistes , es modificacion del ejecutable en runtime
saludos
Me queda una dudita m4rty no se si me puedas ayudar con ella, como utilizando esto de cambiar los bytes en runtime puedo entonces cambiar por ejemplo un je por un jmp, es decir, si tengo esta linea en el olly

00407187 0F84 D0000000 JE CrackMe_.0040725D

Y quiero pasar ese JE a JMP pero no puedo porque como dices si guardo los cambios se muere el proceso, entonces utilizando alguna funcion como esta para cambiar bytes en la memoria virtual qué parámetros le pasaría a la función para cambiar el JE xxxx por JMP xxxx :S

Sería algo como:
char bytes[]={//como sería el byte de jmp?¿¿?}
loader("proeso.exe",0x407187,bytes,1);

Jeje no se si me entendiste, no sabría interpretar un jmp en hex jeje aver si tu sabes o estoy usando mal la funcion y no es para cambiar directamente las instrucciones en ensamblador x) gracias de nuevo
//mHmm..
char bytes[]={0xE9,0xD1,0x00,0x00,0x00,0x90} // 00407187 /E9 D1000000 JMP 0040725D
// 0040718C |90 NOP
loader("proeso.exe",0x407187,bytes,6);

saludos

Mostrar/Ocultar

m4rtyr escribió:char bytes[]={0xE9,0xD1,0x00,0x00,0x00,0x90} // 00407187 /E9 D1000000 JMP 0040725D
// 0040718C |90 NOP
loader("proeso.exe",0x407187,bytes,6);

saludos
Lo conviertes entonces a opcode, si tienes por ahí un hilo que diga el algoritmo para convertirlo o que me dijeras como lo haces estaría agradecido jeje ya te debo muchas m4rty voy a terminar vendiendote mi alma
//mHmm..
linkgl escribió: Lo conviertes entonces a opcode, si tienes por ahí un hilo que diga el algoritmo para convertirlo o que me dijeras como lo haces estaría agradecido jeje ya te debo muchas m4rty voy a terminar vendiendote mi alma
me gusta mucho que hay alguien que tiene interez comun , no es nada de molestia responderte Linkglito
simplemente lo que haces es modifiquarlo con olly y despues haces un seleccion a la parte modifiquada con el shift y despues haces un Right click >> Binary Copy

saludos

Mostrar/Ocultar

Pues he hecho la prueba y no me queda nada mas que decir que va perfecto, me salieron unos errores al compilar pero seguro es porque usas VC++ y yo dev con mingw jeje pero todo arreglado y funciona de 10, x) incluso se puede hacer una aplicación más visual que edite la memoria virtual del proceso en runtime jeje para no tener que estar compilando el src x)
//mHmm..
Responder

Volver a “Fuentes”