全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1484
推到 Plurk!
推到 Facebook!

顯示DLL可導出的函數

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-26 12:32:56 IP:61.221.xxx.xxx 未訂閱
此為轉貼資料 顯示DLL可導出的函數 // ?了測試,你需要在Form上放置一個TButton、TOpenDialog和TListView構件 // 完整的DLLTools單元的代碼在示例代碼之後 uses DLLTools; function TForm1.ListExport( const name: String; ordinal: Integer; address:Pointer ): Boolean; var listentry: TLIstItem; begin Result := true; listentry:= listview.Items.Add; listentry.Caption := Format('%p',[address] ); listentry.Subitems.Add( format('%d',[ordinal] )); listentry.Subitems.Add( name ); end; procedure TForm1.Button1Click(Sender: TObject); begin if opendialog.execute then begin listview.items.clear; ListDLLExports( opendialog.filename, listexport ); end; end; ***** DLLTOOLS 單元 ***** unit dlltools; interface Uses Windows, Classes, Sysutils, imagehlp ; type TDLLExportCallback = function (const name: String; ordinal: Integer; address: Pointer): Boolean of Object; { Note: address is a RVA here, not a usable virtual address! } DLLToolsError = Class( Exception ); Procedure ListDLLExports( const filename: String; callback: TDLLExportCallback ); Procedure DumpExportDirectory( Const ExportDirectory: TImageExportDirectory; lines: TStrings; const Image: LoadedImage ); Function RVAToPchar( rva: DWORD; const Image: LoadedImage ): PChar; Function RVAToPointer( rva: DWORD; const Image: LoadedImage ): Pointer; implementation resourcestring eDLLNotFound = 'ListDLLExports: DLL %s does not exist!'; { ---------------------------------------------------------------------- | Procedure EnumExports | | Parameters : | ExportDirectory: IMAGE_EXPORT_DIRECTORY record to enumerate | image : LOADED_IMAGE record for the DLL the export directory belongs | to. | callback : callback function to hand the found exports to, must not be Nil | Description: | The export directory of a PE image contains three RVAs that point at tables | which describe the exported functions. The first is an array of RVAs that | refer to the exported function names, these we translate to PChars to | get the exported name. The second array is an array of Word that contains | the export ordinal for the matching entry in the names array. The ordinal | is biased, that is we have to add the ExportDirectory.Base value to it to | get the actual export ordinal. The biased ordinal serves as index for the | third array, which is an array of RVAs that give the position of the | function code in the image. We don't translate these RVAs since the DLL | is not relocated since we load it via MapAndLoad. The function array is | usually much larger than the names array, since the ordinals for the | exported functions do not have to be in sequence, there can be (and | frequently are) gaps in the sequence, for which the matching entries in the | function RVA array are garbage. | Error Conditions: none | Created: 9.1.2000 by P. Below ----------------------------------------------------------------------} Procedure EnumExports( const ExportDirectory : TImageExportDirectory ; const image : LoadedImage ; callback : TDLLExportCallback ) ; Type TDWordArray = Array [0..$FFFFF] of DWORD; Var i: Cardinal; pNameRVAs, pFunctionRVas: ^TDWordArray; pOrdinals: ^TWordArray; name: String; address: Pointer; ordinal: Word; Begin { EnumExports } pNameRVAs := RVAToPointer( DWORD(ExportDirectory.AddressOfNames), image ); pFunctionRVAs := RVAToPointer( DWORD(ExportDirectory.AddressOfFunctions), image ); pOrdinals := RVAToPointer( DWORD(ExportDirectory.AddressOfNameOrdinals), image ); For i:= 0 to Pred( ExportDirectory.NumberOfNames ) Do Begin name := RVAToPChar( pNameRVAs^[i], image ); ordinal := pOrdinals^[i]; address := Pointer( pFunctionRVAs^[ ordinal ] ); If not callback( name, ordinal ExportDirectory.Base, address ) Then Exit; End; { For } End; { EnumExports } { ---------------------------------------------------------------------- | Procedure ListDLLExports | | Parameters : | filename : full pathname of DLL to examine | callback : callback to hand the found exports to, must not be Nil | Description: | Loads the passed DLL using the LoadImage function, finds the exported | names table and reads it. Each found entry is handed to the callback | for further processing, until no more entries remain or the callback | returns false. Note that the address passed to the callback for a exported | function is an RVA, so not identical to the address the function would | have in a properly loaded and relocated DLL! | Error Conditions: | Exceptions are raised if | - the passed DLL does not exist or could not be loaded | - no callback was passed (only if assertions are on) | - an API function failed | Created: 9.1.2000 by P. Below ----------------------------------------------------------------------} Procedure ListDLLExports( const filename : String ; callback : TDLLExportCallback ) ; Var imageinfo: LoadedImage; pExportDirectory: PImageExportDirectory; dirsize: Cardinal; Begin { ListDLLExports } Assert( Assigned( callback )); If not FileExists( filename ) Then raise DLLToolsError.CreateFmt( eDLLnotFound, [filename] ); If MapAndLoad( PChar( filename ), nil, @imageinfo, true, true ) Then try pExportDirectory := ImageDirectoryEntryToData( imageinfo.MappedAddress, false, IMAGE_DIRECTORY_ENTRY_EXPORT, dirsize ); If pExportDirectory = Nil Then RaiseLastWin32Error Else EnumExports( pExportDirectory^, imageinfo, callback ); finally UnMapAndLoad( @imageinfo ); end Else RaiseLastWin32Error; End; { ListDLLExports } { ---------------------------------------------------------------------- | Procedure DumpExportDirectory | | Parameters : | ExportDirectory: a IMAGE_EXPORT_DIRECTORY record | lines : a TStrings descendend to put the info into, must not be Nil | Description: | Dumps the fields of the passed structure to the passed strings descendent | as strings. | Error Conditions: | will raise an exception if lines is Nil and assertions are enabled. | Created: 9.1.2000 by P. Below ----------------------------------------------------------------------} Procedure DumpExportDirectory( Const ExportDirectory : TImageExportDirectory; lines : TStrings; const Image: LoadedImage ) ; Begin { DumpExportDirectory } Assert( Assigned( lines )); lines.add( 'Dump of IMAGE_EXPORT_DIRECTORY' ); lines.add( format('Characteristics: %d', [ExportDirectory.Characteristics])); lines.add( format('TimeDateStamp: %d', [ExportDirectory.TimeDateStamp])); lines.add( format('Version: %d.%d', [ExportDirectory.MajorVersion, ExportDirectory.MinorVersion])); lines.add( format('Name (RVA): %x', [ExportDirectory.Name])); lines.add( format('Name (translated): %s', [RVAToPchar( ExportDirectory.name, Image )])); lines.add( format('Base: %d', [ExportDirectory.Base])); lines.add( format('NumberOfFunctions: %d', [ExportDirectory.NumberOfFunctions])); lines.add( format('NumberOfNames: %d', [ExportDirectory.NumberOfNames])); lines.add( format('AddressOfFunctions (RVA): %p', [Pointer(ExportDirectory.AddressOfFunctions)])); lines.add( format('AddressOfNames (RVA): %p', [Pointer(ExportDirectory.AddressOfNames)])); lines.add( format('AddressOfNameOrdinals (RVA): %p', [Pointer(ExportDirectory.AddressOfNameOrdinals)])); End; { DumpExportDirectory } { ---------------------------------------------------------------------- | Function RVAToPointer | | Parameters : | rva : a relative virtual address to translate | Image : LOADED_IMAGE structure for the image the RVA relates to | Returns : translated address | Description: | Uses the ImageRVAToVA function to translate the RVA to a virtual | address. | Error Conditions: | Will raise an exception if the translation failed | Created: 9.1.2000 by P. Below ----------------------------------------------------------------------} Function RVAToPointer( rva : DWORD ; const Image : LoadedImage ) : Pointer; var pDummy: PImageSectionHeader; Begin { RVAToPchar } pDummy := nil; Result := ImageRvaToVa( Image.FileHeader, Image.MappedAddress, rva, pDummy ); If Result = Nil Then RaiseLastWin32Error; End; { RVAToPointer } { ---------------------------------------------------------------------- | Function RVAToPchar | | Parameters : | rva : a relative virtual address to translate | Image : LOADED_IMAGE structure for the image the RVA relates to | Returns : translated address | Description: | Uses the RVAToPointer function to translate the RVA to a virtual | address. Note that we do not check that the address does indeed point | to a zero-terminated string! | Error Conditions: | Will raise an exception if the translation failed | Created: 9.1.2000 by P. Below ----------------------------------------------------------------------} Function RVAToPchar( rva : DWORD ; const Image : LoadedImage ) : PChar ; Begin { RVAToPchar } Result := RVAToPointer( rva, image ); End; { RVAToPchar } end.
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-04-27 22:56:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!