Unterschiede im Code zwischen Windows 32 Bit und 64 Bit

Ich habe mit dem folgenden Code experimentiert, um GetProcAddress zu simulieren.

// Retrieve NT header from base address.
IMAGE_NT_HEADERS *GetNtHeaderFromBase( void *pBaseAddr )
{
 IMAGE_DOS_HEADER       *pDosHeader;
 IMAGE_NT_HEADERS       *pNtHeaders;

 pDosHeader = ((IMAGE_DOS_HEADER *)pBaseAddr);
 if(pDosHeader->e_magic != 0x5A4D)
  return NULL;

 pNtHeaders = ((IMAGE_NT_HEADERS *)((DWORD)pBaseAddr + pDosHeader->e_lfanew));
 if(pNtHeaders->Signature != 0x4550)
  return NULL;

 return ((pNtHeaders == NULL) ? NULL : pNtHeaders);
}


// This emulates GetProcAddress.
void *GetFuncAddr( DWORD pBaseAddr, char *lpszFuncName ) 
{
 IMAGE_NT_HEADERS       *pNtHeaders;
 IMAGE_DATA_DIRECTORY   *pDataDir;
 IMAGE_EXPORT_DIRECTORY *pExportDir;
 const char      **lpszNames;
 DWORD       *lpdwFuncs, dwIndex;

 pNtHeaders = GetNtHeaderFromBase((void *)pBaseAddr);
 if(pNtHeaders == NULL)
  return NULL;

 pDataDir = ((IMAGE_DATA_DIRECTORY *)(pNtHeaders->OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_EXPORT));
 if(pDataDir == NULL)
  return NULL;

 pExportDir = ((IMAGE_EXPORT_DIRECTORY *)(pBaseAddr + pDataDir->VirtualAddress));
 if(pExportDir == NULL)
  return NULL;

 lpdwFuncs  = ((DWORD *)(pBaseAddr + pExportDir->AddressOfFunctions));
 lpszNames  = ((const char **)(pBaseAddr + pExportDir->AddressOfNames));
 if(lpdwFuncs == NULL || lpszNames == NULL)
  return NULL;

 for(dwIndex = 0; dwIndex < pExportDir->NumberOfFunctions; dwIndex++)
 { 
  // decrypt funcname and get the address
  if(!cmpstr(((char *)(pBaseAddr + lpszNames[dwIndex])), lpszFuncName))
   return (void*)(pBaseAddr + lpdwFuncs[dwIndex]);
 }

 return NULL;
}

Aber wenn ich das Programm unter Windows Vista x64 starte, erhalte ich eine Zugriffsverletzung. Ich dachte, dass es die Zahlen auf GetNtHeaderFromBase waren (die Zahlen, die auf IMAGE_DOS_HEADER und IMAGE_NET_HEADER übergeben wurden), aber ich kann nirgendwo eine Referenz finden, was es auf einer x64-Bit-Binärdatei sein könnte.

Hat jemand eine Idee, welche Änderungen ich an diesem Code vornehmen muss, damit er unter 64-Bit-Windows funktioniert? Oder eine bessere Möglichkeit, eine getprocaddress-ähnliche Funktion zu erzielen, die sowohl auf x32 als auch auf x64 funktioniert?

Vielen Dank für die Hilfe und den Code.

jess.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage