{
Visit the author's page at [url]http://assarbad.net[/url]
Author : -=Assarbad=-
License: no warranties, no restrictions, PUBLIC DOMAIN
}
program listforwarders;
{$APPTYPE CONSOLE}
uses
Windows,
ImageHlp;
type
TWordArr =
array[0..0]
of Word;
PWordArr = ^TWordArr;
TDWordArr =
array[0..0]
of DWORD;
PDWordArr = ^TDWordArr;
procedure ShowForwarders(filename:
string);
var
li: LoadedImage;
dwEntry,
dwExportsRVA_end,
dwExportsRVA,
dwExportsSize: DWORD;
lpHeader: PImageSectionHeader;
lpExportDir: PImageExportDirectory;
lpFuncs: PDWORD;
pwOrdinals: PWordArr;
lpFuncNames: PDWordArr;
szTemp, szTemp1, szTemp2: PChar;
i, j: Integer;
begin
if MapAndLoad(@filename[1],
nil, @li, False, True)
then
try
if (li.Characteristics
and IMAGE_FILE_DLL <> 0)
and not (li.fSystemImage)
then
try
dwExportsRVA := li.FileHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
dwExportsSize := li.FileHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
dwExportsRVA_end := dwExportsRVA + dwExportsSize;
lpExportDir := ImageRvaToVa(li.FileHeader, li.MappedAddress, dwExportsRVA, lpHeader);
szTemp1 := ImageRvaToVa(li.FileHeader, li.MappedAddress, lpExportDir^.
Name, lpHeader);
lpFuncs := ImageRvaToVa(li.FileHeader, li.MappedAddress, DWORD(lpExportDir^.AddressOfFunctions), lpHeader);
pwOrdinals := ImageRvaToVa(li.FileHeader, li.MappedAddress, DWORD(lpExportDir^.AddressOfNameOrdinals), lpHeader);
lpFuncNames := ImageRvaToVa(li.FileHeader, li.MappedAddress, DWORD(lpExportDir^.AddressOfNames), lpHeader);
for i := 0
to lpExportDir^.NumberOfFunctions - 1
do
begin
dwEntry := PDWORD(lpfuncs)^;
if dwEntry = 0
then
continue;
if (dwEntry >= dwExportsRVA)
and (dwEntry <= dwExportsRVA_end)
then
begin
szTemp := ImageRvaToVa(li.FileHeader, li.MappedAddress, dwEntry, lpHeader);
for j := 0
to lpExportDir^.NumberOfNames - 1
do
if pwOrdinals[j] = i
then
begin
szTemp2 := ImageRvaToVa(li.FileHeader, li.MappedAddress, lpFuncNames^[j], lpHeader);
Write('
[',
string(szTemp1),'
]',
string(szTemp2));
end;
Writeln('
-> ',
string(szTemp));
end;
inc(lpFuncs);
end;
finally
end;
finally
UnMapAndLoad(@li);
end;
end;
begin
if paramstr(1)<>'
'
then
ShowForwarders(paramstr(1));
end.