PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] Custom GetProcAddress



G36KV
24.10.2010, 21:29
Sollte selbst erklärend sein... funktioniert genauso wie die Windows API


/************************************************** **********************/
/* Custom GetProcAddress function, x86 and x64 compatible */
/************************************************** **********************/
DWORD customGetProcAddress(HMODULE hModule, const char *lpProcName)
{
PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule;
PIMAGE_NT_HEADERS pNtHeader = 0;
PIMAGE_EXPORT_DIRECTORY pExportDir = 0;
DWORD i;
DWORD ordinal;
DWORD * addressOfFunctionsArray;
DWORD * addressOfNamesArray;
WORD * addressOfNameOrdinalsArray;
char * functionName;

if (!lpProcName)
return 0;

if (!pDosHeader || pDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
return 0;

pNtHeader = (PIMAGE_NT_HEADERS)((DWORD)hModule + (DWORD)pDosHeader->e_lfanew);

if (pNtHeader->Signature != IMAGE_NT_SIGNATURE)
return 0;

pExportDir = (PIMAGE_EXPORT_DIRECTORY)((DWORD)hModule + (DWORD)pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);

addressOfFunctionsArray = (DWORD *)((DWORD)pExportDir->AddressOfFunctions + (DWORD)hModule);
addressOfNamesArray = (DWORD *)((DWORD)pExportDir->AddressOfNames + (DWORD)hModule);
addressOfNameOrdinalsArray = (WORD *)((DWORD)pExportDir->AddressOfNameOrdinals + (DWORD)hModule);


if (IsBadReadPtr(lpProcName,sizeof(char)))
{
//by ordinal
ordinal = (DWORD)lpProcName - (DWORD)pExportDir->Base;

if (ordinal > pExportDir->NumberOfFunctions)
{
return 0;
}
else
{
return ((DWORD)hModule + addressOfFunctionsArray[ordinal]);
}
}
else
{
//by function name
for (i = 0; i < pExportDir->NumberOfNames; i++)
{
functionName = (char*)(addressOfNamesArray[i] + (DWORD)hModule);

if (_stricmp(lpProcName,functionName) == 0) //case insensitive
{
return ((DWORD)hModule + addressOfFunctionsArray[addressOfNameOrdinalsArray[i]]);
}
}
return 0;
}
}

l0dsb
24.10.2010, 22:02
Kleine Anregung: Du könntest noch Forwarding unterstützen (Bedingung: RVA innerhalb des Data Directories, Angabe des Forwardings über "Dll.Function"), bei großer Langeweile auch Hashing.

G36KV
24.10.2010, 22:33
jo danke für das Feedback, hab aber wohl sowieso keine Verwendung für diese Funktion... entstand eher aus langeweile und in dem Glauben ich könnte sie doch noch irgendwie brauchen :o Für die meisten FH'ler ist die Funktion eh schon viel zu gut bzw. wer den Ordinal Part löscht spart sich ne API :confused:

Haste nicht Lust bei dem Projekt mitzumachen? http://free-hack.com/konzepte-vorstellungs-und-testbereich/67404-neues-reversing-unpacking-tool.html
*Schleichwerbung* :D