![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
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();
|
|
#2
|
||||
|
||||
|
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. |
|
#3
|
||||
|
||||
|
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.
|
|
#4
|
||||
|
||||
|
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;
}
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. |
|
#5
|
||||
|
||||
|
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?
|
|
#6
|
||||
|
||||
|
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. |
|
#7
|
||||
|
||||
|
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);
}
}
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;
}
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)
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
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); Código:
AnsiString DLL = "DllHook.dll"; InjectDll(pi.hProcess, DLL); Código:
WaitForSingleObject(hThread,INFINITE); No entiendo donde puede estar el error. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
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 |
|