Карта сайтаСсылкиКонтакты

Как получить список функций, экспортируемых модулем DLL

PDF Печать
Статьи

Чтобы получить список функций, экспортируемых DLL модулем, Вы должны использовать следующие функции:

MapAndLoad в imagehlp.pas.

ImageRvaToVa в imagehlp.pas.

Также Вы должны определить следующие структуры:


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; //Имя модуля
  hFile: thandle; //Дескриптор файла
  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;

Более подробно об этих структурах, смотри на http://www.csn.ul.ie/~caolan/publink/winresdump/winresdump/doc/msdn_peeringpe.html

Сам код:


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.

 

Добавить комментарий


Защитный код
Обновить