elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [AYUDA] DLL
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [AYUDA] DLL  (Leído 4,251 veces)
Natalia94x

Desconectado Desconectado

Mensajes: 19


Ver Perfil
[AYUDA] DLL
« 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.


Código
  1. // ------------------------ DLL API HOOK EN ->  FindNextFileW Y FindFirstFileW ---------------------------
  2.  
  3. #include "stdafx.h"
  4. #include <windows.h>
  5. #include <iostream>
  6.  
  7.  
  8. // DECLARACIONES:
  9. BYTE *BufferFN;                 // Buffer que usaremos para ejecutar el api original FindNextFileW
  10. char Prefijo[] = "Archivo";   // El prefijo que buscaremos para ocultar archivos/carpetas
  11.  
  12.  
  13. // FUNCIONES:
  14. void    Hookear();  // Función que hookeará el api
  15.  
  16.  
  17. // Función que será llamada en vez de FindNextFileW
  18. HANDLE  __stdcall miFindNextFileW(HANDLE hFindFile,LPWIN32_FIND_DATAW lpFindFileData);
  19. // Puntero a función con el cual llamaremos al api FindNextFileW original
  20. HANDLE (__stdcall *pBuffFN) (HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData);
  21.  
  22.  
  23.  
  24.  
  25.  
  26. // FUNCIÓN MAIN
  27. bool WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
  28. {
  29. // Si cargan la DLL hookeamos
  30. if (fdwReason == DLL_PROCESS_ATTACH)
  31. {
  32. Hookear();
  33. }
  34. return TRUE;
  35. }
  36.  
  37.  
  38.  
  39. // FUNCIÓN QUE LLAMARÁ EL PROGRAMA PRINCIPLA CREYENDO QUE ES EL API FINDNEXTFILEW
  40. HANDLE  __stdcall miFindNextFileW(HANDLE hFindFile,LPWIN32_FIND_DATAW lpFindFileData)
  41. {
  42. // Ocultamos los archivos que empiecen por el prefijo indicado
  43.  
  44. HANDLE hand;
  45. char ascStr[611];
  46.  
  47. do
  48. {
  49. hand = pBuffFN(hFindFile,lpFindFileData);
  50. WideCharToMultiByte(CP_ACP, 0, lpFindFileData->cFileName, -1, ascStr, 611, NULL, NULL);
  51.  
  52. }while (strncmp(ascStr,Prefijo,strlen(Prefijo)) == 0 && hand != NULL);
  53.  
  54. return hand;
  55. }
  56.  
  57.  
  58. // FUNCIÓN PARA HOOKEAR FINDNEXTFILEW Y FINDFIRSTFILEW
  59. void Hookear()
  60. {
  61. DWORD ProteVieja;  // Parametro para VirtualProtect
  62. BYTE  *DirFN;      // La dirección en memoria de FindNextFileW
  63. BYTE  *DirYoFN;    // La dirección en memoria de la función que remplaza a FindNextFileW
  64.  
  65. // --> HOOKEAMOS FINDNEXTFILEW (7 bytes)
  66.  
  67. // Obtenemos la dirección en memoria de FindNextFileW.
  68. DirFN=(BYTE *) GetProcAddress(GetModuleHandle("kernel32.dll"), "FindNextFileW");
  69.  
  70. //Reservamos 12 bytes de memoria para nuestro Buffer
  71. //FindNextFileW ocupa 7 bytes en la memoria, y necesitamos 5 más para poner nuestro salto alli estan los 12 bytes :D
  72. BufferFN=(BYTE *) malloc (12);
  73.  
  74. //Le damos todos los permisos a los 12 bytes de nuestro Buffer
  75. VirtualProtect((void *) BufferFN, 12, PAGE_EXECUTE_READWRITE, &ProteVieja);
  76.  
  77. // Copiamos los 7 primeros bytes del api en el buffer
  78. memcpy(BufferFN,DirFN,7);
  79. BufferFN += 7;
  80.  
  81. // En los 5 bytes restantes...
  82. // En el primero introducimos un jmp
  83. *BufferFN=0xE9; //0xE9 es el codigo de operacion del jmp
  84. BufferFN++;
  85.  
  86. // En los otros 4 la distancia del salto
  87. *((signed int *) BufferFN)= DirFN - BufferFN + 3;
  88.  
  89. // Asignamos al puntero, la funcion pBuff del inicio del Buffer para poder ejecutar el api original
  90. pBuffFN = (HANDLE (__stdcall *)(HANDLE,LPWIN32_FIND_DATAW)) (BufferFN-8);
  91.  
  92.  
  93. // Le damos todos los permisos a los 5 primeros bytes de la api original
  94. VirtualProtect((void *) DirFN,5,PAGE_EXECUTE_READWRITE,&ProteVieja);
  95.  
  96. // Cambiamos el tipo a puntero a byte para facilitar el trabajo
  97. DirYoFN=(BYTE *) miFindNextFileW;
  98.  
  99. // En el inicio de la api metemos un jmp para que salte a miFindNextFileW
  100. *DirFN=0xE9;
  101. DirFN++;
  102.  
  103. // Metemos la distancia del salto
  104. *((signed int *) DirFN)=DirYoFN - DirFN - 4;
  105. // Libermos librerias de cache
  106. FlushInstructionCache(GetCurrentProcess(),NULL,NULL);
  107. }
  108.  



