Список функций, экспортируемых модулем DLL
Также Вы должны определить следующие структуры:
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;
Сам код:
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.
Комментарии