DLL - pegar funcoes de uma dll

Top  Previous  Next

How to get the list of functions exported by a Dll module. 

==========================================================

Answer:

 

To get the list of functions exported by a Dll module you need to use the following functions. 

 

MapAndLoad function in 'imagehlp.pas'. 

ImageRvaToVa function in 'imagehlp.pas'. 

 

You also need to define the following structures. 

To find details about what the members of these structures mean visit the web page 'http://www.csn.ul.ie/~caolan/publink/winresdump/winresdump/doc/msdn_peeringpe.html' 

 

const 

IMAGE_SIZEOF_SHORT_NAME            = 8; 

IMAGE_NUMBEROF_DIRECTORY_ENTRIES   = 16; 

 

  IMAGE_DATA_DIRECTORY = packed record 

    VirtualAddress  : DWORD; 

    Size            : DWORD; 

  PIMAGE_DATA_DIRECTORY = ^IMAGE_DATA_DIRECTORY; 

 

IMAGE_SECTION_HEADER = packed record 

    Name     : packed array [0..IMAGE_SIZEOF_SHORT_NAME-1] of Char; 

    PhysicalAddress : DWORD; // or VirtualSize (union); 

    VirtualAddress  : DWORD; 

    SizeOfRawData   : DWORD; 

    PointerToRawData : DWORD; 

    PointerToRelocations : DWORD; 

    PointerToLinenumbers : DWORD; 

    NumberOfRelocations : WORD; 

    NumberOfLinenumbers : WORD; 

    Characteristics : DWORD; 

  end; 

  PIMAGE_SECTION_HEADER = ^IMAGE_SECTION_HEADER; 

 

  IMAGE_OPTIONAL_HEADER = packed record 

   { Standard fields. } 

    Magic           : WORD; 

    MajorLinkerVersion : Byte; 

    MinorLinkerVersion : Byte; 

    SizeOfCode      : DWORD; 

    SizeOfInitializedData : DWORD; 

    SizeOfUninitializedData : DWORD; 

    AddressOfEntryPoint : DWORD; 

    BaseOfCode      : DWORD; 

    BaseOfData      : DWORD; 

   { NT additional fields. } 

    ImageBase       : DWORD; 

    SectionAlignment : DWORD; 

    FileAlignment   : DWORD; 

    MajorOperatingSystemVersion : WORD; 

    MinorOperatingSystemVersion : WORD; 

    MajorImageVersion : WORD; 

    MinorImageVersion : WORD; 

    MajorSubsystemVersion : WORD; 

    MinorSubsystemVersion : WORD; 

    Reserved1       : DWORD; 

    SizeOfImage     : DWORD; 

    SizeOfHeaders   : DWORD; 

    CheckSum        : DWORD; 

    Subsystem       : WORD; 

    DllCharacteristics : WORD; 

    SizeOfStackReserve : DWORD; 

    SizeOfStackCommit : DWORD; 

    SizeOfHeapReserve : DWORD; 

    SizeOfHeapCommit : DWORD; 

    LoaderFlags     : DWORD; 

    NumberOfRvaAndSizes : DWORD; 

    DataDirectory: packed array[0..IMAGE_NUMBEROF_DIRECTORY_ENTRIES-1]                                            of IMAGE_DATA_DIRECTORY; 

  end; 

  PIMAGE_OPTIONAL_HEADER = ^IMAGE_OPTIONAL_HEADER; 

 

IMAGE_FILE_HEADER = packed record 

    Machine              : WORD; 

    NumberOfSections     : WORD; 

    TimeDateStamp        : DWORD; 

    PointerToSymbolTable : DWORD; 

    NumberOfSymbols      : DWORD; 

    SizeOfOptionalHeader : WORD; 

    Characteristics      : WORD; 

  end; 

  PIMAGE_FILE_HEADER = ^IMAGE_FILE_HEADER; 

 

IMAGE_NT_HEADERS = packed record 

  Signature       : DWORD; 

  FileHeader      : IMAGE_FILE_HEADER; 

  OptionalHeader  : IMAGE_OPTIONAL_HEADER; 

end; 

PIMAGE_NT_HEADERS = ^IMAGE_NT_HEADERS; 

 

type LOADED_IMAGE = record 

  ModuleName:pchar;//name of module 

  hFile:thandle;//handle of file 

  MappedAddress:pchar;// the base address of mapped file 

  FileHeader:PIMAGE_NT_HEADERS;//The Header of the file. 

  LastRvaSection:PIMAGE_SECTION_HEADER; 

  NumberOfSections:integer; 

  Sections:PIMAGE_SECTION_HEADER ; 

  Characteristics:integer; 

  fSystemImage:boolean; 

  fDOSImage:boolean; 

  Links:LIST_ENTRY; 

  SizeOfImage:integer; 

end; 

PLOADED_IMAGE= ^LOADED_IMAGE; 

 

here is the code 

 

unit Unit1; 

 

interface 

 

uses 

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 

  StdCtrls, Menus,structures,imagehlp; 

 

type 

  TForm1 = class(TForm) 

    ListBox1: TListBox; 

    MainMenu1: TMainMenu; 

    File1: TMenuItem; 

    Open1: TMenuItem; 

    OpenDialog1: TOpenDialog; 

    ListBox2: TListBox; 

    procedure Open1Click(Sender: TObject); 

  private 

  public 

   procedure DLLFuncstoList(fname:string;alistbox:tlistbox); 

  end; 

 

var 

  Form1: TForm1; 

implementation 

 

{$R *.DFM} 

 

 

procedure TForm1.DLLFuncstoList(fname:string;alistbox:tlistbox); 

var 

  fih:LOADED_IMAGE; 

  pexpdir:PIMAGE_EXPORT_DIRECTORY; 

  pexpnames:pdword;//pointer to list of exported fucntions 

  pt1:PImageSectionHeader; 

  i:integer; 

  exportedfuncname:pchar;//exported function name 

begin 

   alistbox.items.clear; 

   pt1:=nil; 

   MapAndLoad(pchar(fname),pchar('#0'),@fih,true,true);//load the   

                                                 file into memory. 

   pExpDir:=PIMAGE_EXPORT_DIRECTORY(fih.FileHeader.OptionalHeader. 

                                    DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); 

   pExpDir:=PIMAGE_EXPORT_DIRECTORY(ImageRvaToVa 

         (fih.FileHeader,fih.MappedAddress,DWORD(pExpDir),pt1)); 

   pExpNames:= pExpDir.pAddressOfNames; 

   pExpNames:=PDWORD(ImageRvaToVa 

       (fih.FileHeader,fih.MappedAddress,dword(pExpNames),pt1)); 

   pt1:=nil; 

   for i:=0 to pexpdir.NumberOfNames-1 do 

    begin 

     exportedfuncname:=pchar(ImageRvaToVa   

       (fih.FileHeader,fih.MappedAddress,dword(pExpNames^),pt1)); 

     alistbox.items.add(exportedfuncname); 

     inc(pexpnames); 

    end; 

   UnMapAndLoad(@fih);//Un load the mapped file  from memory. 

end; 

 

procedure TForm1.Open1Click(Sender: TObject); 

var 

begin 

if opendialog1.execute = true then 

  begin 

   DLLFuncstoList(opendialog1.filename,listbox1); 

  end; 

end; 

 

end. 

 

 

 

Comments to this article  ----------------------------------------------

 

Avoid General protection faults

===============================

You shold better do something like : 

 

if not MapAndLoad(pchar(fname),pchar('#0'),@fih,true,true) then Exit; 

 

because if the call fails you will get a pretty nice GPF.

 

 

 

missing structure

=================

Your code is not running because you forgot to publish this structure : 

 

IMAGE_EXPORT_DIRECTORY = packed record 

  Characteristics : DWORD; 

  TimeDateStamp   : DWORD; 

  MajorVersion    : WORD; 

  MinorVersion    : WORD; 

  Name : DWORD;             

  Base : DWORD; 

  NumberOfFunctions     : DWORD; 

  NumberOfNames         : DWORD; 

  pAddressOfFunctions   : PDWORD; 

  pAddressOfNames       : PDWORD; 

  pAddressOfNameOrdinals: PWORD; 

end; 

PIMAGE_EXPORT_DIRECTORY = ^IMAGE_EXPORT_DIRECTORY;