Ergebnis 1 bis 3 von 3
  1. #1
    NoClose Wurm
    Registriert seit
    21.03.2008
    Beiträge
    196

    Standard [C] Custom GetProcAddress

    Sollte selbst erklärend sein... funktioniert genauso wie die Windows API

    Code:
    /************************************************************************/
    /* 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;
    	}
    }

  2. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    blackberry (24.10.2010), l0dsb (24.10.2010), luxury11 (27.10.2010), SUCHTI (30.10.2010)

  3. #2
    I'm in ur VM. Avatar von l0dsb
    Registriert seit
    23.07.2007
    Beiträge
    1.038

    Standard

    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.
    I can haz RCE?

  4. #3
    NoClose Wurm
    Registriert seit
    21.03.2008
    Beiträge
    196

    Standard

    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

    Haste nicht Lust bei dem Projekt mitzumachen? http://free-hack.com/konzepte-vorste...king-tool.html
    *Schleichwerbung*

Ähnliche Themen

  1. [C] kernel32.dll!GetProcAddress Finder
    Von blackberry im Forum Sourcecodes
    Antworten: 5
    Letzter Beitrag: 18.05.2010, 00:53

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •