Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-06-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Tambien he probado esto pero tampoco me ha funcionado:

Código:
HMODULE hDll;

        hDll = LoadLibrary("DllHook.dll");

        typedef ULONG __cdecl(*pFuncDllHook)(void);
        pFuncDllHook GetAddressNtQueryInformationProcess;

        GetAddressNtQueryInformationProcess = (pFuncDllHook)GetProcAddress(hDll, "GetAddressNtQueryInformationProcess"); //obtiene el puntero
        ULONG retval =  GetAddressNtQueryInformationProcess();
Responder Con Cita
  #2  
Antiguo 18-06-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
No entiendo tu problema, tu código me funciona.

Si quieres atacar tu propio proceso no te hace falta dll. GetProcAddress se encarga de encontrar la dirección correcta en tu proceso o en una dll. Cosa diferente sería si vas a hacer una inyección directa de un shellcode, sin dll, pero no es el caso.


Saludos.
Responder Con Cita
  #3  
Antiguo 18-06-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
mi proceso inyectara la dll a otro proceso para tabajar sobre ese otro proceso. A ver si me puedes ayudar para que al menos mi dll ejecute lo que tengo y luego ya intentaré solucionar lo de los hooks.
Responder Con Cita
  #4  
Antiguo 19-06-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Código:
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long fwdreason, void* lpReserved)
{
  switch (fwdreason) {
    case DLL_PROCESS_ATTACH:  // cuando se carga la dll
      InstallHook();
      break;
    case DLL_PROCESS_DETACH:  // cuando se descarga la dll
      UnInstallHook();
      break;
  }
  return 1;
}
El resto de las funciones no las puedes llamar desde tu proceso con la confianza de que funcionen en el proceso inyectado.

Cada proceso carga una copia diferente de la dll, de modo que sus variables globales lo serán sólo para el proceso inyectado y las llamadas a funciones desde otro proceso, sencillamente trabajan como en ese proceso y no como en el inyectado. Entendido este punto, las funciones que implementas GetAddressNtSetInformationThread y GetAddressNtQueryInformationProcess funcionan en el proceso que hace la llamada, no afectan a ningún otro.

El punto de entrada que te pongo arriba, ilustra como iniciar las cosas cuando la dll se carga en un proceso determinado y afectarán sólo a ese proceso. Es por ese motivo que un hook a una API solo se realiza en el proceso que cargó la dll, si quieres afectar otros procesos, tendrás que inyectar la dll en cada uno de ellos. No puedes continuar sin tener claro este punto.

Piensa que si quieres hacer un Hook a las APIs NtSetInformationThread y NtQueryInformationProcess, deberás cargar la dll en todos los procesos que las utilicen contra tu programa, en general en todos los procesos existentes y que se inyecte en los nuevos nacientes.


Saludos.
Responder Con Cita
  #5  
Antiguo 19-06-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
vale, ya lo tengo claro. Lo he cambiado y las funciones las llamo ahora desde la dll aunque la dll no la tengo como indicas. Puse un MessageBox dentro de DllEntryPoint y saltaba varias veces y ahora entiendo porque pasaba eso, tengo que solucionar eso y que no uso VirtuaProtect para cambiar los permisos de las dlls. Segun he leido si no cambio los permisos daria una excepcion al intentar escribir en ellas y no haria nada. Justo lo que me pasa ahora mismo, tengo las llamadas a las funciones en DllEntryPoint y estas intentan modificar el inicio de las apis sin tener los permisos necesarios. Lo que no tengo nada claro es como haces para aplicar un filtro y, dependiendo de este, ejecutes el codigo original o no. ¿Como haces eso? Es que al cambiar el inicio de la api no sabes seguro que instrucciones te estas cargando y, como todas no son del mismo tamaño de bytes, pues la cosa se complica ya que no es tan facil como ejecutar esas lineas en la dll y retornar a la siguiente linea de la api despues del injerto. ¿Me puedes explicar eso detalladamente?
Responder Con Cita
  #6  
