2016-07-06 23 views
0

Ich versuche, die RVA einer Funktion in kernel32.dll zu bekommen, und ich bekam den Offset für das Exportverzeichnis und fügte es mit meiner file_map. Wenn ich jedoch versuche, irgendetwas mit einem der Mitglieder der Struktur PIMAGE_EXPORT_DIRECTORY zu tun, stürzt mein Programm ab. Ich kann nicht einmal überprüfen, ob es ein nullptr ist, ohne dass es abstürzt. Hier ist mein Code:Absturz beim Zugriff auf ein Mitglied der PIMAGE_EXPORT_DIRECTORY Struktur des PE

#include "Sample.h" //Just contains other headers 
#include <dbghelp.h> 
#include <imagehlp.h> 

int main() 
{ 
    char kernel_path[MAX_PATH]; 

    //PIMAGE_DOS_HEADER pDos_hdr = (PIMAGE_DOS_HEADER)GetModuleHandle("kernel32.dll"); 
    //if(pDos_hdr == NULL){printf("Invalid header: %d", (int)GetLastError());} 

    if(GetModuleFileName(GetModuleHandle("kernel32.dll"), kernel_path, MAX_PATH) == 0) 
    { 
     printf("GetModuleFileName failed: %d", (int)GetLastError()); 
     return 1; 
    } 

    HANDLE hFile = CreateFile(kernel_path, GENERIC_READ, FILE_SHARE_READ, 
     NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); 
    if(hFile == INVALID_HANDLE_VALUE){printf("Error getting file handle: 
     %d", (int)GetLastError());return 1;} 

    HANDLE kernel_map = CreateFileMapping(hFile, NULL, 
     PAGE_READONLY|SEC_IMAGE, 0, 256, "KernelMap"); 

    LPVOID file_map = MapViewOfFile(kernel_map, FILE_MAP_READ, 0, 0, 0); 
    if(file_map == 0){printf("Error getting mapped view: %d", 
     (int)GetLastError());return 1;} 

    PIMAGE_DOS_HEADER pDos_hdr = (PIMAGE_DOS_HEADER)file_map; 
    if(pDos_hdr->e_magic == IMAGE_DOS_SIGNATURE){printf("Has MZ signature\n");} 

    PIMAGE_NT_HEADERS pNt_hdr = (PIMAGE_NT_HEADERS)((char*)file_map+pDos_hdr->e_lfanew); 
    if(pNt_hdr->Signature == 0x4550){printf("Has PE signature\n");} 

    IMAGE_OPTIONAL_HEADER opt_hdr = pNt_hdr->OptionalHeader; 
    IMAGE_DATA_DIRECTORY exp_entry = 
     opt_hdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; 
    PIMAGE_EXPORT_DIRECTORY pExp_dir = (PIMAGE_EXPORT_DIRECTORY) 
     (((char*)file_map)+exp_entry.VirtualAddress); 

    // Crashing Code ---> 
    void **func_table = (void**)((char*)file_map+pExp_dir->AddressOfFunctions); 

    return 0; 
} 

Antwort

0

Von msdn, Create :: dwMaximumSizeLow [in] -

Die niedrigen Ordnung DWORD der maximalen Größe des Dateizuordnungsobjekts. Wenn dieser Parameter und dwMaximumSizeHigh 0 (Null) sind, entspricht die maximale Größe von dem Dateizuordnungsobjekt der aktuellen Größe der Datei, die hFile identifiziert.

Sie haben die Größe der Datei nicht dem virtuellen Speicher des aktuellen Prozesses zugeordnet. Dies liegt daran, dass Sie den dwMaximumSizeLow Parameter der CreateFileMapping Funktion (256) begrenzt haben. Sie können dies überprüfen, indem Sie VirtualQuery aufrufen.

HANDLE kernel_map = CreateFileMapping(hFile, NULL, 
PAGE_READONLY|SEC_IMAGE, 0, 0, "KernelMap"); // 5th Param = 0 
+0

Das ist, was ich für einen Blick auf Funktionsdokumentation bekomme. Sehr geschätzt! –

+0

passiert am besten von uns :) – Abhineet