elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 00:44  


Tema destacado: Sigue las noticias más importantes de elhacker.net en ttwitter!

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  castiar un thiscall
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: castiar un thiscall  (Leído 1,071 veces)
dewolo

Desconectado Desconectado

Mensajes: 83


Ver Perfil
castiar un thiscall
« en: 30 Septiembre 2011, 19:53 »


estoi probando un metodo que encontre en el foro sobre inyectar una struct (de un usario eon)
desde un exe sin dll. la idea mia es ir ahora a inisiar un thread en el momento q esta inyectada la estruct
dada esta struct

struct EstructIny
{
        TipoCT pCT;

        void Func(void)
        {
        }
}

//La función que inyectaremos
DWORD Inyectada ( EstructIny *data)
{
      data->pCT(NULL, 0, (LPTHREAD_START_ROUTINE)data->Func, NULL, 0, NULL);
      return 0;
}

el error es de  compilacion, porque no permite el tercer parametro de createthread no admite o no puede convertir el dato que le paso. como lo puede hacer alguien que sepa mas de c o c++ que yo, porque necesito pasarle ese parametro para que se complete la inyeccion

e tratado de hacer algo asi
DWORD dir = (DWORD)data->Func;

pero dice
Citar
'type cast' : cannot convert from 'void (__thiscall EstructIny::*)(void)' to 'unsigned long'

como puedo hacer entonces ?





En línea
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.392


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: castiar un thiscall
« Respuesta #1 en: 30 Septiembre 2011, 20:13 »

No se puede directamente pero podes pasar el objeto:

http://foro.elhacker.net/programacion_cc/iquestcomo_accedo_a_this_desde_una_funcion_callback-t285522.0.html


En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
dewolo

Desconectado Desconectado

Mensajes: 83


Ver Perfil
Re: castiar un thiscall
« Respuesta #2 en: 30 Septiembre 2011, 20:47 »

Citar
#include <windows.h>

class ClaseEjemplo
{
   public:
      static DWORD WINAPI FromClassHello(LPVOID lpParameter);
      char msg[1024];
};

DWORD WINAPI ClaseEjemplo::FromClassHello(LPVOID lpParameter)
{
   ClaseEjemplo *ptrThis = (ClaseEjemplo*)lpParameter;
   MessageBox(0,"Hello world desde una clase en un thread xp",ptrThis->msg,0);
   return 0;
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
   ClaseEjemplo ej1;
   strcpy(ej1.msg, "ejemplo");
   HANDLE h1 = CreateThread(0,0, (LPTHREAD_START_ROUTINE)&ClaseEjemplo::FromClassHello, (LPVOID)&ej1,0,0);
   if(h1 == INVALID_HANDLE_VALUE)
      MessageBox(0,"Meeec Maaal","windows dice:",0);
   Sleep(5000);
   CloseHandle(h1);
}


no hay una forma sin tener que ahcerla static? es que necesito llamar algunas cosas de la struct dentro de la funcion "Func", por ejemplo
en tu ejemplo llamas a "Messagebox" pero eso es un simbolo valido solo para tu programa inyector y no para el bloqe de memoria (struct) que se ineycta en el otro proceso no es asi?

Código:
struct EstructIny
{
        TipoCT pCT;
        TipoS pSleep;

        "static" void Func(void)//no puede ser static porque debe llamar pSleep (entre otrsa cosas)
        {
             pSleep(2000);
        }
}

//La función que inyectaremos
DWORD Inyectada ( EstructIny *data)
{
      data->pCT(NULL, 0, (LPTHREAD_START_ROUTINE)data->Func, NULL, 0, NULL);
      return 0;
}

lo que ocurre es que en "Func" debo instalar un gancho (hook) y por lo tanto debo usar elementos de la struct misma, porqe estare ejecutando esta struct en otro proceso.....

« Última modificación: 30 Septiembre 2011, 20:50 por dewolo » En línea
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.392


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: castiar un thiscall
« Respuesta #3 en: 30 Septiembre 2011, 20:55 »

No, tiene que ser estatico el metodo (y conforme a CALLBACK), que llame a MessageBox no es lo importante sino que podes pasar como parametro el objeto y asi accede a ptrThis->msg.

Código
static DWORD WINAPI Func(LPVOID lpParameter)
{
 EstructIny *ptrThis = (EstructIny*)lpParameter;
 ptrThis->pSleep(2000);
}

Código
data->pCT(NULL, 0, (LPTHREAD_START_ROUTINE)data->Func, data, 0, NULL);
« Última modificación: 30 Septiembre 2011, 20:57 por Eternal Idol » En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
dewolo

Desconectado Desconectado

Mensajes: 83


Ver Perfil
Re: castiar un thiscall
« Respuesta #4 en: 30 Septiembre 2011, 21:01 »

a muy bueno  ::) esto no lo sabia lo del cuarto parametro lo estaba mirando en tus posts
http://www.forosdelweb.com/f96/metodo-clase-como-parametro-c-474946/
http://solocodigo.com/8895/esperar-a-un-evento-sin-bloquear-el-programa/




En línea
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.392


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: castiar un thiscall
« Respuesta #5 en: 30 Septiembre 2011, 21:16 »

Si, esta en todos en realidad, en el que pusiste primero es (LPVOID)&ej1  :)
En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
dewolo

Desconectado Desconectado

Mensajes: 83


Ver Perfil
Re: castiar un thiscall
« Respuesta #6 en: 30 Septiembre 2011, 22:11 »

Código:
struct EstructIny
{
        TipoCT pCT;
        TipoS pSleep;

        void WINAPI myHook(int i)//ESTE ES UN HOOK de cualquier funcion, una api, ETC
        {
               pmyHook(i);
        }

        void B()//B solo quiere la direccion de myHook
        {
             //El problema es que estos casts no sirven, y aparte no permite usar el operador
             // & es ilegal en este caso

             DWORD* dir;
             *dir = (DWORD)&myHook;
        }

        static DWORD WINAPI Func(LPVOID lpParameter)
        {
               EstructIny *ptrThis = (EstructIny*)lpParameter;
               ptrThis->pSleep(2000);

               ptrThis->B();//LLAMO a B() , bien porque este es el objetivo  ::)
              
               return 0;
        }
};

//La función que inyectaremos
DWORD Inyectada ( EstructIny *data)
{
      data->pCT(NULL, 0, (LPTHREAD_START_ROUTINE)data->Func, data, 0, NULL);
      return 0;
}

que soluciones tendria para el myHook porque debo respetar su declaracion porque va usarce de reemplazo para la verdadera funcion. acaso debo hacer static a myHook o hay otra forma ?


« Última modificación: 30 Septiembre 2011, 22:13 por dewolo » En línea
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.392


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: castiar un thiscall
« Respuesta #7 en: 30 Septiembre 2011, 22:35 »

Tene en cuenta que las funciones NO estan junto a los miembros de la estructura eh, las vas a tener que copiar por separado. Ahi en tiempo de ejecucion cuando reserves la memoria para myHook en el otro proceso vas a tener su direccion ... tampoco podes llamar a B asi directamente ... es mas, ni siquiera podes llamar a Func asi al ser otro proceso. A Func podrias copiarla en remoto y ejecutarla (lo acabo de hacer de prueba, tu codigo fallaria al llamar a Func que es una direccion de tu proceso) pero llamar a B ya no funcionaria salvo que tambien la hicieras estatica ... en definitiva si deberias hacer a myHook estatica, en realidad solo de esa manera podrias respetar la verdadera funcion que no es un metodo seguramente.
« Última modificación: 30 Septiembre 2011, 23:31 por Eternal Idol » En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
dewolo

Desconectado Desconectado

Mensajes: 83


Ver Perfil
Re: castiar un thiscall
« Respuesta #8 en: 1 Octubre 2011, 01:15 »

Tene en cuenta que las funciones NO estan junto a los miembros de la estructura eh, las vas a tener que copiar por separado. Ahi en tiempo de ejecucion cuando reserves la memoria para myHook en el otro proceso vas a tener su direccion ... tampoco podes llamar a B asi directamente ... es mas, ni siquiera podes llamar a Func asi al ser otro proceso. A Func podrias copiarla en remoto y ejecutarla (lo acabo de hacer de prueba, tu codigo fallaria al llamar a Func que es una direccion de tu proceso) pero llamar a B ya no funcionaria salvo que tambien la hicieras estatica ... en definitiva si deberias hacer a myHook estatica, en realidad solo de esa manera podrias respetar la verdadera funcion que no es un metodo seguramente.


claro, etntiendo que en una struct se guardan direcciones osea ya sea de punteros, punteros a funciones o direcciones de datos. en el caso de poner funciones dentro de structs estas quedarian traducidas a direcciones o mejor dicho traducidas a punteros a funciones, y las direcciones de esas funciones estarian en el codigo del inyector y no en el remoto. entonces debo copiar cada funcion con writeprocesmemory en el remoto pero,  supongo que debo seguir manteniendo el control desde la struct primaria en la cual ahora debere poner algunos punteros a funciones  por ejemplo, un puntero a funcion para A) otro para B) y para el myHook, es esto correcto?,
el problema viene a la integridad de myHook porque suponemos que el gancho va a ser sobre una api no se digamos, loadlibrary por decir cualquiera, entonces como hago para hacerla estatica pero ademas tener acceso a otros miembros de la struct, porque dentro de ese myHook se necesitan hacer algunas cosas, algunas llamadas y todo eso deben ser punteros a funciones guardados en mi struct.

