#include "stdafx.h"
#include <Windows.h>
int
main(
int
argc,
char
*argv[])
{
HANDLE
hFile = CreateFile(
argv[1],
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
DWORD
dwFileSize = GetFileSize(hFile, NULL);
HANDLE
hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE | SEC_IMAGE, 0, dwFileSize, NULL);
if
(hMap == NULL)
{
CloseHandle(hFile);
return
-1;
}
DWORD
dwImageBase = (
DWORD
)MapViewOfFile(hMap, FILE_MAP_READ | FILE_MAP_WRITE, NULL, NULL, dwFileSize);
if
(dwImageBase==NULL)
{
CloseHandle(hFile);
CloseHandle(hMap);
return
-1;
}
PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)dwImageBase;
PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)(dwImageBase + pDosHeader->e_lfanew);
PIMAGE_EXPORT_DIRECTORY pExportDir = (PIMAGE_EXPORT_DIRECTORY)(dwImageBase + \
pNtHeader->OptionalHeader.DataDirectory[0].VirtualAddress);
int
nFuncNum = pExportDir->NumberOfFunctions;
int
nBase = pExportDir->Base;
int
iNameOrdinalsIndex = -1;
WORD
*pNameOrdinalsTable = (
WORD
*)(dwImageBase + pExportDir->AddressOfNameOrdinals);
DWORD
*pNameAddress = (
DWORD
*)(pExportDir->AddressOfNames + dwImageBase);
DWORD
*pRVAFunc = (
DWORD
*)(pExportDir->AddressOfFunctions + dwImageBase);
printf
(
"----------------Export Table Start---------------------\n"
);
printf
(
"\n"
);
printf
(
"DllName: %s\n"
, dwImageBase + pExportDir->Name);
for
(
int
i = 0; i < nFuncNum; i++)
{
BOOL
bFind = FALSE;
for
(
int
j = 0; j < (
int
)pExportDir->NumberOfNames; j++)
{
int
iIndex = pNameOrdinalsTable[j] + nBase;
if
(iIndex == i + nBase)
{
iNameOrdinalsIndex++;
bFind = TRUE;
break
;
}
}
if
(bFind)
{
printf
(
"序号:%4d\t"
, i+nBase);
printf
(
"RVA: 0x%08X\t"
, pRVAFunc);
printf
(
"FuncName: %s\n"
, pNameAddress[iNameOrdinalsIndex] + dwImageBase);
}
else
if
(pRVAFunc)
{
printf
(
"序号:%4d\t"
, i+nBase);
printf
(
"RVA: 0x%08X\t"
, pRVAFunc);
printf
(
"FuncName: --\n"
);
}
}
puts
(
""
);
printf
(
"----------------Export Table End---------------------\n"
);
CloseHandle(hFile);
CloseHandle(hMap);
UnmapViewOfFile((
LPVOID
)dwImageBase);
return
0;
}