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: [Overclocking] Récords de overclock del foro

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  castiar un thiscall
0 Usuarios y 2 Visitantes 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
Re: castiar un thiscall
« Respuesta #15 en: 1 Octubre 2011, 15:18 »

gracias amigo por tu dedicacion, pero algunos de esos trucos es la primera ves que los miro XD
sin dejarlos de lado, me podes decir porque este code no funcionaria, es solo una prueba de concepto y ni compila pero necesitaria entender algunos puntos sobre el, antes de avanzar
el codigo ha cambiado un poco eso si, pero con este ejemplo es mas figurado y si entendes ingles que me parece que si porque me recomendaste textos en ingles, etnonces vas a endender los comentarios :laugh:

lo que quisiera saber sobre este code es especificamente porque no funcionaria o quedaria sin comunicacion entre el proceso local y remoto, osea si en algun momento alguna direccion es invalida a causa de esa desconexion. luego voy a pasar a los trucos :)

Código
/*---------------------------*/
typedef struct _PROCESS_info
{
      DWORD pid;
      char* name;
      HANDLE oHandle;
} PROCESS_info, *PPROCESS_info;
 
/*---------------------------*/
 
//Structure who will be copied
struct lib_struct
{
          /* these are from kernel32.dll that is at a static virtual address */
          tLoadLibrary pLoadLibrary;//---------> pointer to function
          tGetProcAddress pGetProcAddress;//---------> pointer to function
          tGetModuleHandleA pGetModuleHandleA;//---------> pointer to function
          tCreateThread pCreateThread;//---------> pointer to function
          /*------------------------------------*/
 
          /* from msvcrt.dll */
          tSleep pSleep;//---------> pointer to function
          tSrand pSrand;//---------> pointer to function
          tRand; pRand;//---------> pointer to function
 
          /* from opengl32.dll */
          tglBegin pglBegin;//---------> pointer to the hook function
          tglBegin Orig_glBegin;//---------> return address for the hook function
 
 
          char str_glBegin[128];//will hold the name of the function
          char strOpengl32[MAX_PATH];//will hold the name of the DLL
};
 
/*---------------------------*/
//Function who will be copied in the remote process
void APIENTRY New_glBegin(GLenum m)
{
        lib_struct *Plib;
 
        Plib->Orig_glBegin(m);
}
 
/*---------------------------*/
//Function who will be copied in the remote process
static DWORD WINAPI HookFunction(LPVOID libs_struct)
{
           lib_struct *Plib=(lib_struct)libs_struct;
 
           HMODULE load_lib = Plib->pLoadLibrary(plib->strOpengl32);
 
          //Initialize the original address for glBegin hook return
          Plib->Orig_glBegin= (tglBegin)Plib->pGetProcAddress(load_lib, plib->str_glBegin);
 
          /* detour on glBegin at remote process (pseudocode) */
 
          *glBegin=Plib->pglBegin;//pglBegin is the address of the hook function in the remote process
 
          return 0;
}
 
/*---------------------------*/
//Function who will be copied in the remote process
static int WINAPI test_func(LPVOID libs_struct)
{
            lib_struct *Plib=(lib_struct)libs_struct;
 
           //this function will be copied in the remote process; I would like to start a thread here
          //and the hooking thread will hook glBegin.
          //in order to do that I need to copy New_glBegin and init pointer pglBegin to locate it
          //in the remote process
          //I also need to init Orig_glBegin so the hook can return to the original glBegin
          //but the pointer value has to be the glBegin address in the remote process
 
           PLib->pCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Plib->HookFunction, libs_struct, 0, NULL);
 
           return 1;
}
 
/*---------------------------*/
 
static void __declspec(naked) end_proc() {}
 
/*---------------------------*/
 