Antiguo 19-06-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
En el tutorial que encontraste y aquí está explicado con todo detalle como realizar el Hook, como volver del Hook, como deshacer el Hook, como llamar a la API original y como evitar machacar instrucciones asm cuando dos API no tienen el mismo punto de entrada, usando un desensamblador de longitud en el mismo código que realiza el Hook. Debes leerlo despacio y estudiar los esquemas del hook de ejemplo. El ejemplo es funcionante y trasladable para cualquier API en modo usuario sin más cambios que declarar la API, su sustituta y encontrar los puntero a ambas.

El código está escrito en delphi pero no hay dificultad para pasarlo a C, ya que solo usa API. En este punto te puedo echar una mano ti se atascas.


Saludos.
Responder Con Cita
  #7  
Antiguo 19-06-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
amigo por el momento tengo otros problemas, te cuento.
He creado la dll la cual la inyecto y, si lo hago sobre el mismo programa funciona perfecto y parchea las apis que le indique con valores fijos para cada una (de momento solo parcheo y cuando haga correr bien la dll en cualquier funcion me lio con el tema de hooks).
El problema está en si lo intento hacer sobre otra aplicacion ajena a la que hace la inyeccion, la aplicacion inyectora pasa todos los condicionales correctamente hasta crear el hilo pero parece ser que el hilo no se crea porque no me muestra mensajes que tengo puestos ni nada, es como si no existiese la dll en el proceso.

El codigo lo he dejado asi:
El inyector:
Código:
void InjectDll( HANDLE hProcess, AnsiString DLL )
{
        ULONG bytesWritten, TID;
        HANDLE pThreadStartRoutine,hThread,Parameters;

        //Creamos espacio en el proceso
        Parameters = VirtualAllocEx(hProcess,NULL,DLL.Length()+1,MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
        if(Parameters != NULL)
        {
                WriteProcessMemory(hProcess,Parameters,DLL.c_str(),DLL.Length()+1, &bytesWritten);

                if(bytesWritten == (ULONG)DLL.Length()+1)
                {
                        pThreadStartRoutine = GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");

                        if(pThreadStartRoutine != NULL)
                        {
                                hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pThreadStartRoutine,Parameters,0,&TID);

                                if(hThread == NULL)
                                {
                                        MessageBox(GetCurrentProcess(),"No se pudo crear el hilo.","Error",MB_OK);
                                }else{
                                        WaitForSingleObject(hThread,INFINITE);
                                }
                        }else{
                                MessageBox(GetCurrentProcess(),"No se pudo obtener la direccion base de LoadLibraryA.","Error",MB_OK);
                        }
                }else{
                        MessageBox(GetCurrentProcess(),"No se pudo parchear la API.","Error",MB_OK);
                }
        }else{
                MessageBox(GetCurrentProcess(),"No se pudo obtener memoria para inyectar la dll.","Error",MB_OK);
        }
}
y la dll quedó asi:
Código:
#include <windows.h>
#include <UnitFunctions.h>
#pragma argsused

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        BYTE injertoZwSetInformationThread[] = {0x33,0xC0,0xC2,0x10,0x00};
        BYTE injertoZwQueryInformationProcess[] = {0xC7,0x01,0x00,0x00,0x00,0x00,0x33,0xC0,0xC2,0x14,0x00};
        ULONG len;

        switch(reason)
        {
                case DLL_PROCESS_ATTACH:
                        if(lpReserved)
                                MessageBox(0,"Process has attached to DLL by static loading.","UnitEntryPoint.cpp",MB_OK);
                        else
                                //Parcheo ZwSetInformationThread
                                len = sizeof(injertoZwSetInformationThread);
                                PatchAPI(injertoZwSetInformationThread,len,"ntdll.dll","NtSetInformationThread");

                                //Parcheo ZwQueryInformationProcess
                                len = sizeof(injertoZwQueryInformationProcess);
                                PatchAPI(injertoZwQueryInformationProcess,len,"ntdll.dll","NtQueryInformationProcess");
                                MessageBox(0,"Process has attached to DLL by dinamic loading.","UnitEntryPoint.cpp",MB_OK);
                        break;

                case DLL_THREAD_ATTACH:
                        MessageBox(0,"Thread has attached to DLL.","UnitEntryPoint.cpp",MB_OK);
                        break;

                case DLL_THREAD_DETACH:
                        MessageBox(0,"Thread has detached from DLL.","UnitEntryPoint.cpp",MB_OK);
                        break;

                case DLL_PROCESS_DETACH:
                        MessageBox(0,"Process has detached from DLL.","UnitEntryPoint.cpp",MB_OK);
                        break;
        }
        
        return 1;
}
y aqui las funciones de la dll:
Código:
#pragma hdrstop

#include "UnitFunctions.h"
//---------------------------------------------------------------------------

void PatchAPI(BYTE *injerto,ULONG len,char *nameDLL,char *nameAPI)
{
        ULONG Dir;
        ULONG nWrite;
        ULONG oldProtect;

        Dir = GetAddressAPI(nameDLL,nameAPI);

        if(Dir == NULL)
        {
                MessageBox(NULL,"Error al obtener la direccion de NtSetInformationThread.","ERROR",MB_OK);
        }else{
                if(VirtualProtect((LPVOID)Dir,len,PAGE_WRITECOPY,&oldProtect) == 0)
                {
                        char mensaje[] = "VirtualProtect ha fallado.\nNo se pudo injertar en ";
                        strcat(mensaje,nameAPI);
                        MessageBox(NULL,mensaje,"ERROR",MB_OK);
                }else{
                        WriteProcessMemory(GetCurrentProcess(),(LPVOID)Dir,injerto,len,&nWrite);

                        if(VirtualProtect((LPVOID)Dir,len,oldProtect,&oldProtect) == 0)
                        {
                                char mensaje[] = "VirtualProtect ha fallado.\nNo se pudo restaurar los mermisos originales en ";
                                strcat(mensaje,nameAPI);
                                MessageBox(NULL,mensaje,"ERROR",MB_OK);
                        }
                }
        }
}
//---------------------------------------------------------------------------

ULONG GetAddressAPI(char* nameDLL,char* nameAPI)
{
        HMODULE hMod;

        hMod = LoadLibrary(nameDLL);
        return (ULONG)GetProcAddress(hMod,nameAPI);
}
//---------------------------------------------------------------------------

#pragma package(smart_init)
y el archivo de cabecera de las funciones:
Código:
#include <Windows.h>
#include <string.h>
#ifndef UnitFunctionsH
#define UnitFunctionsH
//---------------------------------------------------------------------------

/*
#ifdef __cplusplus
extern "C"
{
#endif
//Aqui se definen las funciones externas como en el siguiente ejemplo
__declspec(dllexport) const int GetAnswerOfLife();

#ifdef __cplusplus
}
#endif
*/

ULONG GetAddressAPI(char* nameDLL,char* nameAPI);
void PatchAPI(BYTE *injerto,ULONG len,char *nameDLL,char *nameAPI);

//---------------------------------------------------------------------------
#endif
Si el inyector no me da fallos ¿que estoy haciendo mal?

a la victima la creo con:
Código:
CreateProcess(PathFile.c_str(),NULL, NULL, NULL, FALSE, DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &si, &pi);
Ya que estaré depurandola y en el entrypoint del proceso hago esto:
Código:
AnsiString DLL = "DllHook.dll";
InjectDll(pi.hProcess, DLL);
Se me queda en la linea:
Código:
WaitForSingleObject(hThread,INFINITE);
Se queda esperando y nunca retorna. Cuando la victima es la misma funcion que crea la inyeccion si funciona correctamente.
No entiendo donde puede estar el error.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿como obtener direcciones de memoria...? usuario87 Varios 3 07-08-2011 05:22:44
Obtener direcciones de Imagenes y SWF Deiv HTML, Javascript y otros 5 20-07-2007 10:50:31
Problemas con funciones matematicas jorgegetafe Varios 3 05-02-2007 18:43:09
Problemas al definir UDF (Funciones en una DLL) pcicom Firebird e Interbase 2 21-06-2006 06:49:15
Problemas con Funciones mauro Internet 2 04-07-2003 14:10:06


La franja horaria es GMT +2. Ahora son las 02:31:31.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi