elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
28 Agosto 2008, 18:28  



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderador: ®®)
| | |-+  [Source] Listar funciones de libreria DLL
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Imprimir
Autor Tema: [Source] Listar funciones de libreria DLL  (Leído 359 veces)
Ferсhu

Desconectado Desconectado

Mensajes: 1.225

Menos palabras y Mas codigos.


Ver Perfil WWW
[Source] Listar funciones de libreria DLL
« en: 30 Junio 2008, 07:13 »

Hola, les dejo un codigo que lista las funciones que se pueden exportar de la dll.

ListarFunc.c
Código
#include <stdio.h>
#include <windows.h>
 
int main(int argc, char *argv[])
{
   FILE *fp;
   IMAGE_NT_HEADERS ntheader;
   IMAGE_SECTION_HEADER **sections;
   IMAGE_SECTION_HEADER section,*SecET;    
   int i,j,inicio,final;
   unsigned char *buffer;
   IMAGE_EXPORT_DIRECTORY  descriptor;
   int d,inicioET,tamET,OffSetET,n,pos,offset;
   HANDLE hStdout;
 
   hStdout=GetStdHandle(STD_OUTPUT_HANDLE);
   SetConsoleTextAttribute (hStdout,15);
   printf("Listar Funciones de Exportacion by ");
   SetConsoleTextAttribute (hStdout,FOREGROUND_BLUE|FOREGROUND_INTENSITY);
   printf("Ferchu");
   SetConsoleTextAttribute (hStdout,15);
   printf("\n(\x9f) Copyleft 2006 - 2008 Gema Soft\n\n");
   SetConsoleTextAttribute (hStdout,7);
 
   if(argc<2){printf("ListarFunc Archivo\n\n"
                         "       Archivo     Nombre y Ruta del archivo.\n\n");
               return 0; }
 
   fp=fopen(argv[1],"rb");
   if(!fp){ printf("Error al abrir el archivo.\n"); return 0; }
   fseek(fp, 0x3C,0);
   fread(&d, 4, 1, fp);        
   fseek(fp, d,0);      
   fread(&ntheader, sizeof(ntheader), 1, fp);  
 
   if(!(ntheader.FileHeader.Characteristics & IMAGE_FILE_DLL)){
                                              printf("No es una libreria Dll Valida.\n");
                                              return 0;
                                              }
 
   sections=(IMAGE_SECTION_HEADER **)malloc(ntheader.FileHeader.NumberOfSections);
   printf("\n\tNombre\tDir Fisica\tSize\n");
   for(i=0;i<ntheader.FileHeader.NumberOfSections;i++){
 
                    sections[i]=(IMAGE_SECTION_HEADER *)malloc(sizeof(IMAGE_SECTION_HEADER));
                    fread((*sections+i), sizeof(IMAGE_SECTION_HEADER),1,fp);
                    printf("\n\t%s\t0x%.8x\t%d",(*sections +i)->Name,(*sections +i)->PointerToRawData,(*sections +i)->SizeOfRawData);
 
                    pos=ntheader.OptionalHeader.DataDirectory[0].VirtualAddress;
                    inicio=(*sections +i)->VirtualAddress;
                    final = inicio + (*sections +i)->Misc.VirtualSize;
                    if((pos >= inicio) && (pos < final))SecET=(*sections +i);
 
   }
 
   inicioET= ntheader.OptionalHeader.DataDirectory[0].VirtualAddress - SecET->VirtualAddress + SecET->PointerToRawData ;  //; //0x6a04;
   tamET= ntheader.OptionalHeader.DataDirectory[0].Size;
   OffSetET=ntheader.OptionalHeader.DataDirectory[0].VirtualAddress ;
 
   printf("\n\nInicio FisicalAddress de la ET: 0x%x\n",inicioET );
   printf("Final FisicalAddress de la ET:  0x%x\n",inicioET+tamET);
   printf("Inicio VirtualAddress de la ET: 0x%x\n",ntheader.OptionalHeader.DataDirectory[0].VirtualAddress+ntheader.OptionalHeader.ImageBase);
   printf("Final VirtualAddress de la ET:  0x%x\n",ntheader.OptionalHeader.DataDirectory[0].VirtualAddress+ tamET+ntheader.OptionalHeader.ImageBase);
   printf("OffSet de la ET: 0x%x\n",OffSetET);
   printf("Size de la ET: 0x%x\n\n",tamET);    
 
   fseek(fp,SecET->PointerToRawData,0);    
   buffer=(unsigned char *)malloc(SecET->SizeOfRawData);
 
   fread(buffer, SecET->SizeOfRawData,1 , fp);  
   fseek(fp,inicioET,0);    
   fread(&descriptor, sizeof(IMAGE_EXPORT_DIRECTORY),1 , fp);
 
   char *Libreria = (char *)(buffer + ((long)descriptor.Name) - SecET->VirtualAddress);
   char *DirTabla = (char*)(buffer + (long)descriptor.AddressOfNames - SecET->VirtualAddress);
   char *DirFunciones  = (char *)(buffer + ((long)descriptor.AddressOfFunctions) - SecET->VirtualAddress);
   char *nombre;
   long Direccion;
   long RVA;
 
   char *Sec=( char*)buffer;
   long *TablaNombres = (long*)DirTabla;
   long *TablaDirecciones = (long*)DirFunciones;
 
 
   printf("Libreria: %s\n",Libreria);
   printf("Cantidad de Funciones: %d\n\n",descriptor.NumberOfFunctions);  
 
   printf("   Ordinal    RVA         Direccion   Nombre\n");
   printf("   ------------------------------------------------------\n");
 
   for(i=0;(i<descriptor.NumberOfFunctions)&&(i<descriptor.NumberOfNames);i++,TablaNombres++,TablaDirecciones++){    
   RVA = *TablaDirecciones;
   Direccion = *TablaDirecciones + SecET->VirtualAddress + ntheader.OptionalHeader.ImageBase;
   nombre= Sec + *TablaNombres - SecET->VirtualAddress;
   printf("    %.4d      %.8x    %.8x    %s\n",i+1,RVA,Direccion,nombre);
   }
 
   return EXIT_SUCCESS;
}
 

Para utilizarlo solo hay q poner, por ej:

Código:
>ListarFunc.exe c:\windows\system32\url.dll

Citar
Listar Funciones de Exportacion by Ferchu
(ƒ) Copyleft 2006 - 2008 Gema Soft


        Nombre  Dir Fisica      Size

        .text   0x00000400      5120
        .data   0x00001800      512
        .rsrc   0x00001a00      30720
        .reloc  0x00009200      512

Inicio FisicalAddress de la ET: 0x1390
Final FisicalAddress de la ET:  0x1621
Inicio VirtualAddress de la ET: 0x71d31f90
Final VirtualAddress de la ET:  0x71d32221
OffSet de la ET: 0x1f90
Size de la ET: 0x291

Libreria: URL.dll
Cantidad de Funciones: 22

   Ordinal    RVA         Direccion   Nombre
   ------------------------------------------------------
    0001      000011bd    71d321bd    AddMIMEFileTypesPS
    0002      000016e7    71d326e7    AutodialHookCallback
    0003      00001206    71d32206    DllCanUnloadNow
    0004      000016a8    71d326a8    DllGetClassObject
    0005      0000168f    71d3268f    FileProtocolHandler
    0006      00001216    71d32216    FileProtocolHandlerA
    0007      00001216    71d32216    InetIsOffline
    0008      00001181    71d32181    MIMEAssociationDialogA
    0009      000016d2    71d326d2    MIMEAssociationDialogW
    0010      000016d2    71d326d2    MailToProtocolHandler
    0011      00001280    71d32280    MailToProtocolHandlerA
    0012      00001280    71d32280    NewsProtocolHandler
    0013      000013a0    71d323a0    NewsProtocolHandlerA
    0014      000013a0    71d323a0    OpenURL
    0015      00001732    71d32732    OpenURLA
    0016      00001732    71d32732    TelnetProtocolHandler
    0017      000014a8    71d324a8    TelnetProtocolHandlerA
    0018      000014a8    71d324a8    TranslateURLA
    0019      000016b0    71d326b0    TranslateURLW
    0020      000016c1    71d326c1    URLAssociationDialogA
    0021      000016d2    71d326d2    URLAssociationDialogW

Tambien se puede hacer esto para mejor visualizacion:

Citar
>ListarFunc.exe c:\windows\system32\url.dll > Url.txt

Y Url.txt obtenemos toda la informacion.

Cualquier fallo, avisen.

Saludos!!
En línea

E0N
Lab &
Colaborador

Desconectado Desconectado

Mensajes: 2.591


Por variar un poco de avatar.. :P


Ver Perfil WWW
Re: [Source] Listar funciones de libreria DLL
« Respuesta #1 en: 30 Junio 2008, 12:22 »

Muy útil Ferchu, si a eso le añades encontrar "dinámicamente" desde donde está cargada la kernel32.dll podemos usar cualquier api en un virus por ejemplo sin que dependa del pc. Tengo por ahí un código muy guarro, pero bueno si alguien lo quiere lo subo ;)

Salu2, buen code
En línea
Freeze.

Desconectado Desconectado

Mensajes: 2.391


FireSoft


Ver Perfil WWW
Re: [Source] Listar funciones de libreria DLL
« Respuesta #2 en: 30 Junio 2008, 15:59 »

Excelente Ferchu ;)
Chincheta o por lo menos agreguenlo a una lista de sources :D :D

Ya tengo una buena idea :xD
En línea

Gana premios:


Sr.Deep

Desconectado Desconectado

Mensajes: 458

jaja este si no me lo van a joder xD


Ver Perfil
Re: [Source] Listar funciones de libreria DLL
« Respuesta #3 en: 01 Julio 2008, 00:38 »

Excelente Ferchus yo lo queria acer pero tengooo un mes con weba xD...! muy Bien Felicidades
En línea
Krackwar

Desconectado Desconectado

Mensajes: 771


xD


Ver Perfil
Re: [Source] Listar funciones de libreria DLL
« Respuesta #4 en: 05 Julio 2008, 21:58 »

Exlente code  ;).
En línea

[ìmg]http://img523.imageshack.us/img523/4146/dibujozx1.png [/img]
Yibam

Desconectado Desconectado

Mensajes: 39


Ver Perfil
Re: [Source] Listar funciones de libreria DLL
« Respuesta #5 en: 05 Julio 2008, 22:40 »

Muy útil Ferchu, si a eso le añades encontrar "dinámicamente" desde donde está cargada la kernel32.dll podemos usar cualquier api en un virus por ejemplo sin que dependa del pc. Tengo por ahí un código muy guarro, pero bueno si alguien lo quiere lo subo ;)

Salu2, buen code

Perdona pero no entiendo muy bien lo que quieres decir ...

Podrias explicarlo y si a mi me gustaria ver ese codigo..

Muchas graciaas por todo.
En línea
E0N
Lab &
Colaborador

Desconectado Desconectado

Mensajes: 2.591


Por variar un poco de avatar.. :P


Ver Perfil WWW
Re: [Source] Listar funciones de libreria DLL
« Respuesta #6 en: 06 Julio 2008, 13:50 »

Aquí lo tienes, está en asm:

Código
; ************************************************************************************
; ***  Código que muestra un MessageBox obteniendo la dirección de todas las apis  ***
; ***  así como de las variables independientemente del lugar de memoria donde lo  ***
; ***  carguemos o del archivo en el que esté alojado :P                           ***
; ***                                                                      by E0N  ***
; ************************************************************************************
 
include 'C:\archivos de programa\fasm\include\win32ax.inc'
entry main
 
 
proc main
 locals
    mzKernel         dd ?  ; Desde donde esta cargada la kernel32.dll en memoria
    miGetProcAddres  dd ?  ; Api GetProcAddress
    miLoadLibrary    dd ?
    mzUser dd ?
 endl
 
       ; Obtenemos la direccin de LoadLibrary y GetProcAddress
       stdcall DirApis, dword[ebp+4]
       mov [mzKernel], eax
       mov [miGetProcAddres], ebx
 
       ; Mostramos un mensaje (para probar)
       invoke miGetProcAddres, [mzKernel], 'LoadLibraryA'
       mov [miLoadLibrary], eax
       invoke miLoadLibrary, 'user32.dll'
       mov [mzUser], eax
       invoke miGetProcAddres, [mzUser], 'MessageBoxA'
       stdcall eax, 0,0,0,0
 
       ret
endp
 
 
 
 
 
; ***************************************************************************************
; ***  Funcion que devuelve en eax la direccion de la kernell32.dll en memoria
; ***  y en ebx la direccion del api GetProcAddres.
; ***************************************************************************************
proc DirApis, originalEBP
 locals
    mzKernel dd ?  ; Direccion desde donde esta cargada la kernel32.dll (MZ)
    peKernel dd ?  ; Pe signature de kernel32.dll
    etKernel dd ?  ; Direccin de la export table de kernel32.dll
    anKernel dd ?  ; El AddressOfNames de la kernel32.dll
    dirGPA   dd ?  ; Direccion de GetProcAddres
 endl
 
       ; Obtenemos el dos siganute y el pe siganature de la kernel32.dll
       ;mov esi, dword[esp]
       mov esi, [originalEBP]
       and esi, 0xFFFF0000
       DIR_KERNEL:
               sub esi, 0x1000
               cmp word[esi], 'MZ'
       jne DIR_KERNEL
       mov [mzKernel], esi
       mov eax, esi
       add esi, dword[eax+0x3C]
       mov [peKernel], esi
 
       ; Obtenemos la direccion del Export Table (eax=MZ, esi=PE)
       add esi, 0x78
       add eax, dword[esi]
       mov [etKernel], eax
 
       ; Obtenemos el puntero al primer RVA de los nombres de las apis (eax=ExporTable)
       mov ebx, [mzKernel]
       add ebx, dword[eax+0x20] ; AddressOfNames
       mov [anKernel], ebx
 
       ; Localizamos GetProcAddress
       mov edi, [anKernel]
       xor ecx, ecx
 
       DIR_GPA:
               mov ebx, [mzKernel]
               add ebx, dword[edi]
               cmp dword[ebx], 'GetP'
               je PUEDE_SER
       NO_ES:
               add edi, 4
               inc ecx
               jmp DIR_GPA
       PUEDE_SER:
               cmp dword[ebx+4]  , 'rocA'
               jne NO_ES
               cmp dword[ebx+8], 'ddre'
       mov edi, ecx
 
       ; Obtenemos el ordinal de GetProcAddress
       mov eax, [etKernel]
       mov ebx, [mzKernel]
       add eax, 0x24 ; AddressOfOrdinals
       add ebx, dword[eax]
       rol ecx, 1 ; ecx*2
       add ebx, ecx
 
       ; Obtenemos la dirección de GetProcAdress
       xor ecx, ecx
       movzx ecx, word[ebx]
       rol ecx, 2 ; ecx*4
       mov eax, [etKernel]
       mov ebx, [mzKernel]
       add eax, 0x1C ; AddressOfFunctions
       add ebx, dword[eax]
       add ebx, ecx ; ebx = Puntero a la dirección de GetProcAddress
       mov eax, dword[ebx]
       add eax, [mzKernel]
       mov [dirGPA], eax
 
       ; Devolvemos los valores
       mov eax, [mzKernel]
       mov ebx, [dirGPA]
       ret
endp
 
« Última modificación: 10 Julio 2008, 13:18 por E0N » En línea
Páginas: [1] Ir Arriba Imprimir 
Ir a:  





Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.5 | SMF © 2006-2008, Simple Machines LLC