int main()
{
         lib_struct libs;
 
          //PASO 1
          PROCESS_info process;
          process.pid = GetProcessPid(process.name
          printf("[*] Getting full access...");
 
          //PASO 2
          libs.pLoadLibrary = (pLoadLibrary)GetProcAddress(kernel32, "LoadLibraryA");
          libs.pGetProcAddress = (pGetProcAddress)GetProcAddress(kernel32, "GetProcAddress");
          strcpy(libs.strOpeng32, "opengl32.dll");
          strcpy(libs.str_glBegin, "glBegin");
          printf("[*] Filling up lib_struct...");
 
          //PASO 3
          process.oHandle = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, FALSE, process.pid);
          printf("[*] Opening process %s...", process.name);
 
          //PASO 4
          DWORD proc_size = (DWORD)end_proc - (DWORD)test_func;
          printf("[*] Function size: %d\n", proc_size);
 
          //PASO 5
          LPVOID [b]glbeginhook_addr[/b] = VirtualAllocEx(process.oHandle, NULL, proc_size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
          LPVOID [b]hookfunction_addr[/b] = VirtualAllocEx(process.oHandle, NULL, proc_size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
          LPVOID [b]testfunc_addr[/b] = VirtualAllocEx(process.oHandle, NULL, proc_size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
 
          printf("[*] Allocating memory space in %s for test_func...", process.name);
 
 
          //PASO 6 (getting the addreses where I alloc'ed memory for New_glBegin)
          [b]libs.Orig_glBegin[/b] = *(tglBegin)glbeginhook_addr;
          printf("[*] Filling up lib_struct again!!!!! ...");
 
          //PASO 7
          LPVOID struct_addr = VirtualAllocEx(process.oHandle, NULL, sizeof(libs), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
          printf("[*] Allocating memory space in %s for lib_struct libs...", process.name);
 
          //PASO 8 (writting the 3 functions)
          WriteProcessMemory(process.oHandle, [b]glbeginhook_addr[/b], New_glBegin, proc_size, &written_bytes);
          WriteProcessMemory(process.oHandle, [b]hookfunction_addr[/b], HookFunc, proc_size, &written_bytes);
          WriteProcessMemory(process.oHandle, [b]testfunc_addr[/b], test_func, proc_size, &written_bytes);
 
          printf("[*] Writing \'test_func\' in %s...", process.name);
 
          //PASO 9 (writting the structure)
          WriteProcessMemory(process.oHandle, struct_addr, &libs, sizeof(libs), &written_bytes);
          printf("[*] Writing \'lib_struct libs\' in %s...", process.name);
 
          //PASO 10
          DWORD thread_id;
          HANDLE remote_thread = CreateRemoteThread(process.oHandle, NULL, 0, (LPTHREAD_START_ROUTINE)func_addr, struct_addr, 0, &thread_id);
          printf("[*] Creating remote thread for test_func in %s...", process.name);
 
          //PASO 11
          printf(" done\n[*] Thread id: %d\n", thread_id);
}
[/quote]
 
obviamente el primer problema a primera impresion es en New_glBegin porque no tiene la address de la struct como para retornar Orig_glBegin :(
 


« Última modificación: 1 Octubre 2011, 17:46 por madpitbull_99 » 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 #16 en: 1 Octubre 2011, 17:27 »

Al no estar ni los typedefs se hace MUY pesado de compilar asi que solo le di una ojeada. El detour no es ni de lejos tan simple como pareceria en el codigo ... para poder acceder desde el hook a la estructura tenes que hacer algun truco.

PD. No necesariamente MSVCRT.dll estara cargada en el proceso remoto.


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 #17 en: 1 Octubre 2011, 18:32 »

te lo mande por pm :)

y lo de msvcrt.dll se puede hacer loadlibrary en el proceso remoto y cargarla?
aparte me entro una duda sobre esa libreria porque existen tambien msvcrt6 y msvcrt7, etc

y lo del truco no compila sabes porque no permite ese simbolo el __readfsdword  :-[

EDITADO
claro era para visual studio 2005 en adelante XD
http://msdn.microsoft.com/en-US/library/3887zk1s(v=VS.80).aspx


« Última modificación: 1 Octubre 2011, 18:59 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 #18 en: 1 Octubre 2011, 18:59 »

Si, se puede aunque Sleep la tenes en la API y dudo que sean necesarios numeros aleatorios  ;D

Actualiza el compilador y podras usar __readfsdword.
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 #19 en: 1 Octubre 2011, 19:04 »

Si, se puede aunque Sleep la tenes en la API y dudo que sean necesarios numeros aleatorios  ;D

Actualiza el compilador y podras usar __readfsdword.

JAJAJAJAJAJAJ es que iba a hacer otra cosa en primer lugar con srand y rand  :rolleyes:

EDITADO
los tamaños de las primeras dos funciones no son correctos alguien sabe como es el calculamiento ?
por ejemplo para TestFunc
Código:
DWORD proc_size1 = (DWORD)end_proc - (DWORD)TestFunc;

pero para HookFunc
Código:
DWORD proc_size2 = (DWORD)end_proc - (DWORD)TestFunc - (DWORD)HookFunc;

seria asi ?
« Última modificación: 1 Octubre 2011, 20:16 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 #20 en: 1 Octubre 2011, 20:51 »

El naked no esta permitido en x64, mejor reserva y copia una pagina entera (1024 bytes), menos no podes gastar de cualquier manera ;D
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 #21 en: 2 Octubre 2011, 15:39 »

en principio no entendia ese calculo por supongo que se trata de posiciones fijas y al restarlas da la diferencia de lo que ocupa , igual eso se aplicaria solo si fuera una funcion como en el codigo de eon pero en este son 3 .. porque asi com esta escrito se denota que lo que esta restando son dos direcciones de memoria (la de las dos funciones), el tema es como saber si su posicion es fija

Código:
DWORD inyectada (datos *data)
{
         data -> apiMessageBoxA (0, data->mensaje, data->titulo, 0);
         return 0;
}
void inyectora()
{
           DWORD TamFun; // El tamaño de la función a inyectar
          TamFun = (long unsigned int) inyectora - (long unsigned int)inyectada;
}

void main()
{
       inyectora();
}

En línea
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

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