castiar un thiscall

Iniciado por dewolo, 30 Septiembre 2011, 19:53 PM

0 Miembros y 1 Visitante están viendo este tema.

dewolo


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 ?




Eternal Idol

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

#2
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?


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.....


Eternal Idol

#3
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 (cpp) [Seleccionar]
static DWORD WINAPI Func(LPVOID lpParameter)
{
 EstructIny *ptrThis = (EstructIny*)lpParameter;
 ptrThis->pSleep(2000);
}


Código (cpp) [Seleccionar]
data->pCT(NULL, 0, (LPTHREAD_START_ROUTINE)data->Func, data, 0, NULL);
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

Si, esta en todos en realidad, en el que pusiste primero es (LPVOID)&ej1  :)
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

#6

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 ?



Eternal Idol

#7
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.
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

Cita de: Eternal Idol en 30 Septiembre 2011, 22:35 PM
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 ?



Eternal Idol

#9
Cita de: dewolo en  1 Octubre 2011, 01:15 AMclaro, 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 ...

Cita de: dewolo en  1 Octubre 2011, 01:15 AMel 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 ...

Cita de: dewolo en  1 Octubre 2011, 01:15 AMlo 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.
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