« Última modificación: 21 Marzo 2017, 19:09 pm por Natalia94x » En línea

BloodSharp


Desconectado Desconectado

Mensajes: 804


El Messi-Vegeta :D


Ver Perfil
Re: [AYUDA] DLL
« Respuesta #1 en: 21 Marzo 2017, 20:22 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#


En línea



Natalia94x

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: [AYUDA] DLL
« Respuesta #2 en: 21 Marzo 2017, 20:48 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.
En línea

Natalia94x

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: [AYUDA] DLL
« Respuesta #3 en: 21 Marzo 2017, 22:15 pm »

Código
  1. #include "stdafx.h"
  2. #include <windows.h>
  3. #include <iostream>
  4.  
  5.  
  6. // DECLARACIONES:
  7. BYTE *BufferFN;                 // Buffer que usaremos para ejecutar el api original FindNextFileW
  8. char Prefijo[] = "Arquivo_";   // El prefijo que buscaremos para ocultar archivos/carpetas
  9.  
  10.  
  11. // FUNCIONES:
  12. void    Hookear();  // Función que hookeará el api
  13.  
  14.  
  15. // Función que será llamada en vez de FindNextFileW
  16. HANDLE  __stdcall miFindNextFileW(HANDLE hFindFile,LPWIN32_FIND_DATAW lpFindFileData);
  17. // Puntero a función con el cual llamaremos al api FindNextFileW original
  18. HANDLE (__stdcall *pBuffFN) (HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData);
  19.  
  20.  
  21.  
  22.  
  23.  
  24. // FUNCIÓN MAIN
  25. bool WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
  26. {
  27. // Si cargan la DLL hookeamos
  28. if (fdwReason == DLL_PROCESS_ATTACH)
  29. {
  30. Hookear();
  31. }
  32. return TRUE;
  33. }
  34.  
  35.  
  36.  
  37. // FUNCIÓN QUE LLAMARÁ EL PROGRAMA PRINCIPLA CREYENDO QUE ES EL API FINDNEXTFILEW
  38. HANDLE  __stdcall miFindNextFileW(HANDLE hFindFile,LPWIN32_FIND_DATAW lpFindFileData)
  39. {
  40. // Ocultamos los archivos que empiecen por el prefijo indicado
  41.  
  42. HANDLE hand;
  43. char ascStr[611];
  44.  
  45. do
  46. {
  47. hand = pBuffFN(hFindFile,lpFindFileData);
  48. WideCharToMultiByte(CP_ACP, 0, lpFindFileData->cFileName, -1, ascStr, 611, NULL, NULL);
  49.  
  50. }while (strncmp(ascStr,Prefijo,strlen(Prefijo)) == 0 && hand != NULL);
  51.  
  52. return hand;
  53. }
  54.  
  55.  
  56. // FUNCIÓN PARA HOOKEAR FINDNEXTFILEW Y FINDFIRSTFILEW
  57. void Hookear()
  58. {
  59. DWORD ProteVieja;  // Parametro para VirtualProtect
  60. BYTE  *DirFN;      // La dirección en memoria de FindNextFileW
  61. BYTE  *DirYoFN;    // La dirección en memoria de la función que remplaza a FindNextFileW
  62.  
  63. // --> HOOKEAMOS FINDNEXTFILEW (7 bytes)
  64.  
  65. // Obtenemos la dirección en memoria de FindNextFileW.
  66. DirFN=(BYTE *) GetProcAddress(GetModuleHandle("kernel32.dll"), "FindNextFileW");
  67.  
  68. //Reservamos 12 bytes de memoria para nuestro Buffer
  69. //FindNextFileW ocupa 7 bytes en la memoria, y necesitamos 5 más para poner nuestro salto alli estan los 12 bytes :D
  70. BufferFN=(BYTE *) malloc (12);
  71.  
  72. //Le damos todos los permisos a los 12 bytes de nuestro Buffer
  73. VirtualProtect((void *) BufferFN, 12, PAGE_EXECUTE_READWRITE, &ProteVieja);
  74.  
  75. // Copiamos los 7 primeros bytes del api en el buffer
  76. memcpy(BufferFN,DirFN,7);
  77. BufferFN += 7;
  78.  
  79. // En los 5 bytes restantes...
  80. // En el primero introducimos un jmp
  81. *BufferFN=0xE9; //0xE9 es el codigo de operacion del jmp
  82. BufferFN++;
  83.  
  84. // En los otros 4 la distancia del salto
  85. *((signed int *) BufferFN)= DirFN - BufferFN + 3; // ----> ERROR LINEA 85
  86.  
  87. // Asignamos al puntero, la funcion pBuff del inicio del Buffer para poder ejecutar el api original
  88. pBuffFN = (HANDLE (__stdcall *)(HANDLE,LPWIN32_FIND_DATAW)) (BufferFN-8);
  89.  
  90.  
  91. // Le damos todos los permisos a los 5 primeros bytes de la api original
  92. VirtualProtect((void *) DirFN,5,PAGE_EXECUTE_READWRITE,&ProteVieja);
  93.  
  94. // Cambiamos el tipo a puntero a byte para facilitar el trabajo
  95. DirYoFN=(BYTE *) miFindNextFileW;
  96.  
  97. // En el inicio de la api metemos un jmp para que salte a miFindNextFileW
  98. *DirFN=0xE9;
  99. DirFN++;
  100.  
  101. // Metemos la distancia del salto
  102. *((signed int *) DirFN)=DirYoFN - DirFN - 4; // ERROR -> LINEA 102
  103. // Libermos librerias de cache
  104. FlushInstructionCache(GetCurrentProcess(),NULL,NULL);
  105. }
  106.  

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

Código
  1. // En los otros 4 la distancia del salto
  2. *((signed int *) BufferFN)= DirFN - BufferFN + 3; // ----> ERROR LINEA 85
  3.  
  4.     // Metemos la distancia del salto
  5. *((signed int *) DirFN)=DirYoFN - DirFN - 4; // ERROR -> LINEA 102
  6.  
  7.  


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 Desconectado

Mensajes: 1.603



Ver Perfil
Re: [AYUDA] DLL
« Respuesta #4 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.
En línea

Natalia94x

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: [AYUDA] DLL
« Respuesta #5 en: 21 Marzo 2017, 23:29 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.
En línea

BloodSharp


Desconectado Desconectado

Mensajes: 804


El Messi-Vegeta :D


Ver Perfil
Re: [AYUDA] DLL
« Respuesta #6 en: 21 Marzo 2017, 23:35 pm »

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

Código
  1. // En los otros 4 la distancia del salto
  2. *((signed int *) BufferFN)= DirFN - BufferFN + 3; // ----> ERROR LINEA 85
  3.  
  4.     // Metemos la distancia del salto
  5. *((signed int *) DirFN)=DirYoFN - DirFN - 4; // ERROR -> LINEA 102
  6.  
  7.  


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 Desconectado

Mensajes: 19


Ver Perfil
Re: [AYUDA] DLL
« Respuesta #7 en: 22 Marzo 2017, 02:35 am »

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!.
« Última modificación: 22 Marzo 2017, 06:18 am por Natalia94x » En línea

BloodSharp


Desconectado Desconectado

Mensajes: 804


El Messi-Vegeta :D


Ver Perfil
Re: [AYUDA] DLL
« Respuesta #8 en: 23 Marzo 2017, 14:46 pm »

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#
En línea



Natalia94x

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: [AYUDA] DLL
« Respuesta #9 en: 23 Marzo 2017, 18:59 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!..
« Última modificación: 25 Marzo 2017, 02:13 am por Natalia94x » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines