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
(ƒ) 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!!










Autor



En línea






