May be useful for people coding their own memory mapper.
Main.cpp
credits: [Only registered and activated users can see links. Click Here To Register...]
Main.cpp
Code:
#include <Windows.h>
#include <iostream>
#include <string>
DWORD GetExport( const char *dllName, const char *functionName )
{
PIMAGE_DOS_HEADER pIDH;
PIMAGE_NT_HEADERS pINH;
PIMAGE_EXPORT_DIRECTORY pIED;
HMODULE hModule;
DWORD *AddressTable, *NameTable;
WORD *NameOrdinalTable;
hModule = GetModuleHandle( dllName );
if ( !hModule )
hModule = LoadLibrary( dllName );
pIDH = reinterpret_cast< PIMAGE_DOS_HEADER >( hModule );
if ( pIDH->e_magic != IMAGE_DOS_SIGNATURE )
{
MessageBox( NULL, "Corrupted PE. [\"invalid dos header\"]", "Error", 0 );
return NULL;
}
pINH = reinterpret_cast< PIMAGE_NT_HEADERS >( reinterpret_cast< DWORD >( hModule ) + pIDH->e_lfanew );
if ( pINH->Signature != IMAGE_NT_SIGNATURE )
{
MessageBox( NULL, "Corrupted PE. [\"invalid pe header\"]", "Error", 0 );
return NULL;
}
if(!pINH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress)
{
MessageBox( NULL, "Export directory RVA is NULL", "Error", 0 );
return NULL;
}
pIED = reinterpret_cast< PIMAGE_EXPORT_DIRECTORY >( reinterpret_cast< DWORD >( hModule ) + pINH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress );
AddressTable = reinterpret_cast< DWORD* >( reinterpret_cast< DWORD >( hModule ) + pIED->AddressOfFunctions );
NameTable = reinterpret_cast< DWORD* >( reinterpret_cast< DWORD >( hModule ) + pIED->AddressOfNames );
NameOrdinalTable = reinterpret_cast< WORD* >( reinterpret_cast< DWORD >( hModule ) + pIED->AddressOfNameOrdinals );
for ( auto i = 0; i < pIED->NumberOfNames; ++i )
{
if ( !stricmp( functionName, reinterpret_cast< const char* >( reinterpret_cast< DWORD >( hModule ) + NameTable[i] ) ) )
return ( DWORD )( reinterpret_cast< DWORD >( hModule ) + AddressTable[NameOrdinalTable[i]] );
}
}
int main( )
{
SetConsoleTitle( "Export Parser [Cyrex']" );
std::string szExport, szDll;
DWORD dwExport = NULL;
bool bInsensitive = false;
while ( true )
{
std::cout << "Export: ";
std::cin >> szExport;
std::cout << "DLL: ";
std::cin >> szDll;
std::cout << "Function Address: " << std::hex << GetExport( szDll.c_str( ), szExport.c_str( ) ) << "\n\n";
}
std::cin.get( );
return 0;
}
credits: [Only registered and activated users can see links. Click Here To Register...]