lo que no entiendo tambien de tu comentario es porque el createthread fallaria al crear el hilo y llamar a "Func" sabiendo que createthread se usa mediante a un puntero a funcion y la direccion que tiene es valida (segun el metodo del user eon)... o sino me confundi y lo que dirias es que falla al llamar a "Func" porque en la struct en realidad se guardaria una direccion de "Func" pero el cuerpo de la funcion tiene una start address que en realidad esta en el proceso del inyector y no en el remoto... eso tiene sentido, y en tal caso se deberia copiar al proceso remoto cada funcion de la struct ( A() B() y Func() y myHook() ) y solo guardar los punteros a funciones dentro de la struct, es eso lo que decis ?


 
En línea
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.392


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: castiar un thiscall
« Respuesta #9 en: 1 Octubre 2011, 01:46 »

claro, etntiendo que en una struct se guardan direcciones osea ya sea de punteros, punteros a funciones o direcciones de datos. en el caso de poner funciones dentro de structs estas quedarian traducidas a direcciones o mejor dicho traducidas a punteros a funciones, y las direcciones de esas funciones estarian en el codigo del inyector y no en el remoto. entonces debo copiar cada funcion con writeprocesmemory en el remoto pero,  supongo que debo seguir manteniendo el control desde la struct primaria en la cual ahora debere poner algunos punteros a funciones  por ejemplo, un puntero a funcion para A) otro para B) y para el myHook, es esto correcto?,

Si pero tienen que ser estaticos tambien, si lo que queres es mantener datos compartidos reserva memoria tal y como lo haces para la estructura y aprovecha a usar TLS en las funciones en lugar del parametro de CreateThread ...

el problema viene a la integridad de myHook porque suponemos que el gancho va a ser sobre una api no se digamos, loadlibrary por decir cualquiera, entonces como hago para hacerla estatica pero ademas tener acceso a otros miembros de la struct, porque dentro de ese myHook se necesitan hacer algunas cosas, algunas llamadas y todo eso deben ser punteros a funciones guardados en mi struct.

¿Existe alguna razon logica como para no usar una DLL? Es complicarse la vida sin sentido realmente ...

lo que no entiendo tambien de tu comentario es porque el createthread fallaria al crear el hilo y llamar a "Func" sabiendo que createthread se usa mediante a un puntero a funcion y la direccion que tiene es valida (segun el metodo del user eon)... o sino me confundi y lo que dirias es que falla al llamar a "Func" porque en la struct en realidad se guardaria una direccion de "Func" pero el cuerpo de la funcion tiene una start address que en realidad esta en el proceso del inyector y no en el remoto... eso tiene sentido, y en tal caso se deberia copiar al proceso remoto cada funcion de la struct ( A() B() y Func() y myHook() ) y solo guardar los punteros a funciones dentro de la struct, es eso lo que decis ?

Si, exactamente, en tu codigo le pasas la direccion de Func pero solo es valida en tu proceso inyector y no en el remoto, por eso fallaria, si reservas memoria, escribis el codigo y despues pasas esa memoria si funciona. Lo mismo tendrias que hacer para llamar a B desde Func (un puntero a funcion en la estructura y asignarle el valor de la memoria remota). No se cual es el ejemplo de EON ...

PD. ¿Para ejecutar Inyectada creas un hilo? Si es asi no tiene sentido despues crear otro.
« Última modificación: 1 Octubre 2011, 02:02 por Eternal Idol » En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
dewolo

Desconectado Desconectado

Mensajes: 83


Ver Perfil
Re: castiar un thiscall
« Respuesta #10 en: 1 Octubre 2011, 02:25 »

http://foro.elhacker.net/net/inyeccion_dll_sin_dll_by_e0n_problema_edicion_de_memoria_convertir_a_c-t267355.0.html

http://www.infomalware.net/t62-inyeccion-de-codigo-sin-dll

si con dll ya esta hecho pero es mucho mas facil, y como encontre el codigo este se me ocurrio hacerlo de esta forma... como es por aprendizaje nada mas ..
supongamos que estan las 3 funciones en la memoria remota (A,B y myHook), Inyectada ya fue copiada, pero el problema es myHook porque las 3 van a transformarse en 3 punteros a funciones:
Código:
struct EstructIny
{
        TipoCT pCT;
        TipoS pSleep;

        //esto no sirve porque no son direcciones remotas sino locales
        /*
        void WINAPI myHook(int i);
        void B();
        static DWORD WINAPI Func(LPVOID lpParameter);*/

        //estos punteros a funciones deben guardar direcciones remotas de las funciones
        TipoMH pmyHook;// =&myHook
        TipoMH Orig_myHook;
        TipoB pB;// =&B
        TipoFunc pFunc;// =&Func
};

///Si estan afuera de la struct
//
void WINAPI myHook(int i)
{
      //El problema es myHook porque necesita llamar algunas funciones de la struct
      //como pSleep o pLoadLibrary, pGetModuleHandle, etc
      //y aparte debe retornar la direccion original de la api en cuestion y dicha direccion
      //es remota tambien

      //y siendo Orig_myHook miembro de la struct y myHook no siendolo se complica
      //porque no puedo modificar la definicion de myHook porque es el reemplazo de una api
     //osea no puedo agregar argumentos , etc entonces myHook deberia estar dentro de la struct
    //pero entonces como va a ser copiada por separado  :huh:

      Orig_myHook(i);
}
void B()
{
}
static DWORD WINAPI Func(LPVOID lpParameter)
{
        EstructIny *ptrThis = (EstructIny*)lpParameter;
        ptrThis->pSleep(2000);    
        return 0;
}


//SI son parte de la struct (punteros a funciones en la struct, pero con direcciones locales)
/*
void WINAPI EstructIny::myHook(int i)
{
      Orig_myHook(i);
}
void EstructIny::B()
{
}
static DWORD WINAPI EstructIny::Func(LPVOID lpParameter)
{
        EstructIny *ptrThis = (EstructIny*)lpParameter;
        ptrThis->pSleep(2000);    
        return 0;
}*/

/////

//La función que inyectaremos (Esta ya esta en el otro proceso)
DWORD Inyectada ( EstructIny *data)
{
      data->pCT(NULL, 0, (LPTHREAD_START_ROUTINE)data->Func, data, 0, NULL);
      return 0;
}
osea lo que no entiendo es como asignarle al myHook remoto el valor de retorno, aparte de que me doy cuenta de lo complicado del metodo sin embargo ya es tarde para dejarlo XD

EDITADO
asi es tal cual el codigo de eon solo que usa messagebox solamente pero calculado localmente
Código:

//Función que nos devuelve un DWORD con la dirección de una api
DWORD GetAddress(char*module, char*function)
{
HMODULE dh = LoadLibrary(module);
DWORD pf = (DWORD)GetProcAddress(dh,function);
FreeLibrary(dh);
return pf;
}


//La función inyectora
void Inyectora()
{
int      pid;                   // Este es el pid del proceso en el que nos queremos inyectar
HANDLE  proc;                   // El handle del proceso en el que inyectaremos
EstructIny    dat;     // El tipo de dato de la estructura
DWORD    TamFun;                // El tamaño de la función a inyectar
void*esp;                   // Lugar de memoria donde copiaremos nuestra función

HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //Obtenemos el pid
PROCESSENTRY32 procinfo = { sizeof(PROCESSENTRY32) };
while(Process32Next(handle, &procinfo))
{
 if(!strcmp(procinfo.szExeFile, "notepad.exe"))
 {
 CloseHandle(handle);
          pid = procinfo.th32ProcessID;
 }
}
CloseHandle(handle);

//Abrimos el proceso en el que nos inyectaremos
proc = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, false, pid);

//---------------------------
//Metemos la dirección de la api en la estructura llamando a la función GetAddress
        //estas son direcciones locales!
// dat.pCreateThread = (CreateThread_t)GetAddress("KERNEL32.DLL", "CreateThread");
// dat.pSleep = (Sleep_t)GetAddress("KERNEL32.DLL", "Sleep");
//--------------------------------------


//Reservamos espacio para nuestra estructura en el proceso a inyectar y la escribimos
EstructIny*dat_ = (EstructIny*)VirtualAllocEx(proc, 0, sizeof(EstructIny), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(proc, dat_, &dat, sizeof(EstructIny), NULL);

//Calculamos el tamaño de la función a inyectar
TamFun = (long unsigned int) Inyectora - (long unsigned int)Inyectada;

//Reservamos espacio para la función, escribimos en él y creamos un hilo
esp = VirtualAllocEx(proc, 0, TamFun, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(proc, esp, (void*)Inyectada, TamFun, NULL);
CreateRemoteThread(proc, NULL, 0, (LPTHREAD_START_ROUTINE) esp, dat_, 0, NULL);
}

« Última modificación: 1 Octubre 2011, 02:42 por dewolo » En línea
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.392


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: castiar un thiscall
« Respuesta #11 en: 1 Octubre 2011, 02:44 »

Es muy tarde (casi 3 AM) para seguir intentado hacerlo asi ... fijate que el ejemplo de esos hilos es MUCHO mas simple de lo que vos estas tratando de hacer.

Si tuvieras una DLL no tendrias este problema:
1) Las funciones de la API estarian en tu tabla de importacion
2) Cualquier informacion que necesitaras compartir seria una variable global

Lo complicado es establecer algo que cualquier funcion hookeada pueda usar para obtener el puntero a la estructura. Normalmente uno podria usar un TLS pero depende de una variable global que no podes tener ...

Sinceramente lo unico que se me ocurre en este momento es que uses un valor hardcodeado para el puntero y sobreescribas la parte de la funcion que lo contiene antes de arrancar el primer hilo ...

Supongamos que:
Código
extern "C" void B()//B solo quiere la direccion de myHook
{
       EstructIny *ptrThis = (EstructIny*)0x89ABCDEF;
ptrThis->Sleep_fn(5000);
}

Entonces la idea seria que reemplazaras ese valor por data ...  poder se puede pero la verdad es una enorme perdida de tiempo.
En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
dewolo

Desconectado Desconectado

Mensajes: 83


Ver Perfil
Re: castiar un thiscall
« Respuesta #12 en: 1 Octubre 2011, 03:00 »

suponemos que en la struct principal tenemos los punteros a funciones de myHook, B y de Func, y por su puesto tambien de Orig_myHook (porque es el valor de retorno de myHook), suponemos que las 3 funciones fueron escritas en la memoria remota osea (myHook, B y Func), entonces yo lo qye necesito es tener un hilo que se ejecute en el proceso remoto y que me inicialize los 4 punteros antes mecionados, los primeros 3 corresponden a las funciones mapeadas digamos, y el cuarto corresponde a una direccion que se encuentra en el proceso remoto, por decir "loadlibrary", usando getprocaddress como en el ejemplo de eon. la pregunta seria los pasos en el tiempo digamos en qe momento deberia inicializar los 4 punteros, y si debo usar ese mismo hilo. obviamente deben ser inicializados despues de la copia de las 3 funciones claramente.

lo que se deduce de esto es que solo seran miembros de la struct los 4 punteros a funciones, las definiciones de las 3 funciones no son de la struct sino que son separadas y son copiadas a parte.

esto esta bien en teoria?

EDITADO
me faltaba el peqenio detalle de que si myHook no es de la struct no accede al puntero a funcion Orig_myHook para poder retornar a la original, se debe implementar algun truqillo como el que mostraste.. asi no es necesario agregar argumentos ni modificar la declaracion del hook



« Última modificación: 1 Octubre 2011, 03:04 por dewolo » En línea
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.392


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: castiar un thiscall
« Respuesta #13 en: 1 Octubre 2011, 03:18 »

Todo lo podes escribir desde el inyector, incluso el mismo truco ese, mientras lo hagas antes de crear el hilo es suficiente.
En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.392


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: castiar un thiscall
« Respuesta #14 en: 1 Octubre 2011, 12:47 »

Otro truco que se me ocurrio, en este caso lo probe y funciono  :xD

Sabiendo que podemos obtener estos valores con intrinsics (con lo cual funcionarian en x64 tambien):

http://en.wikipedia.org/wiki/Win32_Thread_Information_Block
http://en.wikipedia.org/wiki/Process_Environment_Block

PostProcessInitRoutine
A pointer to a callback function called after DLL initialization but before the main executable code is invoked


Esto solo se usa (si se usa claro) antes de que el ejecutable arranque asi que podemos secuestrarlo  ;D

Esta hardcodeado pero definiendo correctamente la estructura _PEB podrias hacerlo portable con un par de ifdefs (para definir la estructura y para el intrinsic de acuerdo al tamaño de puntero: q/dword), en Inyectada:

Código
PULONG_PTR pPeb = (PULONG_PTR)__readfsdword(0x30);
pPeb += 0X53; //PostProcessInitRoutine
*pPeb = (ULONG_PTR)data;

Código
extern "C" void B()
{
PULONG_PTR pPeb = (PULONG_PTR)__readfsdword(0x30);
pPeb += 0X53; //PostProcessInitRoutine
EstructIny *ptrThis = (EstructIny*)*pPeb;
ptrThis->Sleep_fn(5000);
}
« Última modificación: 1 Octubre 2011, 12:51 por Eternal Idol » En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines