Sources.RU Magazine Поиск по журналу
 

TopList

Функции DLL

Автор: x2er0

Часто появляется необходимость выяснить - какие функции экспортирует та или иная DLL. Вы скажете, что легко это сделать с помощью различных утилит, например: DumpBin или Dependency Walker ... Верно, но давайте попробуем сделать что-нибудь свое! Для этого нам необходимы кое-какие знания о PE-файлах. Но об этом в данной статье речь не пойдет, возможно, я напишу это как-нибудь в другой раз, а сейчас просто покажу пример того, как это можно сделать.

{$A+,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1}
{$MINSTACKSIZE $00004000}
{$MAXSTACKSIZE $00100000}
{$IMAGEBASE $00400000}
{$APPTYPE CONSOLE}
program pr;
  uses
  Windows,
  Dialogs,
  SysUtils;

Var
  ImageBase : DWord;
  DosHeader : PImageDosHeader;
  PeHeader  : PImageNtHeaders;
  PExport   : PImageExportDirectory;
  cmdline   : String;
  pname     : PDWord;
  name      : PChar;
  i         : Integer;

Procedure FatalOsError;
begin
  ShowMessage(SysErrorMessage(GetLastError( )));
  Abort;
end;


begin
  try
    If (ParamCount( ) < 1) Then
      Abort
    Else
      cmdline := ParamStr(1);

    ImageBase := GetModuleHandle(PChar(cmdline));
    If (ImageBase = 0) Then
    Begin
       ImageBase := LoadLibrary(PChar(cmdline));
       If (ImageBase = 0) Then FatalOsError;
    End;

    try
      DosHeader := PImageDosHeader(ImageBase);
      If (DosHeader^.e_magic <> IMAGE_DOS_SIGNATURE) Then
          FatalOsError;

      PEHeader := PImageNtHeaders(DWord(ImageBase) + DWord(DosHeader^._lfanew));
      If (PEHeader^.Signature <> IMAGE_NT_SIGNATURE) Then
          FatalOsError;

      PExport := PImageExportDirectory(ImageBase +
 DWord(PEHeader^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress));
      pname   := PDWord(ImageBase + DWord(PExport^.AddressOfNames));

      For i := 0 To PExport^.NumberOfNames - 1 Do begin
        name := PChar(PDWord(DWord(ImageBase)  + PDword(pname)^));
        WriteLn(name);
        inc(pname);
      end;
    finally
      FreeLibrary(ImageBase);
    end;
  except
    Abort;
  end;
end.

Чтобы запустить программу, надо в качестве первого параметра командной строки передать имя DLL файла. В итоге в консоль выведутся имена функций.

Дополнения:

Таблицу экспорта можно найти с помощью функции function ImageDirectoryEntryToData(Base: Pointer; MappedAsImage: ByteBool; DirectoryEntry: Word; var Size: ULONG): Pointer; stdcall; external 'imagehlp.dll';

Для примера давайте рассмотрим результат работы данной программы на примере библиотеки - imagehlp.dll.

Запускаем с перенаправлением в файл:

pr imagehlp.dll > log_imagehlp.txt

В итоге получаем файл следующего содержания:

BindImage
BindImageEx
CheckSumMappedFile
EnumerateLoadedModules
EnumerateLoadedModules64
FindDebugInfoFile
FindDebugInfoFileEx
FindExecutableImage
FindExecutableImageEx
FindFileInPath
FindFileInSearchPath
GetImageConfigInformation
GetImageUnusedHeaderBytes
GetTimestampForLoadedLibrary
ImageAddCertificate
ImageDirectoryEntryToData
ImageDirectoryEntryToDataEx
ImageEnumerateCertificates
ImageGetCertificateData
ImageGetCertificateHeader
ImageGetDigestStream
ImageLoad
ImageNtHeader
ImageRemoveCertificate
ImageRvaToSection
ImageRvaToVa
ImageUnload
ImagehlpApiVersion
ImagehlpApiVersionEx
MakeSureDirectoryPathExists
MapAndLoad
MapDebugInformation
MapFileAndCheckSumA
MapFileAndCheckSumW
ReBaseImage
ReBaseImage64
RemovePrivateCvSymbolic
RemovePrivateCvSymbolicEx
RemoveRelocations
SearchTreeForFile
SetImageConfigInformation
SplitSymbols
StackWalk
StackWalk64
SymCleanup
SymEnumSourceFiles
SymEnumSym
SymEnumSymbols
SymEnumTypes
SymEnumerateModules
SymEnumerateModules64
SymEnumerateSymbols
SymEnumerateSymbols64
SymEnumerateSymbolsW
SymEnumerateSymbolsW64
SymFindFileInPath
SymFromAddr
SymFromName
SymFunctionTableAccess
SymFunctionTableAccess64
SymGetLineFromAddr
SymGetLineFromAddr64
SymGetLineFromName
SymGetLineFromName64
SymGetLineNext
SymGetLineNext64
SymGetLinePrev
SymGetLinePrev64
SymGetModuleBase
SymGetModuleBase64
SymGetModuleInfo
SymGetModuleInfo64
SymGetModuleInfoW
SymGetModuleInfoW64
SymGetOptions
SymGetSearchPath
SymGetSymFromAddr
SymGetSymFromAddr64
SymGetSymFromName
SymGetSymFromName64
SymGetSymNext
SymGetSymNext64
SymGetSymPrev
SymGetSymPrev64
SymGetTypeFromName
SymGetTypeInfo
SymInitialize
SymLoadModule
SymLoadModule64
SymMatchFileName
SymMatchString
SymRegisterCallback
SymRegisterCallback64
SymRegisterFunctionEntryCallback
SymRegisterFunctionEntryCallback64
SymSetContext
SymSetOptions
SymSetSearchPath
SymUnDName
SymUnDName64
SymUnloadModule
SymUnloadModule64
TouchFileTimes
UnDecorateSymbolName
UnMapAndLoad
UnmapDebugInformation
UpdateDebugInfoFile
UpdateDebugInfoFileEx

На этом все.

Удачи!



 Design by Шишкин Алексей (Лёха)  ©2004-2008 by sources.ru