Busca la funcion que necesitas!

sábado, 4 de junio de 2011

C - Obtener y escribir el valor de los registros ASM de un programa

Hice estas funciones usando la estructura CONTEXT que nos fácilita el manejo de los registros, con estas funciones podrás obtener en runtime el valor que toma cualquier registro que context permita (Eax,edx,ecx...) yo puse por defecto eax, pero si quieres obtener otro registro cambia eax por el registro que gustes, así como lo hice obtiene el entrypoint ya que este al cargar el programa se encuentra en eax, entonces también puedes cambiar el entrypoint de un programa con la funcioncita de escribirRegistro, si quieres obtener en determinaado momento exacto el valor de algún registro entonces quizá necesites usar OPENPROCESS y pasarle el pid del proceso, en vez de CreateProcess, pero la sintaxis de las funciones es la misma



Código:
#include <stdio.h>
#include <windows.h>

/* 
USOS:
Para obtener el valor de otro registro 
cambiar donde dice con.Eax por
con.Registro_que_quieras
Indetectables.net/foro
funcion-linkgl.blogspot.com
*/

DWORD ObtenerRegistro(LPSTR szProcessName)
{
       /* Linkgl - Funcion-linkgl.blogspot.com */
    //Estructura startup requerida para createprocess
    //estructura process information requerida para el pid
    //estructura context contiene los valores de los registros
    STARTUPINFO si;
   PROCESS_INFORMATION pi;
   CONTEXT con;
   // limpiamos la estructura si
   memset(&si, 0, sizeof(si));
   //indicamos el tamaño de la estructura
   //en el flag como indica la msdn
   si.cb = sizeof(STARTUPINFO);
   con.ContextFlags = CONTEXT_FULL;
   CreateProcess(NULL, szProcessName, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
   //obtenemos el contexto y con ello se obtienen los registros
    GetThreadContext(pi.hThread, &con);
    //continuamos el hilo
    ResumeThread(pi.hThread);
    //mandamos el registro
    return con.Eax;
}

BOOL EscribirRegistro(LPSTR szProcessName,DWORD valor)
{
    /* Linkgl - Funcion-linkgl.blogspot.com */
    //Estructura startup requerida para createprocess
    //estructura process information requerida para el pid
    //estructura context contiene los valores de los registros
    STARTUPINFO si;
   PROCESS_INFORMATION pi;
   CONTEXT con;
   // limpiamos la estructura si
   memset(&si, 0, sizeof(si));
   //indicamos el tamaño de la estructura
   //en el flag como indica la msdn
   si.cb = sizeof(STARTUPINFO);
   con.ContextFlags = CONTEXT_FULL;
   //creamos el proceso
   CreateProcess(NULL, szProcessName, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
   //obtenemos el contexto y con ello se obtienen los registros
    GetThreadContext(pi.hThread, &con);
    //ponemos el nuevo valor
   con.Eax = valor;
   //lo guardamos en el hilo
   SetThreadContext(pi.hThread,&con);
   //continuamos el hilo
    ResumeThread(pi.hThread);
    return TRUE;
}

//->EJEMPLO DE USO
int main()
{
DWORD eax;
//Cambiamos el valor eax (osea vamos a cambiar el entrypoint)
EscribirRegistro("c:\\final.exe",0x413b72f);
//Obtenemos el registro aver si se cambio
eax=ObtenerRegistro("c:\\final.exe");
//Imprimimos el nuevo registro o entrypoint
printf("%x",eax);
getchar();
return 0;
}

No hay comentarios:

Publicar un comentario