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; |