Delphi 如何在DLL中获取所有导出的函数?
如何以编程方式从DLL获取所有导出的函数?我正在尝试比较导出函数的两个DLL。这是我使用的代码:Delphi 如何在DLL中获取所有导出的函数?,delphi,delphi-xe7,Delphi,Delphi Xe7,如何以编程方式从DLL获取所有导出的函数?我正在尝试比较导出函数的两个DLL。这是我使用的代码: uses System.Classes, Winapi.Windows; type PIMAGE_NT_HEADERS = ^IMAGE_NT_HEADERS; PIMAGE_EXPORT_DIRECTORY = ^IMAGE_EXPORT_DIRECTORY; function ImageNtHeader(Base: Pointer): PIMAGE_NT_HEADERS; std
uses
System.Classes, Winapi.Windows;
type
PIMAGE_NT_HEADERS = ^IMAGE_NT_HEADERS;
PIMAGE_EXPORT_DIRECTORY = ^IMAGE_EXPORT_DIRECTORY;
function ImageNtHeader(Base: Pointer): PIMAGE_NT_HEADERS; stdcall; external 'dbghelp.dll';
function ImageRvaToVa(NtHeaders: Pointer; Base: Pointer; Rva: ULONG; LastRvaSection: Pointer): Pointer; stdcall; external 'dbghelp.dll';
procedure EnumerateImageExportedFunctionNames(const ImageName: string; NamesList: TStrings);
var
i: Integer;
FileHandle: THandle;
ImageHandle: THandle;
ImagePointer: Pointer;
Header: PIMAGE_NT_HEADERS;
ExportTable: PIMAGE_EXPORT_DIRECTORY;
NamesPointer: Pointer;
NamesPtr: PCardinal;
NamePtr: PAnsiChar;
begin
//NOTE: our policy in this procedure is to exit upon any failure and return and empty list
NamesList.Clear;
FileHandle := CreateFile(
PChar(ImageName),
GENERIC_READ,
FILE_SHARE_READ,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0
);
if FileHandle=INVALID_HANDLE_VALUE then begin
exit;
end;
Try
ImageHandle := CreateFileMapping(FileHandle, nil, PAGE_READONLY, 0, 0, nil);
if ImageHandle=0 then begin
exit;
end;
Try
ImagePointer := MapViewOfFile(ImageHandle, FILE_MAP_READ, 0, 0, 0);
if not Assigned(ImagePointer) then begin
exit;
end;
Try
Header := ImageNtHeader(ImagePointer);
if not Assigned(Header) then begin
exit;
end;
if Header.Signature<>$00004550 then begin // "PE\0\0" as a DWORD.
exit;
end;
ExportTable := ImageRvaToVa(Header, ImagePointer, Header.OptionalHeader.DataDirectory[0].VirtualAddress, nil);
if not Assigned(ExportTable) then begin
exit;
end;
NamesPtr := ImageRvaToVa(Header, ImagePointer, Cardinal(ExportTable.AddressOfNames), nil);
if not Assigned(NamesPtr) then begin
exit;
end;
for i := 0 to ExportTable.NumberOfNames-1 do begin
NamePtr := ImageRvaToVa(Header, ImagePointer, NamesPtr^, nil);
if not Assigned(NamePtr) then begin
exit;
end;
NamesList.Add(NamePtr);
inc(NamesPtr);
end;
Finally
UnmapViewOfFile(ImagePointer); // Ignore error as there is not much we could do.
End;
Finally
CloseHandle(ImageHandle);
End;
Finally
CloseHandle(FileHandle);
End;
end;
使用
类,Winapi.Windows;
类型
PIMAGE\u NT\u头文件=^IMAGE\u NT\u头文件;
PIMAGE_EXPORT_DIRECTORY=^IMAGE_EXPORT_DIRECTORY;
函数ImageNtHeader(基:指针):PIMAGE\u NT\u头;stdcall;外部“dbghelp.dll”;
函数ImageRvaToVa(n头:指针;基:指针;Rva:ULONG;lastRVA节:指针):指针;stdcall;外部“dbghelp.dll”;
过程EnumerateImageExportedFunctionNames(常量ImageName:string;名称列表:tString);
变量
i:整数;
文件句柄:THandle;
图像句柄:THandle;
ImagePointer:指针;
标题:PIMAGE\u NT\u标题;
ExportTable:PIMAGE\u EXPORT\u目录;
名称指针:指针;
名称:PCardinal;
姓名:潘斯卡尔;
开始
//注意:本程序中的策略是在出现任何故障时退出,并返回空列表
名称列表。清除;
FileHandle:=CreateFile(
PChar(图像名称),
泛读,
文件共享读取,
无
开放式,
文件\u属性\u正常,
0
);
如果FileHandle=无效的\u HANDLE\u值,则开始
出口
结束;
尝试
ImageHandle:=CreateFileMapping(FileHandle,nil,PAGE_READONLY,0,0,nil);
如果ImageHandle=0,则开始
出口
结束;
尝试
ImagePointer:=MapViewOfFile(ImageHandle,文件\映射\读取,0,0,0);
如果未分配(ImagePointer),则开始
出口
结束;
尝试
标头:=ImageNtHeader(ImagePointer);
如果未分配(标题),则开始
出口
结束;
如果Header.Signature$00004550,则以DWORD开头//“PE\0\0”。
出口
结束;
ExportTable:=ImageRvaToVa(头,ImagePointer,头.OptionalHeader.DataDirectory[0].VirtualAddress,无);
如果未分配(ExportTable),则开始
出口
结束;
NamesPtr:=ImageRvaToVa(头,ImagePointer,基数(ExportTable.AddressOfNames),nil);
如果未分配(名称PTR),则开始
出口
结束;
对于i:=0的ExportTable.NumberOfNames-1不开始
NamePtr:=ImageRvaToVa(头,ImagePointer,NamePtr^,nil);
如果未分配(名称PTR),则开始
出口
结束;
NamesList.Add(NamePtr);
股份有限公司;
结束;
最后
取消设置文件(图像指针);//忽略错误,因为我们无能为力。
结束;
最后
闭合手柄(图像手柄);
结束;
最后
CloseHandle(FileHandle);
结束;
结束;
我来这里是想找到一种方法,列出ocx(基本上是一个dll)中包含的所有函数。这里的所有信息都没有告诉我我在找什么。但是后来我从nirsoft()找到了免费的dllexp.exe
直接下载链接:它完美地显示了dll/ocx的所有导出功能,并且非常方便用户。@DavidHeffernan当然是以编程方式。如果您需要在控制台中执行此操作:
tdump.exe YourDLL.dll
,然后在WinMerge
或任何其他文本比较工具中进行比较,您可以在中查看代码GExperts PE Information Expert,它显示所有标题以及dll的导入和导出。