如何正确获取DLL文件内容进行PE解析?

How to properly get contents of DLL file for PE parsing?

我正在尝试获取 kernel32.dll 中函数的 RVA,这意味着我需要使用偏移量在文件中查找不同的结构,直到我可以获得 IMAGE_EXPORT_DIRECTORY 结构。但是,我知道很多获取文件内容的方法和方法,可以解释并保留某些字符和内容,这将使这成为一项几乎不可能完成的任务。所以我想知道将 dll 文件的内容复制到字符数组中的最佳方法。

更新:对于任何感兴趣的人,我创建了一个将 dll 映射到内存的函数。

void* GetFileImage(char path[])
{
    HANDLE hFile = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
    if(hFile == INVALID_HANDLE_VALUE){return NULL;}

    HANDLE file_map = CreateFileMapping(hFile, NULL, PAGE_READONLY|SEC_IMAGE, 0, 0, "KernelMap");
    if(file_map == INVALID_HANDLE_VALUE){return NULL;}

    LPVOID file_image = MapViewOfFile(file_map, FILE_MAP_READ, 0, 0, 0);
    if(file_image == 0){return NULL;}

    return file_image;
}

有多种方法。不过,没有那么多倍数。

1.If你正在尝试解析一个系统加载的文件,比如kernel32.dll,它是在系统启动时加载到内存中的,你可以直接使用GetModuleHandle来获取加载的基地址并开始通过 PE 进行解析(假设您熟悉 PE 结构和 static/delay dll 的加载及其导出)。

2.If 您尝试解析的 dll 不是系统加载的一个,您可以使用 LoadLibrary 加载它们,这将 return 您加载的基地址,因此使您能够解析 PE。

3.You也可以做CreatFileMapping/MapViewOfFile映射自己虚拟内存中的dll来解析

@David Thomas 推荐的 msdn 文章会有很大帮助:: Peering Inside the PE